From: adam Date: Sun, 2 May 2004 23:27:22 +0000 (+0000) Subject: freetype curve extraction in Font.java and readback in Box.java X-Git-Tag: 01-July-2005~133 X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=commitdiff_plain;h=5f0b1c28e1c93b3fc14236fa9eb9742aa3304377 freetype curve extraction in Font.java and readback in Box.java darcs-hash:20040502232722-5007d-76c43eeb2ba9d4928a135dbef2f94585ffd3f1e8.gz --- diff --git a/src/org/ibex/core/Box.java b/src/org/ibex/core/Box.java index 2fb9fe6..0e95a7e 100644 --- a/src/org/ibex/core/Box.java +++ b/src/org/ibex/core/Box.java @@ -468,7 +468,13 @@ public final class Box extends JSScope implements Task { case "indexof": return METHOD; case "distanceto": return METHOD; case "text": return text; - case "path": throw new JSExn("cannot read from the path property"); + case "path": + if (path != null) return path.toString(); + if (text == null) return null; + if (font == null) return null; + String ret = ""; + for(int i=0; i 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 }; + int render(int charcode, int size) __attribute__((section(".text"))); int render(int charcode, int size) { int glyph_index; @@ -136,6 +183,17 @@ int render(int charcode, int size) { user_info[4] = (-1 * face->size->metrics.descender) >> 6; user_info[5] = face->glyph->metrics.horiBearingY >> 6; user_info[6] = face->glyph->advance.x >> 6; + + pathlen = 0; current_x = 0; current_y = 0; + FT_Outline_Decompose(&face->glyph->outline, &buildPath, NULL); + path[pathlen++] = 'z'; + path[pathlen++] = ' '; + path[pathlen++] = 'm'; + path[pathlen++] = ' '; + append(0, 0); + path[pathlen++] = ' '; + user_info[7] = (int)&path; + user_info[8] = pathlen; } // Kerning code; add back in later diff --git a/src/org/ibex/graphics/Path.java b/src/org/ibex/graphics/Path.java index 7c0fd40..7557209 100644 --- a/src/org/ibex/graphics/Path.java +++ b/src/org/ibex/graphics/Path.java @@ -37,6 +37,12 @@ public class Path { static final byte TYPE_QUADRADIC = 4; public static Path parse(String s) { return Tokenizer.parse(s); } + + // FIXME: hack + private String toString; + private Path(String s) { this.toString = s; } + public String toString() { return toString; } + public static class Tokenizer { // FIXME: check array bounds exception for improperly terminated string String s; @@ -47,7 +53,7 @@ public class Path { public static Path parse(String s) { if (s == null) return null; Tokenizer t = new Tokenizer(s); - Path ret = new Path(); + Path ret = new Path(s); char last_command = 'M'; boolean first = true; while(t.hasMoreTokens()) {