canvas/source/cairo/cairo_canvashelper.cxx | 12 +++++++----- vcl/headless/svpgdi.cxx | 8 +++++--- vcl/unx/generic/gdi/salgdi.cxx | 8 +++++--- vcl/win/gdi/gdiimpl.cxx | 13 ++++++------- 4 files changed, 23 insertions(+), 18 deletions(-)
New commits: commit ffa1c7bc86093b8445656bab1538939b9d3a6d88 Author: Armin Le Grand <armin.le.gr...@cib.de> Date: Thu Jul 21 11:10:53 2016 +0200 tdf#101026 Create more correct replacement control vector Change-Id: I909adaab3dca3c1bac4331b164343cdbc1205df2 Reviewed-on: https://gerrit.libreoffice.org/27365 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Noel Grandin <noelgran...@gmail.com> Reviewed-by: Armin Le Grand <armin.le.gr...@cib.de> diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx index cd9a79e..46f71a1 100644 --- a/canvas/source/cairo/cairo_canvashelper.cxx +++ b/canvas/source/cairo/cairo_canvashelper.cxx @@ -1026,16 +1026,18 @@ namespace cairocanvas // tdf#99165 if the control points are 'empty', create the mathematical // correct replacement ones to avoid problems with the graphical sub-system - if(basegfx::fTools::equal(nAX, nLastX) && basegfx::fTools::equal(nAY, nLastY)) + // tdf#101026 The 1st attempt to create a mathematically correct replacement control + // vector was wrong. Best alternative is one as close as possible which means short. + if (basegfx::fTools::equal(nAX, nLastX) && basegfx::fTools::equal(nAY, nLastY)) { - nAX = nLastX + ((nBX - nLastX) * 0.3); - nAY = nLastY + ((nBY - nLastY) * 0.3); + nAX = nLastX + ((nBX - nLastX) * 0.0005); + nAY = nLastY + ((nBY - nLastY) * 0.0005); } if(basegfx::fTools::equal(nBX, nX) && basegfx::fTools::equal(nBY, nY)) { - nBX = nX + ((nAX - nX) * 0.3); - nBY = nY + ((nAY - nY) * 0.3); + nBX = nX + ((nAX - nX) * 0.0005); + nBY = nY + ((nAY - nY) * 0.0005); } cairo_curve_to( pCairo, nAX, nAY, nBX, nBY, nX, nY ); diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index 7482a68..af26bd1 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -651,14 +651,16 @@ static void AddPolygonToPath(cairo_t* cr, const basegfx::B2DPolygon& rPolygon, b // tdf#99165 if the control points are 'empty', create the mathematical // correct replacement ones to avoid problems with the graphical sub-system - if(aCP1.equal(aLast)) + // tdf#101026 The 1st attempt to create a mathematically correct replacement control + // vector was wrong. Best alternative is one as close as possible which means short. + if (aCP1.equal(aLast)) { - aCP1 = aLast + ((aCP2 - aLast) * 0.3); + aCP1 = aLast + ((aCP2 - aLast) * 0.0005); } if(aCP2.equal(aPoint)) { - aCP2 = aPoint + ((aCP1 - aPoint) * 0.3); + aCP2 = aPoint + ((aCP1 - aPoint) * 0.0005); } cairo_curve_to(cr, aCP1.getX(), aCP1.getY(), aCP2.getX(), aCP2.getY(), diff --git a/vcl/unx/generic/gdi/salgdi.cxx b/vcl/unx/generic/gdi/salgdi.cxx index 66c9e62..72daa71 100644 --- a/vcl/unx/generic/gdi/salgdi.cxx +++ b/vcl/unx/generic/gdi/salgdi.cxx @@ -825,14 +825,16 @@ bool X11SalGraphics::drawPolyLine( // 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)) + // tdf#101026 The 1st attempt to create a mathematically correct replacement control + // vector was wrong. Best alternative is one as close as possible which means short. + if (aStart.equal(aCP1)) { - aCP1 = aStart + ((aCP2 - aStart) * 0.3); + aCP1 = aStart + ((aCP2 - aStart) * 0.0005); } if(aEnd.equal(aCP2)) { - aCP2 = aEnd + ((aCP1 - aEnd) * 0.3); + aCP2 = aEnd + ((aCP1 - aEnd) * 0.0005); } cairo_curve_to(cr, diff --git a/vcl/win/gdi/gdiimpl.cxx b/vcl/win/gdi/gdiimpl.cxx index 09c63f5..9968222 100644 --- a/vcl/win/gdi/gdiimpl.cxx +++ b/vcl/win/gdi/gdiimpl.cxx @@ -1925,19 +1925,18 @@ void impAddB2DPolygonToGDIPlusGraphicsPathReal( // tdf#99165 MS Gdiplus cannot handle creating correct extra geometry for fat lines // with LineCap or LineJoin when a bezier segment starts or ends trivial, e.g. has // no 1st or 2nd control point, despite that these are mathematicaly correct definitions - // (basegfx can handle that). To solve, create replacement vectors to thre resp. next - // control point with 1/3rd of length (the default control vector for these cases). - // Only one of this can happen here, else the is(Next|Prev)ControlPointUsed wopuld have - // both been false. + // (basegfx can handle that). // Caution: This error (and it's correction) might be necessary for other graphical - // sub-systems in a similar way + // sub-systems in a similar way. + // tdf#101026 The 1st attempt to create a mathematically correct replacement control + // vector was wrong. Best alternative is one as close as possible which means short. if(!b1stControlPointUsed) { - aCa = aCurr + ((aCb - aCurr) * 0.3); + aCa = aCurr + ((aCb - aCurr) * 0.0005); } else if(!b2ndControlPointUsed) { - aCb = aNext + ((aCa - aNext) * 0.3); + aCb = aNext + ((aCa - aNext) * 0.0005); } rGraphicsPath.AddBezier( _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits