summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2022-01-26 20:07:48 +0100
committerLuboš Luňák <l.lunak@collabora.com>2022-01-26 21:36:45 +0100
commit534fc16a9f8cd01bb88485e2cf6b9cd33aed3745 (patch)
tree60d3d8411bfdcf051525f3dc9a1a68d8c314d868 /vcl
parent60c30241ecb0caeab077a7fb7215442405c42506 (diff)
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 <l.lunak@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/headless/CairoCommon.cxx2
-rw-r--r--vcl/quartz/AquaGraphicsBackend.cxx2
-rw-r--r--vcl/skia/gdiimpl.cxx29
3 files changed, 13 insertions, 20 deletions
diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx
index d77b35d55781..b497e1716f8a 100644
--- a/vcl/headless/CairoCommon.cxx
+++ b/vcl/headless/CairoCommon.cxx
@@ -675,7 +675,7 @@ bool CairoCommon::drawPolyLine(cairo_t* cr, basegfx::B2DRange* pExtents, const C
}
// 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 fdcbae1e3870..690cbf78ae9c 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 930865591ac7..c2efb62f96dc 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -1045,45 +1045,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.