2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "DirtyRegionTracker.h"
11 #include "DirtyRegionSolvers.h"
12 #include "ServiceBroker.h"
13 #include "guilib/DirtyRegion.h"
14 #include "settings/AdvancedSettings.h"
15 #include "settings/SettingsComponent.h"
16 #include "utils/log.h"
21 CDirtyRegionTracker::CDirtyRegionTracker(int buffering
)
23 m_buffering
= buffering
;
27 CDirtyRegionTracker::~CDirtyRegionTracker()
32 void CDirtyRegionTracker::SelectAlgorithm()
36 switch (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_guiAlgorithmDirtyRegions
)
38 case DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE
:
39 CLog::Log(LOGDEBUG
, "guilib: Fill viewport on change for solving rendering passes");
40 m_solver
= new CFillViewportOnChangeRegionSolver();
42 case DIRTYREGION_SOLVER_COST_REDUCTION
:
43 CLog::Log(LOGDEBUG
, "guilib: Cost reduction as algorithm for solving rendering passes");
44 m_solver
= new CGreedyDirtyRegionSolver();
46 case DIRTYREGION_SOLVER_UNION
:
47 m_solver
= new CUnionDirtyRegionSolver();
48 CLog::Log(LOGDEBUG
, "guilib: Union as algorithm for solving rendering passes");
50 case DIRTYREGION_SOLVER_FILL_VIEWPORT_ALWAYS
:
52 CLog::Log(LOGDEBUG
, "guilib: Fill viewport always for solving rendering passes");
53 m_solver
= new CFillViewportAlwaysRegionSolver();
58 void CDirtyRegionTracker::MarkDirtyRegion(const CDirtyRegion
®ion
)
60 if (!region
.IsEmpty())
61 m_markedRegions
.push_back(region
);
64 const CDirtyRegionList
&CDirtyRegionTracker::GetMarkedRegions() const
66 return m_markedRegions
;
69 CDirtyRegionList
CDirtyRegionTracker::GetDirtyRegions()
71 CDirtyRegionList output
;
74 m_solver
->Solve(m_markedRegions
, output
);
79 void CDirtyRegionTracker::CleanMarkedRegions()
81 int buffering
= CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_guiVisualizeDirtyRegions
? 20 : m_buffering
;
82 m_markedRegions
.erase(
83 std::remove_if(m_markedRegions
.begin(), m_markedRegions
.end(),
84 [buffering
](CDirtyRegion
& r
) { return r
.UpdateAge() >= buffering
; }),
85 m_markedRegions
.end());