diff options
author | Tor Andersson <tor@ghostscript.com> | 2010-04-08 14:22:30 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2010-04-08 14:22:30 +0200 |
commit | e32122e047e5882f3ca64d86cc0562473360b329 (patch) | |
tree | 66bdca83942ada8463097cda5902800948c7a6e5 /fitz/res_text.c | |
parent | fc0c17314f40e758e19de549be5b506f93cea2b9 (diff) | |
download | mupdf-e32122e047e5882f3ca64d86cc0562473360b329.tar.xz |
Rename the old path and text node files.
Diffstat (limited to 'fitz/res_text.c')
-rw-r--r-- | fitz/res_text.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/fitz/res_text.c b/fitz/res_text.c new file mode 100644 index 00000000..a21cb3fc --- /dev/null +++ b/fitz/res_text.c @@ -0,0 +1,111 @@ +#include "fitz.h" + +fz_text * +fz_newtext(fz_font *font) +{ + fz_text *text; + + text = fz_malloc(sizeof(fz_text)); + text->font = fz_keepfont(font); + text->trm = fz_identity(); + text->ctm = fz_identity(); + text->len = 0; + text->cap = 0; + text->els = nil; + + return text; +} + +void +fz_freetext(fz_text *text) +{ + fz_dropfont(text->font); + fz_free(text->els); + fz_free(text); +} + +fz_rect +fz_boundtext(fz_text *text, fz_matrix ctm) +{ + fz_matrix trm; + fz_rect bbox; + fz_rect fbox; + int i; + + if (text->len == 0) + return fz_emptyrect; + + /* find bbox of glyph origins in ctm space */ + + bbox.x0 = bbox.x1 = text->els[0].x; + bbox.y0 = bbox.y1 = text->els[0].y; + + for (i = 1; i < text->len; i++) + { + bbox.x0 = MIN(bbox.x0, text->els[i].x); + bbox.y0 = MIN(bbox.y0, text->els[i].y); + bbox.x1 = MAX(bbox.x1, text->els[i].x); + bbox.y1 = MAX(bbox.y1, text->els[i].y); + } + + bbox = fz_transformaabb(ctm, bbox); + + /* find bbox of font in trm * ctm space */ + + trm = fz_concat(text->trm, ctm); + trm.e = 0; + trm.f = 0; + + fbox.x0 = text->font->bbox.x0 * 0.001; + fbox.y0 = text->font->bbox.y0 * 0.001; + fbox.x1 = text->font->bbox.x1 * 0.001; + fbox.y1 = text->font->bbox.y1 * 0.001; + + fbox = fz_transformaabb(trm, fbox); + + /* expand glyph origin bbox by font bbox */ + + bbox.x0 += fbox.x0; + bbox.y0 += fbox.y0; + bbox.x1 += fbox.x1; + bbox.y1 += fbox.y1; + + return bbox; +} + +static void +growtext(fz_text *text, int n) +{ + if (text->len + n < text->cap) + return; + while (text->len + n > text->cap) + text->cap = text->cap + 36; + text->els = fz_realloc(text->els, sizeof (fz_textel) * text->cap); +} + +void +fz_addtext(fz_text *text, int gid, int ucs, float x, float y) +{ + growtext(text, 1); + text->els[text->len].ucs = ucs; + text->els[text->len].gid = gid; + text->els[text->len].x = x; + text->els[text->len].y = y; + text->len++; +} + +void fz_debugtext(fz_text *text, int indent) +{ + int i, n; + for (i = 0; i < text->len; i++) + { + for (n = 0; n < indent; n++) + putchar(' '); + if (text->els[i].ucs >= 32 && text->els[i].ucs < 128) + printf("<g ucs=\"%c\" gid=%d x=\"%g\" y=\"%g\" />\n", + text->els[i].ucs, text->els[i].gid, text->els[i].x, text->els[i].y); + else + printf("<g ucs=\"U+%04X\" gid=%d x=\"%g\" y=\"%g\" />\n", + text->els[i].ucs, text->els[i].gid, text->els[i].x, text->els[i].y); + } +} |