/xbmc/guilib/DirtyRegionSolvers.cpp

http://github.com/xbmc/xbmc · C++ · 73 lines · 53 code · 12 blank · 8 comment · 8 complexity · aa9f740a41ac91d7a91a90cf9c350b7f 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 "DirtyRegionSolvers.h"
  9. #include "windowing/GraphicContext.h"
  10. #include <stdio.h>
  11. void CUnionDirtyRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output)
  12. {
  13. CDirtyRegion unifiedRegion;
  14. for (unsigned int i = 0; i < input.size(); i++)
  15. unifiedRegion.Union(input[i]);
  16. if (!unifiedRegion.IsEmpty())
  17. output.push_back(unifiedRegion);
  18. }
  19. void CFillViewportAlwaysRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output)
  20. {
  21. CDirtyRegion unifiedRegion(CServiceBroker::GetWinSystem()->GetGfxContext().GetViewWindow());
  22. output.push_back(unifiedRegion);
  23. }
  24. void CFillViewportOnChangeRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output)
  25. {
  26. if (!input.empty())
  27. output.assign(1,CDirtyRegion(CServiceBroker::GetWinSystem()->GetGfxContext().GetViewWindow()));
  28. }
  29. CGreedyDirtyRegionSolver::CGreedyDirtyRegionSolver()
  30. {
  31. m_costNewRegion = 10.0f;
  32. m_costPerArea = 0.01f;
  33. }
  34. void CGreedyDirtyRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output)
  35. {
  36. for (unsigned int i = 0; i < input.size(); i++)
  37. {
  38. CDirtyRegion possibleUnionRegion;
  39. int possibleUnionNbr = -1;
  40. float possibleUnionCost = 100000.0f;
  41. CDirtyRegion currentRegion = input[i];
  42. for (unsigned int j = 0; j < output.size(); j++)
  43. {
  44. CDirtyRegion temporaryUnion = output[j];
  45. temporaryUnion.Union(currentRegion);
  46. float temporaryCost = m_costPerArea * (temporaryUnion.Area() - output[j].Area());
  47. if (temporaryCost < possibleUnionCost)
  48. {
  49. //! @todo if the temporaryCost is 0 then we could skip checking the other regions since there exist no better solution
  50. possibleUnionRegion = temporaryUnion;
  51. possibleUnionNbr = j;
  52. possibleUnionCost = temporaryCost;
  53. }
  54. }
  55. float newRegionTotalCost = m_costPerArea * currentRegion.Area() + m_costNewRegion;
  56. if (possibleUnionNbr >= 0 && possibleUnionCost < newRegionTotalCost)
  57. output[possibleUnionNbr] = possibleUnionRegion;
  58. else
  59. output.push_back(currentRegion);
  60. }
  61. }