OLD | NEW |
1 /* | 1 /* |
2 * Copyright © 2009 Red Hat, Inc. | 2 * Copyright © 2009 Red Hat, Inc. |
3 * Copyright © 2009 Keith Stribley | 3 * Copyright © 2009 Keith Stribley |
4 * | 4 * |
5 * This is part of HarfBuzz, a text shaping library. | 5 * This is part of HarfBuzz, a text shaping library. |
6 * | 6 * |
7 * Permission is hereby granted, without written agreement and without | 7 * Permission is hereby granted, without written agreement and without |
8 * license or royalty fees, to use, copy, modify, and distribute this | 8 * license or royalty fees, to use, copy, modify, and distribute this |
9 * software and its documentation for any purpose, provided that the | 9 * software and its documentation for any purpose, provided that the |
10 * above copyright notice and the following two paragraphs appear in | 10 * above copyright notice and the following two paragraphs appear in |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 * In general, this file does a fine job of what it's supposed to do. | 46 * In general, this file does a fine job of what it's supposed to do. |
47 * There are, however, things that need more work: | 47 * There are, however, things that need more work: |
48 * | 48 * |
49 * - We don't handle any load_flags. That definitely has API implications. :( | 49 * - We don't handle any load_flags. That definitely has API implications. :( |
50 * I believe hb_ft_font_create() should take load_flags input. | 50 * I believe hb_ft_font_create() should take load_flags input. |
51 * In particular, FT_Get_Advance() without the NO_HINTING flag seems to be | 51 * In particular, FT_Get_Advance() without the NO_HINTING flag seems to be |
52 * buggy. | 52 * buggy. |
53 * | 53 * |
54 * - We don't handle / allow for emboldening / obliqueing. | 54 * - We don't handle / allow for emboldening / obliqueing. |
55 * | 55 * |
56 * - Rounding, etc? | 56 * - In the future, we should add constructors to create fonts in font space? |
57 * | |
58 * - In the future, we should add constructors to create fonts in font space. | |
59 * | |
60 * - I believe transforms are not correctly implemented. FreeType does not | |
61 * provide any API to get to the transform/delta set on the face. :( | |
62 * | |
63 * - Always use FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH? | |
64 * | 57 * |
65 * - FT_Load_Glyph() is exteremely costly. Do something about it? | 58 * - FT_Load_Glyph() is exteremely costly. Do something about it? |
66 */ | 59 */ |
67 | 60 |
68 | 61 |
69 static hb_bool_t | 62 static hb_bool_t |
70 hb_ft_get_glyph (hb_font_t *font HB_UNUSED, | 63 hb_ft_get_glyph (hb_font_t *font HB_UNUSED, |
71 void *font_data, | 64 void *font_data, |
72 hb_codepoint_t unicode, | 65 hb_codepoint_t unicode, |
73 hb_codepoint_t variation_selector, | 66 hb_codepoint_t variation_selector, |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 static hb_bool_t | 228 static hb_bool_t |
236 hb_ft_get_glyph_name (hb_font_t *font HB_UNUSED, | 229 hb_ft_get_glyph_name (hb_font_t *font HB_UNUSED, |
237 void *font_data, | 230 void *font_data, |
238 hb_codepoint_t glyph, | 231 hb_codepoint_t glyph, |
239 char *name, unsigned int size, | 232 char *name, unsigned int size, |
240 void *user_data HB_UNUSED) | 233 void *user_data HB_UNUSED) |
241 { | 234 { |
242 FT_Face ft_face = (FT_Face) font_data; | 235 FT_Face ft_face = (FT_Face) font_data; |
243 | 236 |
244 hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size); | 237 hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size); |
245 if (!ret || (size && !*name)) | 238 if (ret && (size && !*name)) |
246 snprintf (name, size, "gid%u", glyph); | 239 ret = false; |
247 | 240 |
248 return ret; | 241 return ret; |
249 } | 242 } |
250 | 243 |
251 static hb_bool_t | 244 static hb_bool_t |
252 hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED, | 245 hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED, |
253 void *font_data, | 246 void *font_data, |
254 const char *name, int len, /* -1 means nul-terminated
*/ | 247 const char *name, int len, /* -1 means nul-terminated
*/ |
255 hb_codepoint_t *glyph, | 248 hb_codepoint_t *glyph, |
256 void *user_data HB_UNUSED) | 249 void *user_data HB_UNUSED) |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 ft_face->size->metrics.y_ppem); | 389 ft_face->size->metrics.y_ppem); |
397 | 390 |
398 return font; | 391 return font; |
399 } | 392 } |
400 | 393 |
401 | 394 |
402 /* Thread-safe, lock-free, FT_Library */ | 395 /* Thread-safe, lock-free, FT_Library */ |
403 | 396 |
404 static FT_Library ft_library; | 397 static FT_Library ft_library; |
405 | 398 |
406 static | 399 static inline |
407 void free_ft_library (void) | 400 void free_ft_library (void) |
408 { | 401 { |
409 FT_Done_FreeType (ft_library); | 402 FT_Done_FreeType (ft_library); |
410 } | 403 } |
411 | 404 |
412 static FT_Library | 405 static FT_Library |
413 get_ft_library (void) | 406 get_ft_library (void) |
414 { | 407 { |
415 retry: | 408 retry: |
416 FT_Library library = (FT_Library) hb_atomic_ptr_get (&ft_library); | 409 FT_Library library = (FT_Library) hb_atomic_ptr_get (&ft_library); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 | 477 |
485 FT_Face | 478 FT_Face |
486 hb_ft_font_get_face (hb_font_t *font) | 479 hb_ft_font_get_face (hb_font_t *font) |
487 { | 480 { |
488 if (font->destroy == (hb_destroy_func_t) FT_Done_Face || | 481 if (font->destroy == (hb_destroy_func_t) FT_Done_Face || |
489 font->destroy == (hb_destroy_func_t) _do_nothing) | 482 font->destroy == (hb_destroy_func_t) _do_nothing) |
490 return (FT_Face) font->user_data; | 483 return (FT_Face) font->user_data; |
491 | 484 |
492 return NULL; | 485 return NULL; |
493 } | 486 } |
OLD | NEW |