void CGreedyDirtyRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output) { for (unsigned int i = 0; i < input.size(); i++) { CDirtyRegion possibleUnionRegion; int possibleUnionNbr = -1; float possibleUnionCost = 100000.0f; CDirtyRegion currentRegion = input[i]; for (unsigned int j = 0; j < output.size(); j++) { CDirtyRegion temporaryUnion = output[j]; temporaryUnion.Union(currentRegion); float temporaryCost = m_costPerArea * (temporaryUnion.Area() - output[j].Area()); if (temporaryCost < possibleUnionCost) { // TODO if the temporaryCost is 0 then we could skip checking the other regions since there exist no better solution possibleUnionRegion = temporaryUnion; possibleUnionNbr = j; possibleUnionCost = temporaryCost; } } float newRegionTotalCost = m_costPerArea * currentRegion.Area() + m_costNewRegion; if (possibleUnionNbr >= 0 && possibleUnionCost < newRegionTotalCost) output[possibleUnionNbr] = possibleUnionRegion; else output.push_back(currentRegion); } }
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 CUnionDirtyRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output) { CDirtyRegion unifiedRegion; for (unsigned int i = 0; i < input.size(); i++) unifiedRegion.Union(input[i]); if (!unifiedRegion.IsEmpty()) output.push_back(unifiedRegion); }
void CGUIControlGroup::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { CPoint pos(GetPosition()); g_graphicsContext.SetOrigin(pos.x, pos.y); CRect rect; for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl *control = *it; control->UpdateVisibility(); unsigned int oldDirty = dirtyregions.size(); control->DoProcess(currentTime, dirtyregions); if (control->IsVisible() || (oldDirty != dirtyregions.size())) // visible or dirty (was visible?) rect.Union(control->GetRenderRegion()); } g_graphicsContext.RestoreOrigin(); CGUIControl::Process(currentTime, dirtyregions); m_renderRegion = rect; }
void CGUIListGroup::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { CServiceBroker::GetWinSystem()->GetGfxContext().SetOrigin(m_posX, m_posY); CRect rect; for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl *control = *it; control->UpdateVisibility(m_item); unsigned int oldDirty = dirtyregions.size(); control->DoProcess(currentTime, dirtyregions); if (control->IsVisible() || (oldDirty != dirtyregions.size())) // visible or dirty (was visible?) rect.Union(control->GetRenderRegion()); } CServiceBroker::GetWinSystem()->GetGfxContext().RestoreOrigin(); CGUIControl::Process(currentTime, dirtyregions); m_renderRegion = rect; m_item = NULL; }
void CFillViewportOnChangeRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output) { if (input.size() > 0) output.assign(1,g_graphicsContext.GetViewWindow()); }