From c36bc1a7a388241580a87b271abfea74af2bf317 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Mon, 24 Jun 2024 00:35:27 +0200 Subject: [PATCH] wg_engine: fix shapes closing Shapes were incorrectly closed in certain cases - the decision to close a shape or not should be based on path commands rather than the number of points and their distances from each other. --- src/renderer/wg_engine/tvgWgGeometry.cpp | 11 ++++------- src/renderer/wg_engine/tvgWgGeometry.h | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/renderer/wg_engine/tvgWgGeometry.cpp b/src/renderer/wg_engine/tvgWgGeometry.cpp index e45e82ec..48749dfb 100644 --- a/src/renderer/wg_engine/tvgWgGeometry.cpp +++ b/src/renderer/wg_engine/tvgWgGeometry.cpp @@ -57,6 +57,7 @@ WgPolyline::WgPolyline() constexpr uint32_t nPoints = 360; pts.reserve(nPoints); dist.reserve(nPoints); + closed = false; } @@ -149,12 +150,7 @@ void WgPolyline::trim(WgPolyline* polyline, float trimBegin, float trimEnd) cons void WgPolyline::close() { if (pts.count > 0) appendPoint(pts[0]); -} - - -bool WgPolyline::isClosed() const -{ - return (pts.count >= 2) && (mathZero(pts[0].dist2(pts.last()))); + closed = true; } @@ -166,6 +162,7 @@ void WgPolyline::clear() // clear points and distances pts.clear(); dist.clear(); + closed = false; } @@ -406,7 +403,7 @@ void WgGeometryData::appendStroke(const WgPolyline* polyline, const RenderStroke ); } } else if (polyline->pts.count > 2) { // multi-lined sub-path - if (polyline->isClosed()) { + if (polyline->closed) { WgPoint v0 = polyline->pts[polyline->pts.count - 2]; WgPoint v1 = polyline->pts[0]; WgPoint v2 = polyline->pts[1]; diff --git a/src/renderer/wg_engine/tvgWgGeometry.h b/src/renderer/wg_engine/tvgWgGeometry.h index 2f294fee..d9ff4c39 100644 --- a/src/renderer/wg_engine/tvgWgGeometry.h +++ b/src/renderer/wg_engine/tvgWgGeometry.h @@ -84,6 +84,7 @@ struct WgPolyline uint32_t imaxy{}; // total polyline length float len{}; + bool closed{}; WgPolyline(); @@ -95,7 +96,6 @@ struct WgPolyline void close(); void clear(); - bool isClosed() const; void getBBox(WgPoint& pmin, WgPoint& pmax) const; };