summaryrefslogtreecommitdiff
path: root/vcl/skia
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2021-03-17 16:03:12 +0100
committerLuboš Luňák <l.lunak@collabora.com>2021-03-17 18:01:00 +0100
commitff1cfaf87ce0aa9673e1c3f92308cde6a2c6aa69 (patch)
tree1558cd4414e6bd42dacd10ee62c3395dfb3e3869 /vcl/skia
parentd7ed130f537a81b900c55d222004cc9e88c0b355 (diff)
round polygon points before merging them for Skia drawing (tdf#140848)
basegfx::utils::mergeToSinglePolyPolygon() appears to have rounding problems. Point coordinates are in pixels anyway. Change-Id: I9880cc32f934a08923a5c59278f6aa07852c05f9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112647 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'vcl/skia')
-rw-r--r--vcl/skia/gdiimpl.cxx20
1 files changed, 18 insertions, 2 deletions
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index aa934f1e4942..be31e0ee649a 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -1015,6 +1015,20 @@ bool SkiaSalGraphicsImpl::delayDrawPolyPolygon(const basegfx::B2DPolyPolygon& aP
return true;
}
+// Tdf#140848 - basegfx::utils::mergeToSinglePolyPolygon() seems to have rounding
+// errors that sometimes cause it to merge incorrectly.
+static void roundPolygonPoints(basegfx::B2DPolyPolygon& polyPolygon)
+{
+ for (basegfx::B2DPolygon& polygon : polyPolygon)
+ {
+ polygon.makeUnique();
+ for (sal_uInt32 i = 0; i < polygon.count(); ++i)
+ polygon.setB2DPoint(i, basegfx::B2DPoint(basegfx::fround(polygon.getB2DPoint(i))));
+ // Control points are saved as vectors relative to points, so hopefully
+ // there's no need to round those.
+ }
+}
+
void SkiaSalGraphicsImpl::checkPendingDrawing()
{
if (mLastPolyPolygonInfo.polygons.size() != 0)
@@ -1026,10 +1040,12 @@ void SkiaSalGraphicsImpl::checkPendingDrawing()
if (polygons.size() == 1)
performDrawPolyPolygon(polygons.front(), transparency, true);
else
- // TODO: tdf#136222 shows that basegfx::utils::mergeToSinglePolyPolygon() is unreliable
- // in corner cases, possibly either a bug or rounding errors somewhere.
+ {
+ for (basegfx::B2DPolyPolygon& p : polygons)
+ roundPolygonPoints(p);
performDrawPolyPolygon(basegfx::utils::mergeToSinglePolyPolygon(polygons), transparency,
true);
+ }
}
}