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