diff --git a/lib/src/layer/misc/line_patterns/pixel_hiker.dart b/lib/src/layer/misc/line_patterns/pixel_hiker.dart index f0c7baa4c..395b7f34b 100644 --- a/lib/src/layer/misc/line_patterns/pixel_hiker.dart +++ b/lib/src/layer/misc/line_patterns/pixel_hiker.dart @@ -250,12 +250,24 @@ class SolidPixelHiker extends _PixelHiker { patternFit: PatternFit.none, ); - /// Returns all visible segments. - List getAllVisibleSegments() { - final List result = []; - + /// Adds all visible segments to [paths]. + void addAllVisibleSegments(final List paths) { if (offsets.length < 2) { - return result; + return; + } + + double? latestX; + double? latestY; + List polygons = []; + + void addPolygons() { + if (polygons.isEmpty) { + return; + } + for (final path in paths) { + path.addPolygon(polygons, false); + } + polygons = []; } for (int i = 0; i < offsets.length - 1 + (closePath ? 1 : 0); i++) { @@ -264,12 +276,19 @@ class SolidPixelHiker extends _PixelHiker { offsets[(i + 1) % offsets.length], canvasSize, ); - if (visibleSegment != null) { - result.add(visibleSegment); + if (visibleSegment == null) { + continue; } + if (latestX != visibleSegment.begin.dx || + latestY != visibleSegment.begin.dy) { + addPolygons(); + polygons.add(visibleSegment.begin); + } + polygons.add(visibleSegment.end); + latestX = visibleSegment.end.dx; + latestY = visibleSegment.end.dy; } - - return result; + addPolygons(); } @override diff --git a/lib/src/layer/polygon_layer/painter.dart b/lib/src/layer/polygon_layer/painter.dart index c665a6bee..162838659 100644 --- a/lib/src/layer/polygon_layer/painter.dart +++ b/lib/src/layer/polygon_layer/painter.dart @@ -324,10 +324,7 @@ class _PolygonPainter extends CustomPainter { closePath: true, canvasSize: canvasSize, ); - for (final visibleSegment in hiker.getAllVisibleSegments()) { - path.moveTo(visibleSegment.begin.dx, visibleSegment.begin.dy); - path.lineTo(visibleSegment.end.dx, visibleSegment.end.dy); - } + hiker.addAllVisibleSegments([path]); } else if (isDotted) { final DottedPixelHiker hiker = DottedPixelHiker( offsets: offsets, diff --git a/lib/src/layer/polyline_layer/painter.dart b/lib/src/layer/polyline_layer/painter.dart index 58f5e7bac..49ad003d9 100644 --- a/lib/src/layer/polyline_layer/painter.dart +++ b/lib/src/layer/polyline_layer/painter.dart @@ -214,12 +214,7 @@ class _PolylinePainter extends CustomPainter { closePath: false, canvasSize: size, ); - for (final visibleSegment in hiker.getAllVisibleSegments()) { - for (final path in paths) { - path.moveTo(visibleSegment.begin.dx, visibleSegment.begin.dy); - path.lineTo(visibleSegment.end.dx, visibleSegment.end.dy); - } - } + hiker.addAllVisibleSegments(paths); } else if (isDotted) { final DottedPixelHiker hiker = DottedPixelHiker( offsets: offsets,