bool CGUIWindowManager::Render() { /* 参数: 1、 返回: 1、 说明: 1、 */ assert(g_application.IsCurrentThread()); CSingleLock lock(g_graphicsContext); CDirtyRegionList dirtyRegions = m_tracker.GetDirtyRegions(); bool hasRendered = false; // If we visualize the regions we will always render the entire viewport if (g_advancedSettings.m_guiVisualizeDirtyRegions || g_advancedSettings.m_guiAlgorithmDirtyRegions == DIRTYREGION_SOLVER_FILL_VIEWPORT_ALWAYS) { RenderPass(); hasRendered = true; } else if (g_advancedSettings.m_guiAlgorithmDirtyRegions == DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE) { if (dirtyRegions.size() > 0) { RenderPass(); hasRendered = true; } } else { for (CDirtyRegionList::const_iterator i = dirtyRegions.begin(); i != dirtyRegions.end(); i++) { if (i->IsEmpty()) continue; g_graphicsContext.SetScissors(*i); RenderPass(); hasRendered = true; } g_graphicsContext.ResetScissors(); } if (g_advancedSettings.m_guiVisualizeDirtyRegions) { g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); const CDirtyRegionList &markedRegions = m_tracker.GetMarkedRegions(); for (CDirtyRegionList::const_iterator i = markedRegions.begin(); i != markedRegions.end(); i++) CGUITexture::DrawQuad(*i, 0x0fff0000); for (CDirtyRegionList::const_iterator i = dirtyRegions.begin(); i != dirtyRegions.end(); i++) CGUITexture::DrawQuad(*i, 0x4c00ff00); } m_tracker.CleanMarkedRegions(); return hasRendered; }
void CGUIWindowManager::Process(unsigned int currentTime) { assert(g_application.IsCurrentThread()); CSingleLock lock(g_graphicsContext); CDirtyRegionList dirtyregions; CGUIWindow* pWindow = GetWindow(GetActiveWindow()); if (pWindow) pWindow->DoProcess(currentTime, dirtyregions); // process all dialogs - visibility may change etc. for (WindowMap::iterator it = m_mapWindows.begin(); it != m_mapWindows.end(); it++) { CGUIWindow *pWindow = (*it).second; if (pWindow && pWindow->IsDialog()) pWindow->DoProcess(currentTime, dirtyregions); } if (g_application.m_AppActive) { for (CDirtyRegionList::iterator itr = dirtyregions.begin(); itr != dirtyregions.end(); itr++) m_tracker.MarkDirtyRegion(*itr); } }