diff options
-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() |