buildDPath method

Path buildDPath(
  1. String argD, {
  2. Path? path,
})

Implementation

Path buildDPath(String argD, {Path? path}) {
  if (videoItem.pathCache[argD] != null) {
    return videoItem.pathCache[argD]!;
  }
  path ??= Path();
  final d = argD.replaceAllMapped(RegExp('([a-df-zA-Z])'), (match) {
    return "|||${match.group(1)} ";
  }).replaceAll(RegExp(","), " ");
  var currentPointX = 0.0;
  var currentPointY = 0.0;
  double? currentPointX1;
  double? currentPointY1;
  double? currentPointX2;
  double? currentPointY2;
  d.split("|||").forEach((segment) {
    if (segment.isEmpty) {
      return;
    }
    final firstLetter = segment.substring(0, 1);
    if (_validMethods.contains(firstLetter)) {
      final args = segment.substring(1).trim().split(" ");
      if (firstLetter == "M") {
        currentPointX = double.parse(args[0]);
        currentPointY = double.parse(args[1]);
        path!.moveTo(currentPointX, currentPointY);
      } else if (firstLetter == "m") {
        currentPointX += double.parse(args[0]);
        currentPointY += double.parse(args[1]);
        path!.moveTo(currentPointX, currentPointY);
      } else if (firstLetter == "L") {
        currentPointX = double.parse(args[0]);
        currentPointY = double.parse(args[1]);
        path!.lineTo(currentPointX, currentPointY);
      } else if (firstLetter == "l") {
        currentPointX += double.parse(args[0]);
        currentPointY += double.parse(args[1]);
        path!.lineTo(currentPointX, currentPointY);
      } else if (firstLetter == "H") {
        currentPointX = double.parse(args[0]);
        path!.lineTo(currentPointX, currentPointY);
      } else if (firstLetter == "h") {
        currentPointX += double.parse(args[0]);
        path!.lineTo(currentPointX, currentPointY);
      } else if (firstLetter == "V") {
        currentPointY = double.parse(args[0]);
        path!.lineTo(currentPointX, currentPointY);
      } else if (firstLetter == "v") {
        currentPointY += double.parse(args[0]);
        path!.lineTo(currentPointX, currentPointY);
      } else if (firstLetter == "C") {
        currentPointX1 = double.parse(args[0]);
        currentPointY1 = double.parse(args[1]);
        currentPointX2 = double.parse(args[2]);
        currentPointY2 = double.parse(args[3]);
        currentPointX = double.parse(args[4]);
        currentPointY = double.parse(args[5]);
        path!.cubicTo(
          currentPointX1!,
          currentPointY1!,
          currentPointX2!,
          currentPointY2!,
          currentPointX,
          currentPointY,
        );
      } else if (firstLetter == "c") {
        currentPointX1 = currentPointX + double.parse(args[0]);
        currentPointY1 = currentPointY + double.parse(args[1]);
        currentPointX2 = currentPointX + double.parse(args[2]);
        currentPointY2 = currentPointY + double.parse(args[3]);
        currentPointX += double.parse(args[4]);
        currentPointY += double.parse(args[5]);
        path!.cubicTo(
          currentPointX1!,
          currentPointY1!,
          currentPointX2!,
          currentPointY2!,
          currentPointX,
          currentPointY,
        );
      } else if (firstLetter == "S") {
        if (currentPointX1 != null &&
            currentPointY1 != null &&
            currentPointX2 != null &&
            currentPointY2 != null) {
          currentPointX1 = currentPointX - currentPointX2! + currentPointX;
          currentPointY1 = currentPointY - currentPointY2! + currentPointY;
          currentPointX2 = double.parse(args[0]);
          currentPointY2 = double.parse(args[1]);
          currentPointX = double.parse(args[2]);
          currentPointY = double.parse(args[3]);
          path!.cubicTo(
            currentPointX1!,
            currentPointY1!,
            currentPointX2!,
            currentPointY2!,
            currentPointX,
            currentPointY,
          );
        } else {
          currentPointX1 = double.parse(args[0]);
          currentPointY1 = double.parse(args[1]);
          currentPointX = double.parse(args[2]);
          currentPointY = double.parse(args[3]);
          path!.quadraticBezierTo(
              currentPointX1!, currentPointY1!, currentPointX, currentPointY);
        }
      } else if (firstLetter == "s") {
        if (currentPointX1 != null &&
            currentPointY1 != null &&
            currentPointX2 != null &&
            currentPointY2 != null) {
          currentPointX1 = currentPointX - currentPointX2! + currentPointX;
          currentPointY1 = currentPointY - currentPointY2! + currentPointY;
          currentPointX2 = currentPointX + double.parse(args[0]);
          currentPointY2 = currentPointY + double.parse(args[1]);
          currentPointX += double.parse(args[2]);
          currentPointY += double.parse(args[3]);
          path!.cubicTo(
            currentPointX1!,
            currentPointY1!,
            currentPointX2!,
            currentPointY2!,
            currentPointX,
            currentPointY,
          );
        } else {
          currentPointX1 = currentPointX + double.parse(args[0]);
          currentPointY1 = currentPointY + double.parse(args[1]);
          currentPointX += double.parse(args[2]);
          currentPointY += double.parse(args[3]);
          path!.quadraticBezierTo(
            currentPointX1!,
            currentPointY1!,
            currentPointX,
            currentPointY,
          );
        }
      } else if (firstLetter == "Q") {
        currentPointX1 = double.parse(args[0]);
        currentPointY1 = double.parse(args[1]);
        currentPointX = double.parse(args[2]);
        currentPointY = double.parse(args[3]);
        path!.quadraticBezierTo(
            currentPointX1!, currentPointY1!, currentPointX, currentPointY);
      } else if (firstLetter == "q") {
        currentPointX1 = currentPointX + double.parse(args[0]);
        currentPointY1 = currentPointY + double.parse(args[1]);
        currentPointX += double.parse(args[2]);
        currentPointY += double.parse(args[3]);
        path!.quadraticBezierTo(
          currentPointX1!,
          currentPointY1!,
          currentPointX,
          currentPointY,
        );
      } else if (firstLetter == "Z" || firstLetter == "z") {
        path!.close();
      }
    }
    videoItem.pathCache[argD] = path!;
  });
  return path;
}