From ea6196f0a51d1bf4cd722468406dcc8c64c7435c Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Fri, 8 Apr 2016 17:03:48 +0900 Subject: tdf#99244 opengl: miter limit for poly lines Change-Id: I1c363a8f1d21bbacab0c5785544aa8becfe39363 --- vcl/opengl/gdiimpl.cxx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 32e085fb4fe1..8b8046f7a5fa 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -39,6 +39,7 @@ #include #include +#include #include @@ -684,6 +685,8 @@ inline glm::vec2 normalize(const glm::vec2& vector) return vector; } +SAL_CONSTEXPR float constMiterMinimumAngle = 15.0f; + } // end anonymous namespace void OpenGLSalGraphicsImpl::DrawLineCap(float x1, float y1, float x2, float y2, css::drawing::LineCap eLineCap, float fLineWidth) @@ -864,6 +867,17 @@ void OpenGLSalGraphicsImpl::DrawPolyLine(const basegfx::B2DPolygon& rPolygon, fl nextLineVector = normalize(p2 - p1); + if (eLineJoin == basegfx::B2DLineJoin::Miter) + { + float angle = glm::atan2(previousLineVector.x * nextLineVector.y - previousLineVector.y * nextLineVector.x, + previousLineVector.x * nextLineVector.x + previousLineVector.y * nextLineVector.y); + + angle = (F_PI - std::fabs(angle)) / F_PI180; + + if (angle < constMiterMinimumAngle) + eLineJoin = basegfx::B2DLineJoin::Bevel; + } + if (eLineJoin == basegfx::B2DLineJoin::Miter) { // With miter join we calculate the extrusion vector by adding normals of -- cgit v1.2.3