dashPath function

Path dashPath(
  1. Path source, {
  2. required List<double> dashArray,
  3. double dashOffset = 0,
})

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;
}