/xbmc/guilib/DirtyRegionTracker.cpp

http://github.com/xbmc/xbmc · C++ · 88 lines · 67 code · 14 blank · 7 comment · 5 complexity · a9ab3010f5f45d34c82f33da5e930ba7 MD5 · raw file

  1. /*
  2. * Copyright (C) 2005-2018 Team Kodi
  3. * This file is part of Kodi - https://kodi.tv
  4. *
  5. * SPDX-License-Identifier: GPL-2.0-or-later
  6. * See LICENSES/README.md for more information.
  7. */
  8. #include "DirtyRegionTracker.h"
  9. #include "DirtyRegionSolvers.h"
  10. #include "ServiceBroker.h"
  11. #include "settings/AdvancedSettings.h"
  12. #include "settings/SettingsComponent.h"
  13. #include "utils/log.h"
  14. #include <stdio.h>
  15. CDirtyRegionTracker::CDirtyRegionTracker(int buffering)
  16. {
  17. m_buffering = buffering;
  18. m_solver = NULL;
  19. }
  20. CDirtyRegionTracker::~CDirtyRegionTracker()
  21. {
  22. delete m_solver;
  23. }
  24. void CDirtyRegionTracker::SelectAlgorithm()
  25. {
  26. delete m_solver;
  27. switch (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_guiAlgorithmDirtyRegions)
  28. {
  29. case DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE:
  30. CLog::Log(LOGDEBUG, "guilib: Fill viewport on change for solving rendering passes");
  31. m_solver = new CFillViewportOnChangeRegionSolver();
  32. break;
  33. case DIRTYREGION_SOLVER_COST_REDUCTION:
  34. CLog::Log(LOGDEBUG, "guilib: Cost reduction as algorithm for solving rendering passes");
  35. m_solver = new CGreedyDirtyRegionSolver();
  36. break;
  37. case DIRTYREGION_SOLVER_UNION:
  38. m_solver = new CUnionDirtyRegionSolver();
  39. CLog::Log(LOGDEBUG, "guilib: Union as algorithm for solving rendering passes");
  40. break;
  41. case DIRTYREGION_SOLVER_FILL_VIEWPORT_ALWAYS:
  42. default:
  43. CLog::Log(LOGDEBUG, "guilib: Fill viewport always for solving rendering passes");
  44. m_solver = new CFillViewportAlwaysRegionSolver();
  45. break;
  46. }
  47. }
  48. void CDirtyRegionTracker::MarkDirtyRegion(const CDirtyRegion &region)
  49. {
  50. if (!region.IsEmpty())
  51. m_markedRegions.push_back(region);
  52. }
  53. const CDirtyRegionList &CDirtyRegionTracker::GetMarkedRegions() const
  54. {
  55. return m_markedRegions;
  56. }
  57. CDirtyRegionList CDirtyRegionTracker::GetDirtyRegions()
  58. {
  59. CDirtyRegionList output;
  60. if (m_solver)
  61. m_solver->Solve(m_markedRegions, output);
  62. return output;
  63. }
  64. void CDirtyRegionTracker::CleanMarkedRegions()
  65. {
  66. int buffering = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_guiVisualizeDirtyRegions ? 20 : m_buffering;
  67. int i = m_markedRegions.size() - 1;
  68. while (i >= 0)
  69. {
  70. if (m_markedRegions[i].UpdateAge() >= buffering)
  71. m_markedRegions.erase(m_markedRegions.begin() + i);
  72. i--;
  73. }
  74. }