9 #ifdef BUILD_FONT_LOADER_EET
13 #ifdef HAVE_FONTCONFIG
14 #include <fontconfig/fontconfig.h>
17 #include "evas_common.h"
18 #include "evas_private.h"
21 static Eina_Hash *font_dirs = NULL;
22 static Eina_List *fonts_cache = NULL;
23 static Eina_List *fonts_zero = NULL;
25 typedef struct _Fndat Fndat;
29 Evas_Font_Description *fdesc;
34 Font_Rend_Flags wanted_rend;
36 #ifdef HAVE_FONTCONFIG
42 /* private methods for font dir cache */
43 static Eina_Bool font_cache_dir_free(const Eina_Hash *hash, const void *key, void *data, void *fdata);
44 static Evas_Font_Dir *object_text_font_cache_dir_update(char *dir, Evas_Font_Dir *fd);
45 static Evas_Font *object_text_font_cache_font_find_x(Evas_Font_Dir *fd, char *font);
46 static Evas_Font *object_text_font_cache_font_find_file(Evas_Font_Dir *fd, char *font);
47 static Evas_Font *object_text_font_cache_font_find_alias(Evas_Font_Dir *fd, char *font);
48 static Evas_Font *object_text_font_cache_font_find(Evas_Font_Dir *fd, char *font);
49 static Evas_Font_Dir *object_text_font_cache_dir_add(char *dir);
50 static void object_text_font_cache_dir_del(char *dir, Evas_Font_Dir *fd);
51 static int evas_object_text_font_string_parse(char *buffer, char dest[14][256]);
53 #ifdef HAVE_FONTCONFIG
54 static int fc_init = 0;
58 evas_font_dir_cache_free(void)
60 if (!font_dirs) return;
62 eina_hash_foreach(font_dirs, font_cache_dir_free, NULL);
63 eina_hash_free(font_dirs);
66 #ifdef HAVE_FONTCONFIG
67 /* this is bad i got a:
68 * fccache.c:512: FcCacheFini: Assertion fcCacheChains[i] == ((void *)0)' failed.
70 * all i can do for now is shut this puppy down. butthat breaks, so disable
71 * it as in reality - there is little reason to care about the memory not
75 * if (fc_init == 0) FcFini();
81 evas_font_dir_cache_find(char *dir, char *font)
83 Evas_Font_Dir *fd = NULL;
85 if (!font_dirs) font_dirs = eina_hash_string_superfast_new(NULL);
86 else fd = eina_hash_find(font_dirs, dir);
87 fd = object_text_font_cache_dir_update(dir, fd);
92 fn = object_text_font_cache_font_find(fd, font);
102 evas_font_set_get(const char *name)
104 Eina_List *fonts = NULL;
107 p = strchr(name, ',');
110 fonts = eina_list_append(fonts, eina_stringshare_add(name));
120 nm = alloca(p - pp + 1);
121 strncpy(nm, pp, p - pp);
123 fonts = eina_list_append(fonts, eina_stringshare_add(nm));
126 if (!p) fonts = eina_list_append(fonts, eina_stringshare_add(pp));
133 evas_fonts_zero_free(Evas *evas)
137 EINA_LIST_FREE(fonts_zero, fd)
139 if (fd->fdesc) evas_font_desc_unref(fd->fdesc);
140 if (fd->source) eina_stringshare_del(fd->source);
141 evas->engine.func->font_free(evas->engine.data.output, fd->font);
142 #ifdef HAVE_FONTCONFIG
143 if (fd->set) FcFontSetDestroy(fd->set);
144 if (fd->p_nm) FcPatternDestroy(fd->p_nm);
151 evas_fonts_zero_presure(Evas *evas)
156 && eina_list_count(fonts_zero) > 4) /* 4 is arbitrary */
158 fd = eina_list_data_get(fonts_zero);
160 if (fd->ref != 0) break;
161 fonts_zero = eina_list_remove_list(fonts_zero, fonts_zero);
163 if (fd->fdesc) evas_font_desc_unref(fd->fdesc);
164 if (fd->source) eina_stringshare_del(fd->source);
165 evas->engine.func->font_free(evas->engine.data.output, fd->font);
166 #ifdef HAVE_FONTCONFIG
167 if (fd->set) FcFontSetDestroy(fd->set);
168 if (fd->p_nm) FcPatternDestroy(fd->p_nm);
172 if (eina_list_count(fonts_zero) < 5) break;
177 evas_font_free(Evas *evas, void *font)
182 EINA_LIST_FOREACH(fonts_cache, l, fd)
184 if (fd->font == font)
189 fonts_cache = eina_list_remove_list(fonts_cache, l);
190 fonts_zero = eina_list_append(fonts_zero, fd);
196 && eina_list_count(fonts_zero) > 42) /* 42 is arbitrary */
198 fd = eina_list_data_get(fonts_zero);
200 if (fd->ref != 0) break;
201 fonts_zero = eina_list_remove_list(fonts_zero, fonts_zero);
203 if (fd->fdesc) evas_font_desc_unref(fd->fdesc);
204 if (fd->source) eina_stringshare_del(fd->source);
205 evas->engine.func->font_free(evas->engine.data.output, fd->font);
206 #ifdef HAVE_FONTCONFIG
207 if (fd->set) FcFontSetDestroy(fd->set);
208 if (fd->p_nm) FcPatternDestroy(fd->p_nm);
212 if (eina_list_count(fonts_zero) < 43) break;
222 #ifdef HAVE_FONTCONFIG
227 FcConfigEnableHome(1);
232 #ifdef HAVE_FONTCONFIG
233 static Evas_Font_Set *
234 evas_load_fontconfig(Evas *evas, FcFontSet *set, int size,
235 Font_Rend_Flags wanted_rend)
237 Evas_Font_Set *font = NULL;
240 /* Do loading for all in family */
241 for (i = 0; i < set->nfont; i++)
245 FcPatternGet(set->fonts[i], FC_FILE, 0, &filename);
248 evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size, wanted_rend);
250 font = evas->engine.func->font_load(evas->engine.data.output, (char *)filename.u.s, size, wanted_rend);
257 #ifdef HAVE_FONTCONFIG
258 /* In sync with Evas_Font_Style, Evas_Font_Weight and Evas_Font_Width */
259 static int _fc_slant_map[] =
266 static int _fc_weight_map[] =
270 FC_WEIGHT_ULTRALIGHT,
282 static int _fc_width_map[] =
285 FC_WIDTH_ULTRACONDENSED,
286 FC_WIDTH_EXTRACONDENSED,
288 FC_WIDTH_SEMICONDENSED,
289 FC_WIDTH_SEMIEXPANDED,
291 FC_WIDTH_EXTRAEXPANDED,
292 FC_WIDTH_ULTRAEXPANDED
303 typedef struct _Style_Map Style_Map;
305 static Style_Map _style_width_map[] =
307 {"normal", EVAS_FONT_WIDTH_NORMAL},
308 {"ultracondensed", EVAS_FONT_WIDTH_ULTRACONDENSED},
309 {"extracondensed", EVAS_FONT_WIDTH_EXTRACONDENSED},
310 {"condensed", EVAS_FONT_WIDTH_CONDENSED},
311 {"semicondensed", EVAS_FONT_WIDTH_SEMICONDENSED},
312 {"semiexpanded", EVAS_FONT_WIDTH_SEMIEXPANDED},
313 {"expanded", EVAS_FONT_WIDTH_EXPANDED},
314 {"extraexpanded", EVAS_FONT_WIDTH_EXTRAEXPANDED},
315 {"ultraexpanded", EVAS_FONT_WIDTH_ULTRAEXPANDED},
318 static Style_Map _style_weight_map[] =
320 {"normal", EVAS_FONT_WEIGHT_NORMAL},
321 {"thin", EVAS_FONT_WEIGHT_THIN},
322 {"ultralight", EVAS_FONT_WEIGHT_ULTRALIGHT},
323 {"light", EVAS_FONT_WEIGHT_LIGHT},
324 {"book", EVAS_FONT_WEIGHT_BOOK},
325 {"medium", EVAS_FONT_WEIGHT_MEDIUM},
326 {"semibold", EVAS_FONT_WEIGHT_SEMIBOLD},
327 {"bold", EVAS_FONT_WEIGHT_BOLD},
328 {"ultrabold", EVAS_FONT_WEIGHT_ULTRABOLD},
329 {"black", EVAS_FONT_WEIGHT_BLACK},
330 {"extrablack", EVAS_FONT_WEIGHT_EXTRABLACK}
333 static Style_Map _style_slant_map[] =
335 {"normal", EVAS_FONT_SLANT_NORMAL},
336 {"oblique", EVAS_FONT_SLANT_OBLIQUE},
337 {"italic", EVAS_FONT_SLANT_ITALIC}
340 #define _STYLE_MAP_LEN(x) (sizeof(x) / sizeof(*(x)))
343 * Find a certain attribute from the map in the style.
344 * @return the index of the found one.
347 _evas_font_style_find_internal(const char *style, const char *style_end,
348 Style_Map _map[], size_t map_len)
351 while (style < style_end)
353 for (i = 0 ; i < map_len ; i++)
356 const char *cur = _map[i].name;
358 if (!strncasecmp(style, cur, len) &&
359 (!cur[len] || (cur[len] == ' ')))
364 style = strchr(style, ' ');
368 while (*style && (*style == ' '))
375 evas_font_style_find(const char *start, const char *end,
376 Evas_Font_Style style)
378 #define _RET_STYLE(x) \
379 return _evas_font_style_find_internal(start, end, \
380 _style_##x##_map, _STYLE_MAP_LEN(_style_##x##_map));
383 case EVAS_FONT_STYLE_SLANT:
385 case EVAS_FONT_STYLE_WEIGHT:
387 case EVAS_FONT_STYLE_WIDTH:
396 evas_font_desc_unref(Evas_Font_Description *fdesc)
398 if (--(fdesc->ref) == 0)
400 eina_stringshare_del(fdesc->name);
401 eina_stringshare_del(fdesc->fallbacks);
402 eina_stringshare_del(fdesc->lang);
407 Evas_Font_Description *
408 evas_font_desc_ref(Evas_Font_Description *fdesc)
414 Evas_Font_Description *
415 evas_font_desc_new(void)
417 Evas_Font_Description *fdesc;
418 fdesc = calloc(1, sizeof(*fdesc));
420 fdesc->is_new = EINA_TRUE;
425 Evas_Font_Description *
426 evas_font_desc_dup(const Evas_Font_Description *fdesc)
428 Evas_Font_Description *new;
429 new = evas_font_desc_new();
430 memcpy(new, fdesc, sizeof(*new));
432 new->is_new = EINA_TRUE;
433 new->name = eina_stringshare_ref(new->name);
439 evas_font_desc_cmp(const Evas_Font_Description *a,
440 const Evas_Font_Description *b)
442 /* FIXME: Do actual comparison, i.e less than and bigger than. */
443 return !((a->name == b->name) && (a->weight == b->weight) &&
444 (a->slant == b->slant) && (a->width == b->width) &&
445 (a->lang == b->lang));
449 evas_font_name_parse(Evas_Font_Description *fdesc, const char *name)
453 end = strchr(name, ':');
455 eina_stringshare_replace(&(fdesc->name), name);
457 eina_stringshare_replace_length(&(fdesc->name), name, end - name);
463 end = strchr(end + 1, ':');
465 tend = name + strlen(name);
469 if (!strncmp(name, ":style=", 7))
471 #define _SET_STYLE(x) \
472 fdesc->x = _evas_font_style_find_internal(name + 7, tend, \
473 _style_##x##_map, _STYLE_MAP_LEN(_style_##x##_map));
479 else if (!strncmp(name, ":lang=", 6))
481 const char *tmp = name + 6;
482 eina_stringshare_replace_length(&(fdesc->lang), tmp, tend - tmp);
488 evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size)
490 #ifdef HAVE_FONTCONFIG
491 FcPattern *p_nm = NULL;
492 FcFontSet *set = NULL;
495 Evas_Font_Set *font = NULL;
496 Eina_List *fonts, *l;
499 Font_Rend_Flags wanted_rend = 0;
501 if (!fdesc) return NULL;
502 fdesc->is_new = EINA_FALSE;
504 if (fdesc->slant != EVAS_FONT_SLANT_NORMAL)
505 wanted_rend |= FONT_REND_SLANT;
506 if (fdesc->weight == EVAS_FONT_WEIGHT_BOLD)
507 wanted_rend |= FONT_REND_WEIGHT;
511 EINA_LIST_FOREACH(fonts_cache, l, fd)
513 if (!evas_font_desc_cmp(fdesc, fd->fdesc))
515 if (((!source) && (!fd->source)) ||
516 ((source) && (fd->source) && (!strcmp(source, fd->source))))
518 if ((size == fd->size) &&
519 (wanted_rend == fd->wanted_rend))
521 fonts_cache = eina_list_promote_list(fonts_cache, l);
525 #ifdef HAVE_FONTCONFIG
526 else if (fd->set && fd->p_nm)
528 font = evas_load_fontconfig(evas, fd->set, size,
537 EINA_LIST_FOREACH(fonts_zero, l, fd)
539 if (!evas_font_desc_cmp(fdesc, fd->fdesc))
541 if (((!source) && (!fd->source)) ||
542 ((source) && (fd->source) && (!strcmp(source, fd->source))))
544 if ((size == fd->size) &&
545 (wanted_rend == fd->wanted_rend))
547 fonts_zero = eina_list_remove_list(fonts_zero, l);
548 fonts_cache = eina_list_prepend(fonts_cache, fd);
552 #ifdef HAVE_FONTCONFIG
553 else if (fd->set && fd->p_nm)
555 font = evas_load_fontconfig(evas, fd->set, size,
564 fonts = evas_font_set_get(fdesc->name);
565 EINA_LIST_FOREACH(fonts, l, nm) /* Load each font in append */
567 if (l == fonts || !font) /* First iteration OR no font */
569 #ifdef BUILD_FONT_LOADER_EET
570 if (source) /* Load Font from "eet" source */
575 fake_name = evas_file_path_join(source, nm);
578 font = evas->engine.func->font_load(evas->engine.data.output, fake_name, size, wanted_rend);
579 if (!font) /* Load from fake name failed, probably not cached */
581 /* read original!!! */
582 ef = eet_open(source, EET_FILE_MODE_READ);
588 fdata = eet_read(ef, nm, &fsize);
589 if ((fdata) && (fsize > 0))
591 font = evas->engine.func->font_memory_load(evas->engine.data.output, fake_name, size, fdata, fsize, wanted_rend);
600 if (!font) /* Source load failed */
603 if (evas_file_path_is_full_path((char *)nm)) /* Try filename */
604 font = evas->engine.func->font_load(evas->engine.data.output, (char *)nm, size, wanted_rend);
605 else /* search font path */
610 EINA_LIST_FOREACH(evas->font_path, ll, dir)
614 f_file = evas_font_dir_cache_find(dir, (char *)nm);
617 font = evas->engine.func->font_load(evas->engine.data.output, f_file, size, wanted_rend);
622 #ifdef BUILD_FONT_LOADER_EET
626 else /* Base font loaded, append others */
628 #ifdef BUILD_FONT_LOADER_EET
636 fake_name = evas_file_path_join(source, nm);
639 /* FIXME: make an engine func */
640 if (!evas->engine.func->font_add(evas->engine.data.output, font, fake_name, size, wanted_rend))
642 /* read original!!! */
643 ef = eet_open(source, EET_FILE_MODE_READ);
649 fdata = eet_read(ef, nm, &fsize);
650 if ((fdata) && (fsize > 0))
652 ok = evas->engine.func->font_memory_add(evas->engine.data.output, font, fake_name, size, fdata, fsize, wanted_rend);
666 if (evas_file_path_is_full_path((char *)nm))
667 evas->engine.func->font_add(evas->engine.data.output, font, (char *)nm, size, wanted_rend);
673 EINA_LIST_FOREACH(evas->font_path, ll, dir)
677 f_file = evas_font_dir_cache_find(dir, (char *)nm);
680 if (evas->engine.func->font_add(evas->engine.data.output, font, f_file, size, wanted_rend))
685 #ifdef BUILD_FONT_LOADER_EET
689 eina_stringshare_del(nm);
691 fonts = eina_list_free(fonts);
693 #ifdef HAVE_FONTCONFIG
695 if (!font) /* Search using fontconfig */
699 p_nm = FcPatternBuild (NULL,
700 FC_WEIGHT, FcTypeInteger, _fc_weight_map[fdesc->weight],
701 FC_SLANT, FcTypeInteger, _fc_slant_map[fdesc->slant],
703 FC_WIDTH, FcTypeInteger, _fc_width_map[fdesc->width],
706 FcPatternAddString (p_nm, FC_FAMILY, (FcChar8*) fdesc->name);
708 /* Handle font fallbacks */
709 if (fdesc->fallbacks)
713 const char *start, *end;
714 start = fdesc->fallbacks;
715 end = strchr(start, ',');
718 char *tmp = alloca((end - start) + 1);
719 strncpy(tmp, start, end - start);
720 tmp[end - start] = 0;
721 FcPatternAddString (p_nm, FC_FAMILY, (FcChar8*) tmp);
725 FcPatternAddString (p_nm, FC_FAMILY, (FcChar8*) start);
732 FcPatternAddString (p_nm, FC_LANG, (FcChar8 *) fdesc->lang);
734 FcConfigSubstitute(NULL, p_nm, FcMatchPattern);
735 FcDefaultSubstitute(p_nm);
738 set = FcFontSort(NULL, p_nm, FcTrue, NULL, &res);
741 ERR("No fontconfig font matches '%s'. It was the last resource, no font found!", fdesc->name);
742 FcPatternDestroy(p_nm);
747 font = evas_load_fontconfig(evas, set, size, wanted_rend);
753 fd = calloc(1, sizeof(Fndat));
756 fd->fdesc = evas_font_desc_ref(fdesc);
757 if (source) fd->source = eina_stringshare_add(source);
759 fd->wanted_rend = wanted_rend;
762 fonts_cache = eina_list_prepend(fonts_cache, fd);
763 #ifdef HAVE_FONTCONFIG
770 evas->engine.func->font_hinting_set(evas->engine.data.output, font,
776 evas_font_load_hinting_set(Evas *evas, void *font, int hinting)
778 evas->engine.func->font_hinting_set(evas->engine.data.output, font,
783 evas_font_dir_available_list(const Evas *evas)
787 Eina_List *available = NULL;
790 #ifdef HAVE_FONTCONFIG
791 /* Add font config fonts */
793 FcFontSet *set = NULL;
799 p = FcPatternCreate();
800 os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, NULL);
802 if (p && os) set = FcFontList(NULL, p, os);
804 if (p) FcPatternDestroy(p);
805 if (os) FcObjectSetDestroy(os);
809 for (i = 0; i < set->nfont; i++)
813 font = (char *)FcNameUnparse(set->fonts[i]);
814 available = eina_list_append(available, eina_stringshare_add(font));
818 FcFontSetDestroy(set);
822 /* Add fonts in evas font_path*/
823 if (!evas->font_path)
826 if (!font_dirs) font_dirs = eina_hash_string_superfast_new(NULL);
828 EINA_LIST_FOREACH(evas->font_path, l, dir)
832 fd = eina_hash_find(font_dirs, dir);
833 fd = object_text_font_cache_dir_update(dir, fd);
834 if (fd && fd->aliases)
838 EINA_LIST_FOREACH(fd->aliases, ll, fa)
839 available = eina_list_append(available, eina_stringshare_add((char *)fa->alias));
847 evas_font_dir_available_list_free(Eina_List *available)
851 eina_stringshare_del(available->data);
852 available = eina_list_remove(available, available->data);
858 font_cache_dir_free(const Eina_Hash *hash __UNUSED__, const void *key, void *data, void *fdata __UNUSED__)
860 object_text_font_cache_dir_del((char *) key, data);
864 static Evas_Font_Dir *
865 object_text_font_cache_dir_update(char *dir, Evas_Font_Dir *fd)
872 mt = evas_file_modified_time(dir);
873 if (mt != fd->dir_mod_time)
875 object_text_font_cache_dir_del(dir, fd);
876 eina_hash_del(font_dirs, dir, fd);
880 tmp = evas_file_path_join(dir, "fonts.dir");
883 mt = evas_file_modified_time(tmp);
885 if (mt != fd->fonts_dir_mod_time)
887 object_text_font_cache_dir_del(dir, fd);
888 eina_hash_del(font_dirs, dir, fd);
892 tmp = evas_file_path_join(dir, "fonts.alias");
895 mt = evas_file_modified_time(tmp);
898 if (mt != fd->fonts_alias_mod_time)
900 object_text_font_cache_dir_del(dir, fd);
901 eina_hash_del(font_dirs, dir, fd);
909 return object_text_font_cache_dir_add(dir);
913 object_text_font_cache_font_find_x(Evas_Font_Dir *fd, char *font)
916 char font_prop[14][256];
920 num = evas_object_text_font_string_parse(font, font_prop);
921 if (num != 14) return NULL;
922 EINA_LIST_FOREACH(fd->fonts, l, fn)
929 for (i = 0; i < 14; i++)
931 if ((font_prop[i][0] == '*') && (font_prop[i][1] == 0))
935 if (!strcasecmp(font_prop[i], fn->x.prop[i])) match++;
939 if (match == 14) return fn;
946 object_text_font_cache_font_find_file(Evas_Font_Dir *fd, char *font)
951 EINA_LIST_FOREACH(fd->fonts, l, fn)
955 if (!strcasecmp(font, fn->simple.name)) return fn;
962 object_text_font_cache_font_find_alias(Evas_Font_Dir *fd, char *font)
967 EINA_LIST_FOREACH(fd->aliases, l, fa)
968 if (!strcasecmp(fa->alias, font)) return fa->fn;
973 object_text_font_cache_font_find(Evas_Font_Dir *fd, char *font)
977 fn = eina_hash_find(fd->lookup, font);
979 fn = object_text_font_cache_font_find_alias(fd, font);
980 if (!fn) fn = object_text_font_cache_font_find_x(fd, font);
981 if (!fn) fn = object_text_font_cache_font_find_file(fd, font);
982 if (!fn) return NULL;
983 eina_hash_add(fd->lookup, font, fn);
987 static Evas_Font_Dir *
988 object_text_font_cache_dir_add(char *dir)
995 fd = calloc(1, sizeof(Evas_Font_Dir));
996 if (!fd) return NULL;
997 fd->lookup = eina_hash_string_superfast_new(NULL);
999 eina_hash_add(font_dirs, dir, fd);
1001 /* READ fonts.alias, fonts.dir and directory listing */
1004 tmp = evas_file_path_join(dir, "fonts.dir");
1009 f = fopen(tmp, "rb");
1013 char fname[4096], fdef[4096];
1015 if (fscanf(f, "%i\n", &num) != 1) goto cant_read;
1016 /* read font lines */
1017 while (fscanf(f, "%4090s %[^\n]\n", fname, fdef) == 2)
1019 char font_prop[14][256];
1023 if ((fdef[0] == '!') || (fdef[0] == '#')) continue;
1024 /* parse font def */
1025 num = evas_object_text_font_string_parse((char *)fdef, font_prop);
1028 fn = calloc(1, sizeof(Evas_Font));
1032 for (i = 0; i < 14; i++)
1033 fn->x.prop[i] = eina_stringshare_add(font_prop[i]);
1034 tmp2 = evas_file_path_join(dir, fname);
1037 fn->path = eina_stringshare_add(tmp2);
1040 fd->fonts = eina_list_append(fd->fonts, fn);
1050 /* directoy listing */
1051 fdir = evas_file_path_list(dir, "*.ttf", 0);
1054 tmp = evas_file_path_join(dir, fdir->data);
1057 fn = calloc(1, sizeof(Evas_Font));
1063 tmp2 = alloca(strlen(fdir->data) + 1);
1064 strcpy(tmp2, fdir->data);
1065 p = strrchr(tmp2, '.');
1067 fn->simple.name = eina_stringshare_add(tmp2);
1068 tmp2 = evas_file_path_join(dir, fdir->data);
1071 fn->path = eina_stringshare_add(tmp2);
1074 fd->fonts = eina_list_append(fd->fonts, fn);
1079 fdir = eina_list_remove(fdir, fdir->data);
1083 tmp = evas_file_path_join(dir, "fonts.alias");
1088 f = fopen(tmp, "rb");
1091 char fname[4096], fdef[4096];
1093 /* read font alias lines */
1094 while (fscanf(f, "%4090s %[^\n]\n", fname, fdef) == 2)
1096 Evas_Font_Alias *fa;
1099 if ((fname[0] == '!') || (fname[0] == '#')) continue;
1100 fa = calloc(1, sizeof(Evas_Font_Alias));
1103 fa->alias = eina_stringshare_add(fname);
1104 fa->fn = object_text_font_cache_font_find_x(fd, fdef);
1105 if ((!fa->alias) || (!fa->fn))
1107 if (fa->alias) eina_stringshare_del(fa->alias);
1111 fd->aliases = eina_list_append(fd->aliases, fa);
1119 fd->dir_mod_time = evas_file_modified_time(dir);
1120 tmp = evas_file_path_join(dir, "fonts.dir");
1123 fd->fonts_dir_mod_time = evas_file_modified_time(tmp);
1126 tmp = evas_file_path_join(dir, "fonts.alias");
1129 fd->fonts_alias_mod_time = evas_file_modified_time(tmp);
1137 object_text_font_cache_dir_del(char *dir __UNUSED__, Evas_Font_Dir *fd)
1139 if (fd->lookup) eina_hash_free(fd->lookup);
1145 fn = fd->fonts->data;
1146 fd->fonts = eina_list_remove(fd->fonts, fn);
1147 for (i = 0; i < 14; i++)
1149 if (fn->x.prop[i]) eina_stringshare_del(fn->x.prop[i]);
1151 if (fn->simple.name) eina_stringshare_del(fn->simple.name);
1152 if (fn->path) eina_stringshare_del(fn->path);
1157 Evas_Font_Alias *fa;
1159 fa = fd->aliases->data;
1160 fd->aliases = eina_list_remove(fd->aliases, fa);
1161 if (fa->alias) eina_stringshare_del(fa->alias);
1168 evas_object_text_font_string_parse(char *buffer, char dest[14][256])
1176 if (p[0] != '-') return 0;
1181 if ((p[i] == '-') || (m == 255))
1189 if (n == 14) return n;
1197 evas_font_path_clear(Evas *e)
1199 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1202 while (e->font_path)
1204 eina_stringshare_del(e->font_path->data);
1205 e->font_path = eina_list_remove(e->font_path, e->font_path->data);
1210 evas_font_path_append(Evas *e, const char *path)
1212 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1217 e->font_path = eina_list_append(e->font_path, eina_stringshare_add(path));
1221 evas_font_path_prepend(Evas *e, const char *path)
1223 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1228 e->font_path = eina_list_prepend(e->font_path, eina_stringshare_add(path));
1231 EAPI const Eina_List *
1232 evas_font_path_list(const Evas *e)
1234 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1237 return e->font_path;
1241 evas_font_object_rehint(Evas_Object *obj)
1243 if (obj->smart.smart)
1245 EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj)
1246 evas_font_object_rehint(obj);
1250 if (!strcmp(obj->type, "text"))
1251 _evas_object_text_rehint(obj);
1252 if (!strcmp(obj->type, "textblock"))
1253 _evas_object_textblock_rehint(obj);
1258 evas_font_hinting_set(Evas *e, Evas_Font_Hinting_Flags hinting)
1262 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1265 if (e->hinting == hinting) return;
1266 e->hinting = hinting;
1268 EINA_INLIST_FOREACH(e->layers, lay)
1272 EINA_INLIST_FOREACH(lay->objects, obj)
1273 evas_font_object_rehint(obj);
1277 EAPI Evas_Font_Hinting_Flags
1278 evas_font_hinting_get(const Evas *e)
1280 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1281 return EVAS_FONT_HINTING_BYTECODE;
1287 evas_font_hinting_can_hint(const Evas *e, Evas_Font_Hinting_Flags hinting)
1289 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1292 if (e->engine.func->font_hinting_can_hint)
1293 return e->engine.func->font_hinting_can_hint(e->engine.data.output,
1299 evas_font_cache_flush(Evas *e)
1301 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1305 e->engine.func->font_cache_flush(e->engine.data.output);
1309 evas_font_cache_set(Evas *e, int size)
1311 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1315 if (size < 0) size = 0;
1316 e->engine.func->font_cache_set(e->engine.data.output, size);
1320 evas_font_cache_get(const Evas *e)
1322 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1326 return e->engine.func->font_cache_get(e->engine.data.output);
1330 evas_font_available_list(const Evas *e)
1332 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1336 return evas_font_dir_available_list(e);
1340 evas_font_available_list_free(Evas *e, Eina_List *available)
1342 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1346 evas_font_dir_available_list_free(available);