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();
74 pat = FcPatternBuild(0, FC_FAMILY, FcTypeString, alias, (char *)0);
75 FcConfigSubstitute(font_config, pat, FcMatchPattern);
76 FcDefaultSubstitute(pat);
79 set = FcFontSort(font_config, pat, FcTrue, NULL, &res);
81 if (set && (set->nfont > 0)) {
82 FcPatternGetString(set->fonts[0], FC_FAMILY, 0, &family);
83 ret = g_strdup((char *)family);
85 FcFontSetDestroy(set);
90 FcPatternDestroy(pat);
94 FcConfigDestroy(font_config);
100 /* LCOV_EXCL_START */
101 bool __is_supported_image_type_load(char *path)
108 ee = ecore_evas_new(NULL, 0, 0, 100, 100, NULL);
109 evas = ecore_evas_get(ee);
111 Evas_Object *img = evas_object_image_add(evas);
112 evas_object_image_file_set(img, path, NULL);
113 Evas_Load_Error ret = evas_object_image_load_error_get(img);
116 if (ret == EVAS_LOAD_ERROR_NONE) {
117 SETTING_TRACE("%s - OK", path);
120 SETTING_TRACE("%s - NO", path);
129 char *_get_cur_font()
131 return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_FONT_ALIAS);
134 /* LCOV_EXCL_START */
135 void font_config_set_notification()
140 Ecore_X_Window ecore_win = ecore_x_window_root_first_get();
141 Ecore_X_Atom atom = ecore_x_atom_get("FONT_TYPE_change");
142 ecore_x_window_prop_string_set(ecore_win, atom, "tizen");
147 /* LCOV_EXCL_START */
148 int __is_available_font(char *font_name)
151 FcObjectSet *os = NULL;
152 FcFontSet *fs = NULL;
153 FcPattern *pat = NULL;
154 FcConfig *font_config = NULL;
158 if (font_name == NULL)
161 font_config = FcInitLoadConfigAndFonts();
163 /*setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts"); */
165 char *locale = setlocale(0, NULL);
167 pat = FcPatternCreate();
169 os = FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
172 fs = FcFontList(font_config, pat, os);
173 FcObjectSetDestroy(os);
178 FcPatternDestroy(pat);
184 SETTING_TRACE("fs->nfont = %d", fs->nfont);
186 for (j = 0; j < fs->nfont; j++) {
187 FcChar8 *family = NULL;
188 FcChar8 *file = NULL;
190 if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
191 int preload_path_len = strlen(SETTING_FONT_PRELOAD_FONT_PATH);
192 int download_path_len = strlen(SETTING_FONT_DOWNLOADED_FONT_PATH);
194 if (file && (!strncmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len)
195 || !strncmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len))) {
196 char *family_result = NULL;
197 FcChar8 *lang = NULL;
199 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
202 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
205 family_result = (char *)family;
207 /* Find proper family name for current locale. */
208 while (locale && family && lang) {
209 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
210 family_result = (char *)family;
214 /* I will set english as default family language. */
215 /* If there is no proper family language for current locale, */
216 /* we have to show the english family name. */
217 if (!strcmp((char *)lang, (char *)"en")) {
218 family_result = (char *)family;
221 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
224 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
230 SETTING_TRACE("-------- FONT - family_result = %s", (char *)family_result);
231 if (strcmp(family_result, font_name) == 0) {
239 FcFontSetDestroy(fs);
242 FcConfigDestroy(font_config);
249 char *_get_default_font()
251 return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS);
254 /* LCOV_EXCL_START */
255 bool font_config_set(char *font_name)
258 Eina_List *text_classes = NULL;
259 Elm_Text_Class *etc = NULL;
260 const Eina_List *l = NULL;
261 Eina_List *fo_list = NULL;
262 Elm_Font_Overlay *efo = NULL;
264 int font_size = __font_size_get();
267 text_classes = elm_config_text_classes_list_get();
269 fo_list = (Eina_List *)elm_config_font_overlay_list_get();
271 Eina_List *ll = NULL;
272 Eina_List *l_next = NULL;
274 Eina_Bool slp_medium_exist = EINA_FALSE;
275 Eina_Bool slp_roman_exist = EINA_FALSE;
276 Eina_Bool slp_bold_exist = EINA_FALSE;
277 Eina_Bool slp_regular_exist = EINA_FALSE;
280 Eina_Bool tizen_exist = EINA_FALSE;
282 EINA_LIST_FOREACH_SAFE(fo_list, ll, l_next, efo) {
283 if (!strcmp(efo->text_class, "tizen_medium")) {
284 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
285 slp_medium_exist = EINA_TRUE;
286 } else if (!strcmp(efo->text_class, "tizen_roman")) {
287 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
288 slp_roman_exist = EINA_TRUE;
289 } else if (!strcmp(efo->text_class, "tizen_bold")) {
290 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
291 slp_bold_exist = EINA_TRUE;
292 } else if (!strcmp(efo->text_class, "tizen_regular")) {
293 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
294 slp_regular_exist = EINA_TRUE;
298 if (!strcmp(efo->text_class, "tizen")) {
299 elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
300 tizen_exist = EINA_TRUE;
305 /* if slp_XX do not exist, need to set them, font size is -100(100%) */
306 if (slp_medium_exist == EINA_FALSE) {
307 elm_config_font_overlay_set("tizen_medium", (const char *)font_name, MIDDLE_FONT_DPI);
309 if (slp_roman_exist == EINA_FALSE) {
310 elm_config_font_overlay_set("tizen_roman", (const char *)font_name, MIDDLE_FONT_DPI);
312 if (slp_bold_exist == EINA_FALSE) {
313 elm_config_font_overlay_set("tizen_bold", (const char *)font_name, MIDDLE_FONT_DPI);
315 if (slp_regular_exist == EINA_FALSE) {
316 elm_config_font_overlay_set("tizen_regular", (const char *)font_name, MIDDLE_FONT_DPI);
320 if (tizen_exist == EINA_FALSE) {
321 elm_config_font_overlay_set("tizen", (const char *)font_name, MIDDLE_FONT_DPI);
324 elm_config_font_overlay_set("tizen", (const char *)font_name, MIDDLE_FONT_DPI);
327 elm_config_font_overlay_set("tizen", (const char *)font_name, MIDDLE_FONT_DPI);
329 EINA_LIST_FOREACH(text_classes, l, etc) {
333 EINA_LIST_FOREACH(fo_list, ll, efo) {
334 if (!strcmp(etc->name, efo->text_class)) {
338 elm_config_font_overlay_set(etc->name, (const char *)font_name, size);
340 elm_config_text_classes_list_free(text_classes);
343 /* add new function */
344 #ifdef USE_EFL_ASSIST
345 ea_theme_system_font_set(font_name, font_size);
346 ea_theme_system_fonts_apply();
349 elm_config_font_overlay_apply();
350 elm_config_all_flush();
356 /* LCOV_EXCL_START */
357 void __font_size_set()
360 Eina_List *text_classes = NULL;
361 Elm_Text_Class *etc = NULL;
362 const Eina_List *l = NULL;
363 int font_size = __font_size_get();
364 char *font_name = _get_cur_font();
366 if (font_size == -1) {
370 text_classes = elm_config_text_classes_list_get();
372 EINA_LIST_FOREACH(text_classes, l, etc) {
373 elm_config_font_overlay_set(etc->name, font_name, font_size);
376 elm_config_text_classes_list_free(text_classes);
378 #ifdef USE_EFL_ASSIST
379 ea_theme_system_font_set(font_name, font_size);
380 ea_theme_system_fonts_apply();
383 elm_config_font_overlay_apply();
384 elm_config_all_flush();
392 /* LCOV_EXCL_START */
393 static int __font_size_get()
398 int vconf_value = -1;
399 if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
403 switch (vconf_value) {
404 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
405 font_size = SMALL_FONT_DPI;
407 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
408 font_size = MIDDLE_FONT_DPI;
410 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
411 font_size = LARGE_FONT_DPI;
413 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
414 font_size = HUGE_FONT_DPI;
416 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
417 font_size = GIANT_FONT_DPI;
420 font_size = MIDDLE_FONT_DPI;