generateSVGPathForCharacter method

String generateSVGPathForCharacter(
  1. dynamic cIndex
)

Takes a character code and returns an SVG Path string.

Implementation

String generateSVGPathForCharacter(cIndex) {
  var glyphId = -1;
  for (var i = 0; i < tables['glyf'].data['glyphs'].length; i++) {
    if (tables['cmap'].data['characterMap'][i] == cIndex) {
      glyphId = i;
      break;
    }
  }

  if (glyphId == -1) {
    print("Character not found.");
    return "";
  }

  var contours = _contourify(
      tables['glyf'].data['glyphs'][glyphId]['contourData']['points'],
      tables['glyf'].data['glyphs'][glyphId]['endIndices']);

  var path = "";

  for (var k = 0; k < contours.length; k++) {
    var contour = contours[k];

    var interpolated = [];
    for (var i = 0; i < contour.length - 1; i++) {
      interpolated.add(contour[i]);
      if (!contour[i].isOnCurve && !contour[i + 1].isOnCurve) {
        var t = PMContourPoint();
        t.x = (contour[i].x + contour[i + 1].x) / 2;
        t.y = (contour[i].y + contour[i + 1].y) / 2;
        t.isOnCurve = true;
        interpolated.add(t);
      }
    }
    interpolated.add(contour[contour.length - 1]);
    var lastPoint = contour[contour.length - 1];
    if (!lastPoint.isOnCurve) {
      var t = PMContourPoint();
      t.x = (lastPoint.x + contour[0].x) / 2;
      t.y = (lastPoint.y + contour[0].y) / 2;
      t.isOnCurve = true;
      interpolated.add(t);
    }

    var pos = 0;
    for (var i = 0; i < interpolated.length - 1; i++) {
      if (i == 0) {
        path = path + "M${interpolated[i].x},${interpolated[i].y} ";
      } else {
        if (!interpolated[i].isOnCurve) {
          path = path + "Q${interpolated[i].x},${interpolated[i].y},";
          path = path + "${interpolated[i + 1].x},${interpolated[i + 1].y} ";
          i++;
        } else {
          path = path + "L${interpolated[i].x},${interpolated[i].y} ";
        }
      }
      pos = i;
    }
    if ((pos + 1) < interpolated.length) {
      path = path + "L${interpolated[pos + 1].x},${interpolated[pos + 1].y} ";
    }
    path = path + "z ";
  }
  return path;
}