summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2016-05-31 16:15:21 +0900
committerTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2016-06-08 11:39:22 +0900
commitb2179939dea723ea8695018b03903b9e85121771 (patch)
treef77e3738c3409e238d4b0b440fbd1f649e7dfa52
parent18260a0d9a381a105ffb032ee8f1050c77062102 (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.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()