18 #include <libxml/xmlmemory.h>
19 #include <libxml/parser.h>
21 #include <fontconfig/fontconfig.h>
23 #include <Elementary.h>
25 #include <Ecore_Evas.h>
27 #include <pkgmgr-info.h>
29 #include <system_settings.h>
30 #include <system_settings_private.h>
32 #include <tzplatform_config.h>
33 #include <system_settings_util.h>
36 #define SMALL_FONT_DPI (-90)
39 #define SMALL_FONT_DPI (-80)
41 #define MIDDLE_FONT_DPI (-100)
43 #define LARGE_FONT_DPI (-110)
46 #define LARGE_FONT_DPI (-150)
48 #define HUGE_FONT_DPI (-190)
49 #define GIANT_FONT_DPI (-250)
51 #define SETTING_FONT_PRELOAD_FONT_PATH _TZ_SYS_RO_SHARE"/fonts"
52 #define SETTING_FONT_DOWNLOADED_FONT_PATH _TZ_SYS_SHARE"/fonts"
54 #define SETTING_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
56 #define SETTING_FONT_TIZEN_FONT_ALIAS "Tizen"
57 #define SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS "TizenDefaultFont"
59 static int __font_size_get();
61 /* Returned family name should be free'd manually. */
62 char *__get_main_font_family_name_by_alias(char *alias)
65 FcFontSet *set = NULL;
66 FcPattern *pat = NULL;
67 FcConfig *font_config = NULL;
68 FcChar8 *family = NULL;
72 font_config = FcInitLoadConfigAndFonts();
73 if (font_config == NULL)
76 pat = FcPatternBuild(0, FC_FAMILY, FcTypeString, alias, (char *)0);
79 if (font_config != NULL) {
80 FcConfigDestroy(font_config);
86 FcConfigSubstitute(font_config, pat, FcMatchPattern);
87 FcDefaultSubstitute(pat);
90 set = FcFontSort(font_config, pat, FcTrue, NULL, &res);
92 if (set != NULL && (set->nfont > 0)) {
93 FcPatternGetString(set->fonts[0], FC_FAMILY, 0, &family);
94 ret = g_strdup((char *)family);
96 FcFontSetDestroy(set);
101 FcFontSetDestroy(set);
106 FcPatternDestroy(pat);
110 if (font_config != NULL) {
111 FcConfigDestroy(font_config);
118 /* LCOV_EXCL_START */
119 bool __is_supported_image_type_load(char *path)
126 ee = ecore_evas_new(NULL, 0, 0, 100, 100, NULL);
127 evas = ecore_evas_get(ee);
129 Evas_Object *img = evas_object_image_add(evas);
130 evas_object_image_file_set(img, path, NULL);
131 Evas_Load_Error ret = evas_object_image_load_error_get(img);
134 if (ret == EVAS_LOAD_ERROR_NONE) {
135 SETTING_TRACE("%s - OK", path);
138 SETTING_TRACE("%s - NO", path);
147 char *_get_cur_font()
149 return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_FONT_ALIAS);
152 /* LCOV_EXCL_START */
153 void font_config_set_notification()
158 Ecore_X_Window ecore_win = ecore_x_window_root_first_get();
159 Ecore_X_Atom atom = ecore_x_atom_get("FONT_TYPE_change");
160 ecore_x_window_prop_string_set(ecore_win, atom, "tizen");
165 /* LCOV_EXCL_START */
166 int __is_available_font(char *font_name)
169 FcObjectSet *os = NULL;
170 FcFontSet *fs = NULL;
171 FcPattern *pat = NULL;
172 FcConfig *font_config = NULL;
176 if (font_name == NULL)
179 font_config = FcInitLoadConfigAndFonts();
181 /*setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts"); */
183 char *locale = setlocale(0, NULL);
185 pat = FcPatternCreate();
187 os = FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
190 fs = FcFontList(font_config, pat, os);
191 FcObjectSetDestroy(os);
196 FcPatternDestroy(pat);
202 SETTING_TRACE("fs->nfont = %d", fs->nfont);
204 for (j = 0; j < fs->nfont; j++) {
205 FcChar8 *family = NULL;
206 FcChar8 *file = NULL;
208 if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
209 int preload_path_len = strlen(SETTING_FONT_PRELOAD_FONT_PATH);
210 int download_path_len = strlen(SETTING_FONT_DOWNLOADED_FONT_PATH);
212 if (file && (!strncmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len)
213 || !strncmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len))) {
214 char *family_result = NULL;
215 FcChar8 *lang = NULL;
217 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
220 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
223 family_result = (char *)family;
225 /* Find proper family name for current locale. */
226 while (locale && family && lang) {
227 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
228 family_result = (char *)family;
232 /* I will set english as default family language. */
233 /* If there is no proper family language for current locale, */
234 /* we have to show the english family name. */
235 if (!strcmp((char *)lang, (char *)"en")) {
236 family_result = (char *)family;
239 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
242 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
248 SETTING_TRACE("-------- FONT - family_result = %s", (char *)family_result);
249 if (strcmp(family_result, font_name) == 0) {
257 FcFontSetDestroy(fs);
260 FcConfigDestroy(font_config);
267 char *_get_default_font()
269 return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS);
272 /* LCOV_EXCL_START */
273 bool font_config_set(char *font_name)
276 Eina_List *text_classes = NULL;
277 Elm_Text_Class *etc = NULL;
278 const Eina_List *l = NULL;
279 Eina_List *fo_list = NULL;
280 Elm_Font_Overlay *efo = NULL;
282 int font_size = __font_size_get();
285 text_classes = elm_config_text_classes_list_get();
287 fo_list = (Eina_List *)elm_config_font_overlay_list_get();
289 Eina_List *ll = NULL;
290 Eina_List *l_next = NULL;
292 Eina_Bool slp_medium_exist = EINA_FALSE;
293 Eina_Bool slp_roman_exist = EINA_FALSE;
294 Eina_Bool slp_bold_exist = EINA_FALSE;
295 Eina_Bool slp_regular_exist = EINA_FALSE;
298 Eina_Bool tizen_exist = EINA_FALSE;
300 EINA_LIST_FOREACH_SAFE(fo_list, ll, l_next, efo) {
301 if (!strcmp(efo->text_class, "tizen_medium")) {
302 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
303 slp_medium_exist = EINA_TRUE;
304 } else if (!strcmp(efo->text_class, "tizen_roman")) {
305 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
306 slp_roman_exist = EINA_TRUE;
307 } else if (!strcmp(efo->text_class, "tizen_bold")) {
308 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
309 slp_bold_exist = EINA_TRUE;
310 } else if (!strcmp(efo->text_class, "tizen_regular")) {
311 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
312 slp_regular_exist = EINA_TRUE;
316 if (!strcmp(efo->text_class, "tizen")) {
317 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
318 tizen_exist = EINA_TRUE;
323 /* if slp_XX do not exist, need to set them, font size is -100(100%) */
324 if (slp_medium_exist == EINA_FALSE) {
325 elm_config_font_overlay_set("tizen_medium", (const char *)font_name, MIDDLE_FONT_DPI);
327 if (slp_roman_exist == EINA_FALSE) {
328 elm_config_font_overlay_set("tizen_roman", (const char *)font_name, MIDDLE_FONT_DPI);
330 if (slp_bold_exist == EINA_FALSE) {
331 elm_config_font_overlay_set("tizen_bold", (const char *)font_name, MIDDLE_FONT_DPI);
333 if (slp_regular_exist == EINA_FALSE) {
334 elm_config_font_overlay_set("tizen_regular", (const char *)font_name, MIDDLE_FONT_DPI);
338 if (tizen_exist == EINA_FALSE) {
339 elm_config_font_overlay_set("tizen", (const char *)font_name, MIDDLE_FONT_DPI);
342 elm_config_font_overlay_set("tizen", (const char *)font_name, MIDDLE_FONT_DPI);
345 elm_config_font_overlay_set("tizen", (const char *)font_name, MIDDLE_FONT_DPI);
347 EINA_LIST_FOREACH(text_classes, l, etc) {
351 EINA_LIST_FOREACH(fo_list, ll, efo) {
352 if (!strcmp(etc->name, efo->text_class)) {
356 elm_config_font_overlay_set(etc->name, (const char *)font_name, size);
358 elm_config_text_classes_list_free(text_classes);
361 /* add new function */
362 #ifdef USE_EFL_ASSIST
363 ea_theme_system_font_set(font_name, font_size);
364 ea_theme_system_fonts_apply();
367 elm_config_font_overlay_apply();
368 elm_config_all_flush();
374 /* LCOV_EXCL_START */
375 void __font_size_set()
378 Eina_List *text_classes = NULL;
379 Elm_Text_Class *etc = NULL;
380 const Eina_List *l = NULL;
381 int font_size = __font_size_get();
382 char *font_name = _get_cur_font();
384 if (font_size == -1) {
388 text_classes = elm_config_text_classes_list_get();
390 EINA_LIST_FOREACH(text_classes, l, etc) {
391 elm_config_font_overlay_set(etc->name, font_name, font_size);
394 elm_config_text_classes_list_free(text_classes);
396 #ifdef USE_EFL_ASSIST
397 ea_theme_system_font_set(font_name, font_size);
398 ea_theme_system_fonts_apply();
401 elm_config_font_overlay_apply();
402 elm_config_all_flush();
410 /* LCOV_EXCL_START */
411 static int __font_size_get()
416 int vconf_value = -1;
417 if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
421 switch (vconf_value) {
422 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
423 font_size = SMALL_FONT_DPI;
425 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
426 font_size = MIDDLE_FONT_DPI;
428 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
429 font_size = LARGE_FONT_DPI;
431 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
432 font_size = HUGE_FONT_DPI;
434 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
435 font_size = GIANT_FONT_DPI;
438 font_size = MIDDLE_FONT_DPI;