dashPath function
Builds a dashed copy of source using native Path.computeMetrics.
dashArray is treated as repeating [dash, gap, dash, gap, ...].
dashOffset shifts the dash pattern along the path.
Implementation
Path dashPath(
Path source, {
required List<double> dashArray,
double dashOffset = 0,
}) {
if (dashArray.isEmpty) return source;
var period = 0.0;
for (final value in dashArray) {
period += value;
}
if (period <= 0) return source;
var offset = dashOffset % period;
if (offset < 0) offset += period;
final dest = Path();
for (final metric in source.computeMetrics()) {
var distance = 0.0;
var patternIndex = 0;
var remaining = dashArray[0];
var draw = true;
var toConsume = offset;
while (toConsume > 0) {
if (toConsume >= remaining) {
toConsume -= remaining;
patternIndex = (patternIndex + 1) % dashArray.length;
remaining = dashArray[patternIndex];
draw = !draw;
} else {
remaining -= toConsume;
toConsume = 0;
}
}
while (distance < metric.length) {
final seg = remaining.clamp(0.0, metric.length - distance);
if (draw && seg > 0) {
dest.addPath(metric.extractPath(distance, distance + seg), Offset.zero);
}
distance += seg;
patternIndex = (patternIndex + 1) % dashArray.length;
remaining = dashArray[patternIndex];
draw = !draw;
}
}
return dest;
}