vcl/headless/svpgdi.cxx | 2 +- vcl/quartz/AquaGraphicsBackend.cxx | 2 +- vcl/skia/gdiimpl.cxx | 29 +++++++++++------------------ 3 files changed, 13 insertions(+), 20 deletions(-)
New commits: commit b9fbe47882b0ab3f7534a189d17c4c852e921b25 Author: Luboš Luňák <[email protected]> AuthorDate: Wed Jan 26 20:07:48 2022 +0100 Commit: Caolán McNamara <[email protected]> CommitDate: Sat Jan 29 18:10:07 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/+/129006 Tested-by: Jenkins Reviewed-by: Luboš Luňák <[email protected]> Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129029 Reviewed-by: Caolán McNamara <[email protected]> diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index ac375c3fadf0..874a5ec4871e 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -1584,7 +1584,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/AquaGraphicsBackend.cxx b/vcl/quartz/AquaGraphicsBackend.cxx index 056d2cd0e32f..140b46ba171c 100644 --- a/vcl/quartz/AquaGraphicsBackend.cxx +++ b/vcl/quartz/AquaGraphicsBackend.cxx @@ -820,7 +820,7 @@ bool AquaGraphicsBackend::drawPolyLine(const basegfx::B2DHomMatrix& rObjectToDev 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 6bb770d51ba0..55fed5b84e72 100644 --- a/vcl/skia/gdiimpl.cxx +++ b/vcl/skia/gdiimpl.cxx @@ -1159,45 +1159,38 @@ bool SkiaSalGraphicsImpl::drawPolyLine(const basegfx::B2DHomMatrix& rObjectToDev aPolyLine = basegfx::utils::snapPointsOfHorizontalOrVerticalEdges(aPolyLine); } - // Setup Line Join - SkPaint::Join eSkLineJoin = SkPaint::kMiter_Join; + SkPaint aPaint = makeLinePaint(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 = makeLinePaint(fTransparency); - aPaint.setStrokeCap(eSkLineCap); - aPaint.setStrokeJoin(eSkLineJoin); - aPaint.setStrokeMiter(fMiterLimit); aPaint.setStrokeWidth(fLineWidth); aPaint.setAntiAlias(mParent.getAntiAlias()); // See the tdf#134346 comment above.
