summaryrefslogtreecommitdiff
path: root/canvas
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-08-20 17:27:50 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-08-20 17:38:25 +0100
commit676c9786ff8fac6a6593df51bd9cb3f10854a781 (patch)
tree282f43dd825e9606793b2183b00cbfa026fef71e /canvas
parent44216ddbc620a1c05e98dda1f63ed6df0eae5275 (diff)
Resolves: tdf#86473 approx 1 pixel high rectangular polygon not drawn
The other implementations of basically this in vcl/headless/svpgdi.cxx:AddPolygonToPath and vcl/quartz/salgdicommon.cxx:AddPolygonToPath hook this rounding foo off getAntiAliasB2DDraw FWIW Change-Id: Ideec049ec6ca04105721bf8acda44c31b2a73215
Diffstat (limited to 'canvas')
-rw-r--r--canvas/source/cairo/cairo_canvashelper.cxx22
1 files changed, 21 insertions, 1 deletions
diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx
index def6cd6cfa29..9b64c08a991f 100644
--- a/canvas/source/cairo/cairo_canvashelper.cxx
+++ b/canvas/source/cairo/cairo_canvashelper.cxx
@@ -973,7 +973,27 @@ namespace cairocanvas
if( nPointCount > 1)
{
bool bIsBezier = aPolygon.areControlPointsUsed();
- bool bIsRectangle = ::basegfx::tools::isRectangle( aPolygon );
+ bool bIsRectangle = ::basegfx::tools::isRectangle(aPolygon);
+ if (bIsRectangle)
+ {
+ //tdf#86473, if this rectangle will end up after rounding
+ //to have no area, then nothing will be drawn, so remove
+ //such rectangles from the rounding optimization(?) effort
+ basegfx::B2DRange aRange = ::basegfx::tools::getRange(aPolygon);
+ double x1 = aRange.getMinX();
+ double x2 = aRange.getMaxX();
+ double y1 = aRange.getMinY();
+ double y2 = aRange.getMaxY();
+ cairo_matrix_transform_point(&aOrigMatrix, &x1, &y1);
+ cairo_matrix_transform_point(&aOrigMatrix, &x2, &y2);
+ basegfx::B2DRange aRoundedRange(basegfx::fround(x1),
+ basegfx::fround(y1),
+ basegfx::fround(x2),
+ basegfx::fround(y2));
+ bIsRectangle = aRoundedRange.getWidth() != 0.0 &&
+ aRoundedRange.getHeight() != 0.0;
+ }
+
::basegfx::B2DPoint aA, aB, aP;
for( sal_uInt32 j=0; j < nExtendedPointCount; j++ )