+// if the path is more than 16k chars long, we're screwed anyways...
+static char path[1024 * 16];
+static int pathlen = 0;
+static int current_x;
+static int current_y;
+
+static void append(FT_Pos x, FT_Pos y) {
+ sprintf(path + pathlen, "%d,%d ", x - current_x, y - current_y);
+ pathlen += strlen(path + pathlen);
+}
+static int moveto(FT_Vector* to, void* user) {
+ if (pathlen > 0) {
+ path[pathlen++] = 'z';
+ path[pathlen++] = ' ';
+ }
+ path[pathlen++] = 'm';
+ path[pathlen++] = ' ';
+ append(to->x, to->y);
+ current_x = to->x; current_y = to->y;
+ return 0;
+}
+static int lineto(FT_Vector* to, void* user) {
+ path[pathlen++] = 'l';
+ path[pathlen++] = ' ';
+ append(to->x, to->y);
+ current_x = to->x; current_y = to->y;
+ return 0;
+}
+static int conicto(FT_Vector* control, FT_Vector* to, void* user) {
+ path[pathlen++] = 'q';
+ path[pathlen++] = ' ';
+ append(control->x, control->y);
+ append(to->x, to->y);
+ current_x = to->x; current_y = to->y;
+ return 0;
+}
+static int cubicto(FT_Vector* control1, FT_Vector* control2, FT_Vector* to, void* user) {
+ path[pathlen++] = 'c';
+ path[pathlen++] = ' ';
+ append(control1->x, control1->y);
+ append(control2->x, control2->y);
+ append(to->x, to->y);
+ current_x = to->x; current_y = to->y;
+ return 0;
+}
+static FT_Outline_Funcs buildPath = { &moveto, &lineto, &conicto, &cubicto, 0, 0 };
+