setLineDash function

void setLineDash(
  1. Canvas canvas,
  2. Offset p1,
  3. Offset p2,
  4. Paint paint,
  5. List<double> segments,
)

Implementation

void setLineDash(
    Canvas canvas, Offset p1, Offset p2, Paint paint, List<double> segments) {
  final diffX = (p2.dx - p1.dx);
  final diffY = (p2.dy - p1.dy);
  final distance = sqrt(pow(diffX, 2) + pow(diffY, 2));

  /*
      when array has even length
      [5, 15] => [0, 15]
      when array has odd length
      [5, 15, 16] => [5, 15, 16, 5, 15, 16]
     */
  final _segments =
      segments.length % 2 == 0 ? segments : [...segments, ...segments];
  final generator = _GenOnDemand(_segments);

  int i = 0;
  double beginX = 0;
  double beginY = 0;
  double endX = 0;
  double endY = 0;
  double curPos = 0;
  double lastPos = 0;
  do {
    if (curPos > distance) break;

    //print line every other iteration
    if (i % 2 != 0) {
      double beginWeight = _inverseLerp(0, distance, lastPos);
      double endWeight = _inverseLerp(0, distance, curPos);

      beginX = p1.dx + diffX * beginWeight;
      beginY = p1.dy + diffY * beginWeight;
      endX = p1.dx + diffX * endWeight;
      endY = p1.dy + diffY * endWeight;

      canvas.drawLine(Offset(beginX, beginY), Offset(endX, endY), paint);
    }

    i++;
    lastPos = curPos;
    curPos += generator.next();
  } while (curPos < distance);
}