summaryrefslogtreecommitdiff
path: root/fitz/res_text.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-04-08 14:22:30 +0200
committerTor Andersson <tor@ghostscript.com>2010-04-08 14:22:30 +0200
commite32122e047e5882f3ca64d86cc0562473360b329 (patch)
tree66bdca83942ada8463097cda5902800948c7a6e5 /fitz/res_text.c
parentfc0c17314f40e758e19de549be5b506f93cea2b9 (diff)
downloadmupdf-e32122e047e5882f3ca64d86cc0562473360b329.tar.xz
Rename the old path and text node files.
Diffstat (limited to 'fitz/res_text.c')
-rw-r--r--fitz/res_text.c111
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);
+ }
+}