Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | 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("\n",
128
				text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y);
129
		else
130
			printf("\n",
131
				text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y);
132
	}
133
}