summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2016-07-01 15:20:00 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2016-07-07 22:32:39 +0200
commitc1f476d91805e6a9573bba3ea8f5f980e0ea7b54 (patch)
tree705b0c4b15d2ddc6db531c951ff0fcb5bedf305b /vcl
parent3dc8ee7d8eec40093af5df3113ef226bc59220ff (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.cxx24
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)