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