summaryrefslogtreecommitdiff
path: root/canvas
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2020-08-19 11:10:12 +0200
committerLuboš Luňák <l.lunak@collabora.com>2020-08-19 16:55:37 +0200
commitb0788ff11481568b413ff6e4c3ea4871984af974 (patch)
treeb13f74139ad29bffdada83ceecda92406cfbb525 /canvas
parentb8a34192ddf561561116358fcf198388e4b601c2 (diff)
don't split polypolygon in canvas if not needed (tdf#135395)
Those polygons will be merged back in Skia because of 12147e0322e0fdd1b561c94e7ebd3fdd69ceaac0, which is costly with tdf#135395. And if the only reason for the splitting is that the polygon requires a winding rule but DrawPolyPolygon() uses evenodd rule, then simply convert the polygon to the evenodd rule. Change-Id: Iba5ec31d6d6407f734b20badc80c846071068d40 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100976 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'canvas')
-rw-r--r--canvas/source/vcl/canvashelper.cxx44
1 files changed, 27 insertions, 17 deletions
diff --git a/canvas/source/vcl/canvashelper.cxx b/canvas/source/vcl/canvashelper.cxx
index 78a0ae336b96..fcfabb8e033d 100644
--- a/canvas/source/vcl/canvashelper.cxx
+++ b/canvas/source/vcl/canvashelper.cxx
@@ -25,6 +25,7 @@
#include <basegfx/polygon/b2dlinegeometry.hxx>
#include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <basegfx/range/b2drectangle.hxx>
#include <basegfx/utils/canvastools.hxx>
@@ -394,24 +395,33 @@ namespace vclcanvas
// user coordinates.
aStrokedPolyPoly.transform( aMatrix );
- // TODO(F2): When using alpha here, must handle that via
- // temporary surface or somesuch.
-
- // Note: the generated stroke poly-polygon is NOT free of
- // self-intersections. Therefore, if we would render it
- // via OutDev::DrawPolyPolygon(), on/off fill would
- // generate off areas on those self-intersections.
- for( sal_uInt32 i=0; i<aStrokedPolyPoly.count(); ++i )
+ if(aStrokedPolyPoly.isClosed())
{
- const basegfx::B2DPolygon& polygon = aStrokedPolyPoly.getB2DPolygon( i );
- if( polygon.isClosed()) {
- mpOutDevProvider->getOutDev().DrawPolygon( polygon );
- if( mp2ndOutDevProvider )
- mp2ndOutDevProvider->getOutDev().DrawPolygon( polygon );
- } else {
- mpOutDevProvider->getOutDev().DrawPolyLine( polygon );
- if( mp2ndOutDevProvider )
- mp2ndOutDevProvider->getOutDev().DrawPolyLine( polygon );
+ // Note: the generated stroke poly-polygon is NOT free of
+ // self-intersections. Therefore, if we would render it
+ // directly via OutDev::DrawPolyPolygon(), on/off fill would
+ // generate off areas on those self-intersections.
+ aStrokedPolyPoly = basegfx::utils::createNonzeroConform( aStrokedPolyPoly );
+ mpOutDevProvider->getOutDev().DrawPolyPolygon( aStrokedPolyPoly );
+ if( mp2ndOutDevProvider )
+ mp2ndOutDevProvider->getOutDev().DrawPolyPolygon( aStrokedPolyPoly );
+ }
+ else
+ {
+ // TODO(F2): When using alpha here, must handle that via
+ // temporary surface or somesuch.
+ for( sal_uInt32 i=0; i<aStrokedPolyPoly.count(); ++i )
+ {
+ const basegfx::B2DPolygon& polygon = aStrokedPolyPoly.getB2DPolygon( i );
+ if( polygon.isClosed()) {
+ mpOutDevProvider->getOutDev().DrawPolygon( polygon );
+ if( mp2ndOutDevProvider )
+ mp2ndOutDevProvider->getOutDev().DrawPolygon( polygon );
+ } else {
+ mpOutDevProvider->getOutDev().DrawPolyLine( polygon );
+ if( mp2ndOutDevProvider )
+ mp2ndOutDevProvider->getOutDev().DrawPolyLine( polygon );
+ }
}
}
}