From 748723883a626b499f605d7a5bad92e25b69a0e4 Mon Sep 17 00:00:00 2001 From: Luboš Luňák Date: Thu, 24 Sep 2020 13:34:51 +0200 Subject: Revert "don't split polypolygon in canvas if not needed" (tdf#136933) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the doc from tdf#136933 basegfx::utils::createNonzeroConform() gets called with huge polygons, which is very expensive. Revert this, I'll fix the Skia problem by directly trying to draw the stroked polygon with VCL. This reverts commit b0788ff11481568b413ff6e4c3ea4871984af974. Change-Id: I19b3435811b6ea38d83bea08056802aac76bf45c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103312 Tested-by: Jenkins Reviewed-by: Luboš Luňák --- canvas/source/vcl/canvashelper.cxx | 44 +++++++++++++++----------------------- 1 file changed, 17 insertions(+), 27 deletions(-) (limited to 'canvas/source') diff --git a/canvas/source/vcl/canvashelper.cxx b/canvas/source/vcl/canvashelper.cxx index 2e8476649e3d..a9c9e1eda6d3 100644 --- a/canvas/source/vcl/canvashelper.cxx +++ b/canvas/source/vcl/canvashelper.cxx @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -395,33 +394,24 @@ namespace vclcanvas // user coordinates. aStrokedPolyPoly.transform( aMatrix ); - if(aStrokedPolyPoly.isClosed()) - { - // 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. + + // 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; igetOutDev().DrawPolygon( polygon ); - if( mp2ndOutDevProvider ) - mp2ndOutDevProvider->getOutDev().DrawPolygon( polygon ); - } else { - mpOutDevProvider->getOutDev().DrawPolyLine( polygon ); - if( mp2ndOutDevProvider ) - mp2ndOutDevProvider->getOutDev().DrawPolyLine( polygon ); - } + 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 ); } } } -- cgit