summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/inc/opengl/RenderList.hxx51
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()