vcl/headless/svpgdi.cxx | 2 +- vcl/quartz/salgdicommon.cxx | 2 +- vcl/skia/gdiimpl.cxx | 31 ++++++++++++------------------- 3 files changed, 14 insertions(+), 21 deletions(-)
New commits: commit 109c8fe6d2ad01df46fb39bfc7bfca063fcb722e Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Wed Jan 26 20:07:48 2022 +0100 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Fri Jan 28 11:10:08 2022 +0100 make sure to not divide by zero when computing miter limit The minimal angle is valid only if the line join style is miter, and e.g. FileDefinitionWidgetDraw can call these with round join style and 0 angle, which would divide by 0. So either clamp the value or compute it only when needed. Change-Id: I2a2c71481490c03ec6d01b8e33cab991400adb35 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129010 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@collabora.com> diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index 56010ff7ca14..747f47f6c659 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -1588,7 +1588,7 @@ bool SvpSalGraphics::drawPolyLine( } // convert miter minimum angle to miter limit - double fMiterLimit = 1.0 / sin( fMiterMinimumAngle / 2.0); + double fMiterLimit = 1.0 / sin(std::min(fMiterMinimumAngle, 0.01 * M_PI) / 2.0); // setup cap attribute cairo_line_cap_t eCairoLineCap(CAIRO_LINE_CAP_BUTT); diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx index e393659658d6..2d600c09b4b5 100644 --- a/vcl/quartz/salgdicommon.cxx +++ b/vcl/quartz/salgdicommon.cxx @@ -597,7 +597,7 @@ bool AquaSalGraphics::drawPolyLine( case basegfx::B2DLineJoin::Round: aCGLineJoin = kCGLineJoinRound; break; } // convert miter minimum angle to miter limit - CGFloat fCGMiterLimit = 1.0 / sin(fMiterMinimumAngle / 2.0); + CGFloat fCGMiterLimit = 1.0 / sin(std::min(fMiterMinimumAngle, 0.01 * M_PI) / 2.0); // setup cap attribute CGLineCap aCGLineCap(kCGLineCapButt); diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx index ba9737c6544c..eedae6c000cf 100644 --- a/vcl/skia/gdiimpl.cxx +++ b/vcl/skia/gdiimpl.cxx @@ -1077,47 +1077,40 @@ bool SkiaSalGraphicsImpl::drawPolyLine(const basegfx::B2DHomMatrix& rObjectToDev aPolyPolygonLine = basegfx::utils::snapPointsOfHorizontalOrVerticalEdges(aPolyPolygonLine); } - // Setup Line Join - SkPaint::Join eSkLineJoin = SkPaint::kMiter_Join; + SkPaint aPaint; + aPaint.setColor(toSkColorWithTransparency(mLineColor, fTransparency)); + switch (eLineJoin) { case basegfx::B2DLineJoin::Bevel: - eSkLineJoin = SkPaint::kBevel_Join; + aPaint.setStrokeJoin(SkPaint::kBevel_Join); break; case basegfx::B2DLineJoin::Round: - eSkLineJoin = SkPaint::kRound_Join; + aPaint.setStrokeJoin(SkPaint::kRound_Join); break; case basegfx::B2DLineJoin::NONE: + break; case basegfx::B2DLineJoin::Miter: - eSkLineJoin = SkPaint::kMiter_Join; + aPaint.setStrokeJoin(SkPaint::kMiter_Join); + // convert miter minimum angle to miter limit + aPaint.setStrokeMiter(1.0 / std::sin(fMiterMinimumAngle / 2.0)); break; } - // convert miter minimum angle to miter limit - double fMiterLimit = 1.0 / std::sin(fMiterMinimumAngle / 2.0); - - // Setup Line Cap - SkPaint::Cap eSkLineCap(SkPaint::kButt_Cap); - switch (eLineCap) { case css::drawing::LineCap_ROUND: - eSkLineCap = SkPaint::kRound_Cap; + aPaint.setStrokeCap(SkPaint::kRound_Cap); break; case css::drawing::LineCap_SQUARE: - eSkLineCap = SkPaint::kSquare_Cap; + aPaint.setStrokeCap(SkPaint::kSquare_Cap); break; default: // css::drawing::LineCap_BUTT: - eSkLineCap = SkPaint::kButt_Cap; + aPaint.setStrokeCap(SkPaint::kButt_Cap); break; } - SkPaint aPaint; aPaint.setStyle(SkPaint::kStroke_Style); - aPaint.setStrokeCap(eSkLineCap); - aPaint.setStrokeJoin(eSkLineJoin); - aPaint.setColor(toSkColorWithTransparency(mLineColor, fTransparency)); - aPaint.setStrokeMiter(fMiterLimit); aPaint.setStrokeWidth(fLineWidth); aPaint.setAntiAlias(mParent.getAntiAlias()); // See the tdf#134346 comment above.