Merge pull request #22816 from CastagnaIT/fix_tx3g
[xbmc.git] / xbmc / guilib / DirtyRegionTracker.cpp
blob398d4550319890f69435237a2068a86ace642e24
1 /*
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.
7 */
9 #include "DirtyRegionTracker.h"
11 #include "DirtyRegionSolvers.h"
12 #include "ServiceBroker.h"
13 #include "settings/AdvancedSettings.h"
14 #include "settings/SettingsComponent.h"
15 #include "utils/log.h"
17 #include <stdio.h>
19 CDirtyRegionTracker::CDirtyRegionTracker(int buffering)
21 m_buffering = buffering;
22 m_solver = NULL;
25 CDirtyRegionTracker::~CDirtyRegionTracker()
27 delete m_solver;
30 void CDirtyRegionTracker::SelectAlgorithm()
32 delete m_solver;
34 switch (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_guiAlgorithmDirtyRegions)
36 case DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE:
37 CLog::Log(LOGDEBUG, "guilib: Fill viewport on change for solving rendering passes");
38 m_solver = new CFillViewportOnChangeRegionSolver();
39 break;
40 case DIRTYREGION_SOLVER_COST_REDUCTION:
41 CLog::Log(LOGDEBUG, "guilib: Cost reduction as algorithm for solving rendering passes");
42 m_solver = new CGreedyDirtyRegionSolver();
43 break;
44 case DIRTYREGION_SOLVER_UNION:
45 m_solver = new CUnionDirtyRegionSolver();
46 CLog::Log(LOGDEBUG, "guilib: Union as algorithm for solving rendering passes");
47 break;
48 case DIRTYREGION_SOLVER_FILL_VIEWPORT_ALWAYS:
49 default:
50 CLog::Log(LOGDEBUG, "guilib: Fill viewport always for solving rendering passes");
51 m_solver = new CFillViewportAlwaysRegionSolver();
52 break;
56 void CDirtyRegionTracker::MarkDirtyRegion(const CDirtyRegion &region)
58 if (!region.IsEmpty())
59 m_markedRegions.push_back(region);
62 const CDirtyRegionList &CDirtyRegionTracker::GetMarkedRegions() const
64 return m_markedRegions;
67 CDirtyRegionList CDirtyRegionTracker::GetDirtyRegions()
69 CDirtyRegionList output;
71 if (m_solver)
72 m_solver->Solve(m_markedRegions, output);
74 return output;
77 void CDirtyRegionTracker::CleanMarkedRegions()
79 int buffering = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_guiVisualizeDirtyRegions ? 20 : m_buffering;
80 int i = m_markedRegions.size() - 1;
81 while (i >= 0)
83 if (m_markedRegions[i].UpdateAge() >= buffering)
84 m_markedRegions.erase(m_markedRegions.begin() + i);
86 i--;