Rev 4680 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4680 | right-hear | 1 | #include "fitz.h" |
2 | |||
3 | fz_text * |
||
4 | fz_new_text(fz_font *font, fz_matrix trm, int wmode) |
||
5 | { |
||
6 | fz_text *text; |
||
7 | |||
8 | text = fz_malloc(sizeof(fz_text)); |
||
9 | text->font = fz_keep_font(font); |
||
10 | text->trm = trm; |
||
11 | text->wmode = wmode; |
||
12 | text->len = 0; |
||
13 | text->cap = 0; |
||
14 | text->items = NULL; |
||
15 | |||
16 | return text; |
||
17 | } |
||
18 | |||
19 | void |
||
20 | fz_free_text(fz_text *text) |
||
21 | { |
||
22 | fz_drop_font(text->font); |
||
23 | fz_free(text->items); |
||
24 | fz_free(text); |
||
25 | } |
||
26 | |||
27 | fz_text * |
||
28 | fz_clone_text(fz_text *old) |
||
29 | { |
||
30 | fz_text *text; |
||
31 | |||
32 | text = fz_malloc(sizeof(fz_text)); |
||
33 | text->font = fz_keep_font(old->font); |
||
34 | text->trm = old->trm; |
||
35 | text->wmode = old->wmode; |
||
36 | text->len = old->len; |
||
37 | text->cap = text->len; |
||
38 | text->items = fz_calloc(text->len, sizeof(fz_text_item)); |
||
39 | memcpy(text->items, old->items, text->len * sizeof(fz_text_item)); |
||
40 | |||
41 | return text; |
||
42 | } |
||
43 | |||
44 | fz_rect |
||
45 | fz_bound_text(fz_text *text, fz_matrix ctm) |
||
46 | { |
||
47 | fz_matrix trm; |
||
48 | fz_rect bbox; |
||
49 | fz_rect fbox; |
||
50 | int i; |
||
51 | |||
52 | if (text->len == 0) |
||
53 | return fz_empty_rect; |
||
54 | |||
55 | /* find bbox of glyph origins in ctm space */ |
||
56 | |||
57 | bbox.x0 = bbox.x1 = text->items[0].x; |
||
58 | bbox.y0 = bbox.y1 = text->items[0].y; |
||
59 | |||
60 | for (i = 1; i < text->len; i++) |
||
61 | { |
||
62 | bbox.x0 = MIN(bbox.x0, text->items[i].x); |
||
63 | bbox.y0 = MIN(bbox.y0, text->items[i].y); |
||
64 | bbox.x1 = MAX(bbox.x1, text->items[i].x); |
||
65 | bbox.y1 = MAX(bbox.y1, text->items[i].y); |
||
66 | } |
||
67 | |||
68 | bbox = fz_transform_rect(ctm, bbox); |
||
69 | |||
70 | /* find bbox of font in trm * ctm space */ |
||
71 | |||
72 | trm = fz_concat(text->trm, ctm); |
||
73 | trm.e = 0; |
||
74 | trm.f = 0; |
||
75 | |||
76 | fbox.x0 = text->font->bbox.x0 * 0.001f; |
||
77 | fbox.y0 = text->font->bbox.y0 * 0.001f; |
||
78 | fbox.x1 = text->font->bbox.x1 * 0.001f; |
||
79 | fbox.y1 = text->font->bbox.y1 * 0.001f; |
||
80 | |||
81 | fbox = fz_transform_rect(trm, fbox); |
||
82 | |||
83 | /* expand glyph origin bbox by font bbox */ |
||
84 | |||
85 | bbox.x0 += fbox.x0; |
||
86 | bbox.y0 += fbox.y0; |
||
87 | bbox.x1 += fbox.x1; |
||
88 | bbox.y1 += fbox.y1; |
||
89 | |||
90 | return bbox; |
||
91 | } |
||
92 | |||
93 | static void |
||
94 | fz_grow_text(fz_text *text, int n) |
||
95 | { |
||
96 | if (text->len + n < text->cap) |
||
97 | return; |
||
98 | while (text->len + n > text->cap) |
||
99 | text->cap = text->cap + 36; |
||
100 | text->items = fz_realloc(text->items, text->cap, sizeof(fz_text_item)); |
||
101 | } |
||
102 | |||
103 | void |
||
104 | fz_add_text(fz_text *text, int gid, int ucs, float x, float y) |
||
105 | { |
||
106 | fz_grow_text(text, 1); |
||
107 | text->items[text->len].ucs = ucs; |
||
108 | text->items[text->len].gid = gid; |
||
109 | text->items[text->len].x = x; |
||
110 | text->items[text->len].y = y; |
||
111 | text->len++; |
||
112 | } |
||
113 | |||
114 | static int isxmlmeta(int c) |
||
115 | { |
||
116 | return c < 32 || c >= 128 || c == '&' || c == '<' || c == '>' || c == '\'' || c == '"'; |
||
117 | } |
||
118 | |||
119 | void fz_debug_text(fz_text *text, int indent) |
||
120 | { |
||
121 | int i, n; |
||
122 | for (i = 0; i < text->len; i++) |
||
123 | { |
||
124 | for (n = 0; n < indent; n++) |
||
125 | putchar(' '); |
||
126 | if (!isxmlmeta(text->items[i].ucs)) |
||
127 | printf(" |
||
128 | text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y); |
||
129 | else |
||
130 | printf(" |
||
131 | text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y); |
||
132 | } |
||
133 | }>>'>>>> |