Skip to content

Commit

Permalink
feat: optimization of "solid" polygon/polyline display
Browse files Browse the repository at this point in the history
Impacted files:
* `polygon_layer/painter.dart`: minor refactoring
* `polyline_layer/painter.dart`: minor refactoring
* `pixel_hiker.dart`: optimized the "solid pixel hiker" relying on `addPolygon` instead of numerous `moveTo`/`lineTo`
  • Loading branch information
monsieurtanuki committed May 7, 2024
1 parent 3e8cd97 commit e4a19e5
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 19 deletions.
37 changes: 28 additions & 9 deletions lib/src/layer/misc/line_patterns/pixel_hiker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -250,12 +250,24 @@ class SolidPixelHiker extends _PixelHiker {
patternFit: PatternFit.none,
);

/// Returns all visible segments.
List<VisibleSegment> getAllVisibleSegments() {
final List<VisibleSegment> result = [];

/// Adds all visible segments to [paths].
void addAllVisibleSegments(final List<Path> paths) {
if (offsets.length < 2) {
return result;
return;
}

double? latestX;
double? latestY;
List<Offset> 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++) {
Expand All @@ -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
Expand Down
5 changes: 1 addition & 4 deletions lib/src/layer/polygon_layer/painter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -324,10 +324,7 @@ class _PolygonPainter<R extends Object> 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,
Expand Down
7 changes: 1 addition & 6 deletions lib/src/layer/polyline_layer/painter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -214,12 +214,7 @@ class _PolylinePainter<R extends Object> 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,
Expand Down

0 comments on commit e4a19e5

Please sign in to comment.