diff options
author | Armin Le Grand <Armin.Le.Grand@cib.de> | 2016-07-01 15:20:00 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2016-07-07 22:32:39 +0200 |
commit | c1f476d91805e6a9573bba3ea8f5f980e0ea7b54 (patch) | |
tree | 705b0c4b15d2ddc6db531c951ff0fcb5bedf305b /vcl | |
parent | 3dc8ee7d8eec40093af5df3113ef226bc59220ff (diff) |
tdf#99165 avoid passing empty control points for beziers
Some graphic sub systems have problems to create correct
geometry for fat line drawing when 'empty' control points
are handed over for bezier curves. Avoid this by offering the
mathematical correct default in that cases.
Change-Id: I20f484ef4537076889d832d83581844690514acc
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/unx/generic/gdi/salgdi.cxx | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/vcl/unx/generic/gdi/salgdi.cxx b/vcl/unx/generic/gdi/salgdi.cxx index bb4394ed6e68..ea966b41a346 100644 --- a/vcl/unx/generic/gdi/salgdi.cxx +++ b/vcl/unx/generic/gdi/salgdi.cxx @@ -794,6 +794,7 @@ bool X11SalGraphics::drawPolyLine( const bool bSnapPoints(!getAntiAliasB2DDraw()); static basegfx::B2DHomMatrix aHalfPointTransform(basegfx::tools::createTranslateB2DHomMatrix(0.5, 0.5)); basegfx::B2DCubicBezier aEdge; + basegfx::B2DPoint aStart; for(sal_uInt32 i = 0; i < nEdgeCount; ++i) { @@ -808,7 +809,7 @@ bool X11SalGraphics::drawPolyLine( if(!i || bNoJoin) { - const basegfx::B2DPoint aStart(aEdge.getStartPoint()); + aStart = aEdge.getStartPoint(); cairo_move_to(cr, aStart.getX(), aStart.getY()); } @@ -816,8 +817,23 @@ bool X11SalGraphics::drawPolyLine( if(aEdge.isBezier()) { - const basegfx::B2DPoint aCP1(aEdge.getControlPointA()); - const basegfx::B2DPoint aCP2(aEdge.getControlPointB()); + basegfx::B2DPoint aCP1(aEdge.getControlPointA()); + basegfx::B2DPoint aCP2(aEdge.getControlPointB()); + + // tdf#99165 cairo has problems in creating the evtl. needed + // miter graphics (and maybe others) when empty control points + // are used, so fallback to the mathematical 'default' control + // points in that case + if(aStart.equal(aCP1)) + { + aCP1 = aStart + ((aCP2 - aStart) * 0.3); + } + + if(aEnd.equal(aCP2)) + { + aCP2 = aEnd + ((aCP1 - aEnd) * 0.3); + } + cairo_curve_to(cr, aCP1.getX(), aCP1.getY(), aCP2.getX(), aCP2.getY(), @@ -827,6 +843,8 @@ bool X11SalGraphics::drawPolyLine( { cairo_line_to(cr, aEnd.getX(), aEnd.getY()); } + + aStart = aEnd; } if(rPolygon.isClosed() && !bNoJoin) |