diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2016-05-31 16:15:21 +0900 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2016-06-08 11:39:22 +0900 |
commit | b2179939dea723ea8695018b03903b9e85121771 (patch) | |
tree | f77e3738c3409e238d4b0b440fbd1f649e7dfa52 | |
parent | 18260a0d9a381a105ffb032ee8f1050c77062102 (diff) |
opengl: improve overlap tracking
Insteado of tracking the overlap with only one rectangle use more
rectangles and add elements to the rectangle that increases the
combined area the least. If a new entry overlaps with at least
on rectangle then create a new list. Current limit the number of
rectangles to 30.
Change-Id: I3db619afc1fdd98fe7314c930e909bf2c93d7b2c
-rw-r--r-- | vcl/inc/opengl/RenderList.hxx | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/vcl/inc/opengl/RenderList.hxx b/vcl/inc/opengl/RenderList.hxx index 32ece7360b21..e63f5dcb4566 100644 --- a/vcl/inc/opengl/RenderList.hxx +++ b/vcl/inc/opengl/RenderList.hxx @@ -38,6 +38,8 @@ struct RenderTextureParameters struct RenderEntry { + basegfx::B2DRange maOverlapTrackingRectangle; + RenderParameters maTriangleParameters; RenderParameters maLineParameters; RenderParameters maLineAAParameters; @@ -68,19 +70,59 @@ struct RenderEntry class RenderList { private: - basegfx::B2DRange maOverlapTrackingRectangle; std::vector<RenderEntry> maRenderEntries; + std::vector<basegfx::B2DRange> maRectangles; + + bool doesOverlap(const basegfx::B2DRange& rDrawRectangle) + { + if (!maRenderEntries.back().maOverlapTrackingRectangle.overlaps(rDrawRectangle)) + return false; + + for (const basegfx::B2DRange& rRectangle : maRectangles) + { + if (rRectangle.overlaps(rDrawRectangle)) + return true; + } + return false; + } void checkOverlapping(const basegfx::B2DRange& rDrawRectangle) { - if (maRenderEntries.empty() || maOverlapTrackingRectangle.overlaps(rDrawRectangle)) + if (maRenderEntries.empty() || doesOverlap(rDrawRectangle)) { maRenderEntries.resize(maRenderEntries.size() + 1); - maOverlapTrackingRectangle = rDrawRectangle; + maRenderEntries.back().maOverlapTrackingRectangle = rDrawRectangle; + + maRectangles.clear(); + maRectangles.reserve(30); + maRectangles.push_back(rDrawRectangle); } else { - maOverlapTrackingRectangle.expand(rDrawRectangle); + maRenderEntries.back().maOverlapTrackingRectangle.expand(rDrawRectangle); + + if (maRectangles.size() < 30) + { + maRectangles.push_back(rDrawRectangle); + } + else + { + basegfx::B2DRange aTempRectangle(maRectangles[0]); + aTempRectangle.expand(rDrawRectangle); + double minArea = aTempRectangle.getWidth() * aTempRectangle.getHeight(); + size_t index = 0; + + double area; + for (size_t i = 1; i < maRectangles.size(); ++i) + { + aTempRectangle = basegfx::B2DRange(maRectangles[i]); + aTempRectangle.expand(rDrawRectangle); + area = aTempRectangle.getWidth() * aTempRectangle.getHeight(); + if (area < minArea) + index = i; + } + maRectangles[index].expand(rDrawRectangle); + } } } @@ -96,7 +138,6 @@ public: void clear() { maRenderEntries.clear(); - maOverlapTrackingRectangle.reset(); } std::vector<RenderEntry>& getEntries() |