2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
5 #include "evas_common.h"
6 #include "evas_private.h"
7 FT_Library evas_ft_lib = 0;
8 static int initialised = 0;
11 evas_common_font_init(void)
16 if (initialised != 1) return;
17 error = FT_Init_FreeType(&evas_ft_lib);
19 evas_common_font_load_init();
20 #ifdef EVAS_FRAME_QUEUING
21 evas_common_font_draw_init();
26 evas_common_font_shutdown(void)
30 if (initialised < 1) return;
32 if (initialised != 0) return;
34 evas_common_font_load_shutdown();
35 evas_common_font_cache_set(0);
36 evas_common_font_flush();
38 error = FT_Done_FreeType(evas_ft_lib);
39 #ifdef EVAS_FRAME_QUEUING
40 evas_common_font_draw_finish();
46 evas_common_font_font_all_unload(void)
48 evas_common_font_all_clear();
52 evas_common_font_ascent_get(RGBA_Font *fn)
58 // evas_common_font_size_use(fn);
63 EINA_LIST_FOREACH(fn->fonts, l, fi)
65 if (!fi->src->ft.face) continue;
66 if (fi->src->current_size != fi->size)
68 FT_Activate_Size(fi->ft.size);
69 fi->src->current_size = fi->size;
71 val = (int)fi->src->ft.face->size->metrics.ascender;
72 if (fi->src->ft.face->units_per_EM == 0)
74 dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
75 ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
76 printf(" ==== %p: %i\n", fi, ret);
81 if (fi->src->current_size != fi->size)
83 FT_Activate_Size(fi->ft.size);
84 fi->src->current_size = fi->size;
86 if (!FT_IS_SCALABLE(fi->src->ft.face))
88 printf("NOT SCALABLE!\n");
90 val = (int)fi->src->ft.face->size->metrics.ascender;
92 // printf("%i | %i\n", val, val >> 6);
93 // if (fi->src->ft.face->units_per_EM == 0)
95 // dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
96 // ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
101 evas_common_font_descent_get(RGBA_Font *fn)
107 // evas_common_font_size_use(fn);
108 fi = fn->fonts->data;
109 if (fi->src->current_size != fi->size)
111 FT_Activate_Size(fi->ft.size);
112 fi->src->current_size = fi->size;
114 val = -(int)fi->src->ft.face->size->metrics.descender;
116 // if (fi->src->ft.face->units_per_EM == 0)
118 // dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
119 // ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
124 evas_common_font_max_ascent_get(RGBA_Font *fn)
130 // evas_common_font_size_use(fn);
131 fi = fn->fonts->data;
132 if (fi->src->current_size != fi->size)
134 FT_Activate_Size(fi->ft.size);
135 fi->src->current_size = fi->size;
137 val = (int)fi->src->ft.face->bbox.yMax;
138 if (fi->src->ft.face->units_per_EM == 0)
140 dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
141 ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
146 evas_common_font_max_descent_get(RGBA_Font *fn)
152 // evas_common_font_size_use(fn);
153 fi = fn->fonts->data;
154 if (fi->src->current_size != fi->size)
156 FT_Activate_Size(fi->ft.size);
157 fi->src->current_size = fi->size;
159 val = -(int)fi->src->ft.face->bbox.yMin;
160 if (fi->src->ft.face->units_per_EM == 0)
162 dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
163 ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
168 evas_common_font_get_line_advance(RGBA_Font *fn)
174 // evas_common_font_size_use(fn);
175 fi = fn->fonts->data;
176 if (fi->src->current_size != fi->size)
178 FT_Activate_Size(fi->ft.size);
179 fi->src->current_size = fi->size;
181 val = (int)fi->src->ft.face->size->metrics.height;
182 if (fi->src->ft.face->units_per_EM == 0)
185 // dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
186 // ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
191 evas_common_font_utf8_get_next(const unsigned char *buf, int *iindex)
193 /* Reads UTF8 bytes from @buf, starting at *@index and returns
194 * the decoded code point at iindex offset, and advances iindex
195 * to the next code point after this.
197 * Returns 0 to indicate there is no next char
199 int index = *iindex, len, r;
200 unsigned char d, d2, d3, d4;
202 /* if this char is the null terminator, exit */
208 while (buf[index] && ((buf[index] & 0xc0) == 0x80))
210 len = index - *iindex;
217 d2 = buf[*iindex + 1];
218 r = d & 0x1f; /* copy lower 5 */
220 r |= (d2 & 0x3f); /* copy lower 6 */
225 d2 = buf[*iindex + 1];
226 d3 = buf[*iindex + 2];
227 r = d & 0x0f; /* copy lower 4 */
236 d2 = buf[*iindex + 1];
237 d3 = buf[*iindex + 2];
238 d4 = buf[*iindex + 3];
239 r = d & 0x0f; /* copy lower 4 */
253 evas_common_font_utf8_get_prev(const unsigned char *buf, int *iindex)
255 /* Reads UTF8 bytes from @buf, starting at *@index and returns
256 * the decoded code point at iindex offset, and advances iindex
257 * to the prev code point after this.
259 * Returns 0 to indicate there is no prev char
264 /* although when index == 0 there's no previous char, we still want to get
265 * the current char */
269 /* First obtain the codepoint at iindex */
270 r = evas_common_font_utf8_get_next(buf, &index);
272 /* Next advance iindex to previous codepoint */
275 while ((index > 0) && ((buf[index] & 0xc0) == 0x80))
283 evas_common_font_utf8_get_last(const unsigned char *buf, int buflen)
285 /* jumps to the nul byte at the buffer end and decodes backwards and
286 * returns the offset index byte in the buffer where the last character
287 * in the buffer begins.
289 * Returns -1 to indicate an error
294 if (buflen < 1) return 0;
305 if ((d & 0xc0) != 0x80)
313 evas_common_font_utf8_get_len(const unsigned char *buf)
315 /* returns the number of utf8 characters (not bytes) in the string */
316 int index = 0, len = 0;
320 if ((buf[index] & 0xc0) != 0x80)