14 #include <libxml/xmlmemory.h>
15 #include <libxml/parser.h>
17 #include <fontconfig/fontconfig.h>
19 #include <pkgmgr-info.h>
21 #include <system_settings.h>
22 #include <system_settings_private.h>
24 #include <tzplatform_config.h>
25 #include <system_settings_util.h>
26 #include <system_settings_font.h>
29 #define SMALL_FONT_DPI (-90)
32 #define SMALL_FONT_DPI (-80)
34 #define MIDDLE_FONT_DPI (-100)
36 #define LARGE_FONT_DPI (-110)
39 #define LARGE_FONT_DPI (-150)
41 #define HUGE_FONT_DPI (-190)
42 #define GIANT_FONT_DPI (-250)
44 #define SETTING_FONT_PRELOAD_FONT_PATH _TZ_SYS_RO_SHARE"/fonts"
45 #define SETTING_FONT_DOWNLOADED_FONT_PATH _TZ_SYS_SHARE"/fonts"
47 #define SETTING_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
49 #define SETTING_FONT_TIZEN_FONT_ALIAS "Tizen"
50 #define SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS "TizenDefaultFont"
52 #define SETTING_FONT_CONFIG_SO_PATH "/usr/lib/libfontconfig.so.1"
53 #define SETTING_ECORE_EVAS_SO_PATH "/usr/lib/libecore_evas.so.1"
54 #define SETTING_EFL_EXTENSION_SO_PATH "/usr/lib/libefl-extension.so.0"
55 #define SETTING_EVAS_SO_PATH "/usr/lib/libevas.so.1"
57 static int __font_size_get();
59 void *d_font_handle = NULL;
60 void *d_ecore_evas_handle = NULL;
61 void *d_evas_handle = NULL;
62 void *d_efl_eext_handle = NULL;
66 #define DYM_FUNC_LOADING(error, handle, pfunc, func_name) do { \
67 pfunc = (void*)dlsym(handle, func_name); \
68 if ((error = dlerror()) != NULL) { \
69 SETTING_TRACE("ERROR!! canNOT find %s function at %s", func_name, #handle); \
76 #define DYM_CLOSE_HANDLE(handle) do { \
83 int loading_dym_font(f_libs *font_lib)
91 d_font_handle = dlopen(SETTING_FONT_CONFIG_SO_PATH, RTLD_LAZY);
93 SETTING_TRACE("ERROR!! canNOT find "SETTING_FONT_CONFIG_SO_PATH);
98 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcInitLoadConfigAndFonts, "FcInitLoadConfigAndFonts");
99 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternBuild, "FcPatternBuild");
100 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcConfigDestroy, "FcConfigDestroy");
101 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcConfigSubstitute, "FcConfigSubstitute");
102 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcDefaultSubstitute, "FcDefaultSubstitute");
103 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcFontSort, "FcFontSort");
104 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternGetString, "FcPatternGetString");
105 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcFontSetDestroy, "FcFontSetDestroy");
106 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternDestroy, "FcPatternDestroy");
107 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternCreate, "FcPatternCreate");
108 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcObjectSetBuild, "FcObjectSetBuild");
109 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcFontList, "FcFontList");
110 DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcObjectSetDestroy, "FcObjectSetDestroy");
115 int loading_dym_efl(e_libs *efl_libs)
122 if (!d_ecore_evas_handle) {
123 d_ecore_evas_handle = dlopen(SETTING_ECORE_EVAS_SO_PATH, RTLD_LAZY);
124 if (!d_ecore_evas_handle) {
125 SETTING_TRACE("ERROR!! canNOT find "SETTING_ECORE_EVAS_SO_PATH" %s", dlerror());
131 if (!d_evas_handle) {
132 d_evas_handle = dlopen(SETTING_EVAS_SO_PATH, RTLD_LAZY);
133 if (!d_evas_handle) {
134 SETTING_TRACE("ERROR!! canNOT find "SETTING_EVAS_SO_PATH" %s", dlerror());
139 DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_init, "evas_init");
140 DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_object_image_add, "evas_object_image_add");
141 DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_object_image_file_set, "evas_object_image_file_set");
142 DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_object_image_load_error_get, "evas_object_image_load_error_get");
143 DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_shutdown, "evas_shutdown");
145 DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_init, "ecore_evas_init");
146 DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_shutdown, "ecore_evas_shutdown");
147 DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_new, "ecore_evas_new");
148 DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_get, "ecore_evas_get");
149 DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_free, "ecore_evas_free");
156 DYM_CLOSE_HANDLE(d_evas_handle);
157 DYM_CLOSE_HANDLE(d_ecore_evas_handle);
160 int loading_dym_efl_eext(ex_libs *eext_libs)
167 if (!d_efl_eext_handle) {
168 d_efl_eext_handle = dlopen(SETTING_EFL_EXTENSION_SO_PATH, RTLD_LAZY);
169 if (!d_efl_eext_handle) {
170 SETTING_TRACE("ERROR!! canNOT find "SETTING_EFL_EXTENSION_SO_PATH" %s", dlerror());
175 DYM_FUNC_LOADING(error, d_efl_eext_handle, eext_libs->d_eext_config_font_set, "eext_config_font_set");
180 /* Returned family name should be free'd manually. */
181 char *__get_main_font_family_name_by_alias(char *alias)
184 FcFontSet *set = NULL;
185 FcPattern *pat = NULL;
186 FcConfig *font_config = NULL;
187 FcChar8 *family = NULL;
192 if (!loading_dym_font(&font_libs))
195 font_config = font_libs.d_FcInitLoadConfigAndFonts();
196 if (font_config == NULL) {
197 DYM_CLOSE_HANDLE(d_font_handle);
201 pat = font_libs.d_FcPatternBuild(0, FC_FAMILY, FcTypeString, alias, (char *)0);
204 if (font_config != NULL) {
205 font_libs.d_FcConfigDestroy(font_config);
208 DYM_CLOSE_HANDLE(d_font_handle);
212 font_libs.d_FcConfigSubstitute(font_config, pat, FcMatchPattern);
213 font_libs.d_FcDefaultSubstitute(pat);
216 set = font_libs.d_FcFontSort(font_config, pat, FcTrue, NULL, &res);
218 if (set != NULL && (set->nfont > 0)) {
219 font_libs.d_FcPatternGetString(set->fonts[0], FC_FAMILY, 0, &family);
220 ret = g_strdup((char *)family);
222 font_libs.d_FcFontSetDestroy(set);
227 font_libs.d_FcFontSetDestroy(set);
232 font_libs.d_FcPatternDestroy(pat);
236 if (font_config != NULL) {
237 font_libs.d_FcConfigDestroy(font_config);
240 DYM_CLOSE_HANDLE(d_font_handle);
244 /* LCOV_EXCL_START */
245 bool __is_supported_image_type_load(char *path)
249 if (!loading_dym_efl(&efl_libs)) {
250 SETTING_TRACE("ERROR!! canNOT loading efl!!");
257 if (!efl_libs.d_ecore_evas_init()) {
262 ee = efl_libs.d_ecore_evas_new(NULL, 0, 0, 100, 100, NULL);
263 evas = efl_libs.d_ecore_evas_get(ee);
265 void *img = efl_libs.d_evas_object_image_add(evas);
266 efl_libs.d_evas_object_image_file_set(img, path, NULL);
267 int ret = efl_libs.d_evas_object_image_load_error_get(img);
271 SETTING_TRACE("%s - OK", path);
274 SETTING_TRACE("%s - NO", path);
277 efl_libs.d_ecore_evas_free(ee);
278 efl_libs.d_ecore_evas_shutdown();
284 /* LCOV_EXCL_START */
285 void font_config_set_notification()
291 /* LCOV_EXCL_START */
292 int __is_available_font(char *font_name)
295 FcObjectSet *os = NULL;
296 FcFontSet *fs = NULL;
297 FcPattern *pat = NULL;
298 FcConfig *font_config = NULL;
300 f_libs font_libs = {0};
302 if (!loading_dym_font(&font_libs))
305 if (font_name == NULL) {
306 DYM_CLOSE_HANDLE(d_font_handle);
310 font_config = font_libs.d_FcInitLoadConfigAndFonts();
312 /*setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts"); */
314 char *locale = setlocale(0, NULL);
316 pat = font_libs.d_FcPatternCreate();
318 os = font_libs.d_FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
321 fs = font_libs.d_FcFontList(font_config, pat, os);
322 font_libs.d_FcObjectSetDestroy(os);
327 font_libs.d_FcPatternDestroy(pat);
333 SETTING_TRACE("fs->nfont = %d", fs->nfont);
335 for (j = 0; j < fs->nfont; j++) {
336 FcChar8 *family = NULL;
337 FcChar8 *file = NULL;
339 if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
340 int preload_path_len = strlen(SETTING_FONT_PRELOAD_FONT_PATH);
341 int download_path_len = strlen(SETTING_FONT_DOWNLOADED_FONT_PATH);
343 if (file && (!strncmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len)
344 || !strncmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len))) {
345 char *family_result = NULL;
346 FcChar8 *lang = NULL;
348 if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
351 if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
354 family_result = (char *)family;
356 /* Find proper family name for current locale. */
357 while (locale && family && lang) {
358 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
359 family_result = (char *)family;
363 /* I will set english as default family language. */
364 /* If there is no proper family language for current locale, */
365 /* we have to show the english family name. */
366 if (!strcmp((char *)lang, (char *)"en")) {
367 family_result = (char *)family;
370 if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
373 if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
379 SETTING_TRACE("-------- FONT - family_result = %s", (char *)family_result);
380 if (strcmp(family_result, font_name) == 0) {
388 font_libs.d_FcFontSetDestroy(fs);
391 font_libs.d_FcConfigDestroy(font_config);
393 DYM_CLOSE_HANDLE(d_font_handle);
399 char *_get_default_font()
401 return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS);
405 /* LCOV_EXCL_START */
406 bool font_config_set(char *font_name)
410 if (!loading_dym_efl_eext(&eext_libs))
412 int font_size = __font_size_get();
413 bool ret = eext_libs.d_eext_config_font_set(font_name, font_size);
414 DYM_CLOSE_HANDLE(d_efl_eext_handle);
419 /* LCOV_EXCL_START */
420 void __font_size_set()
424 if (!loading_dym_efl_eext(&eext_libs))
426 int font_size = __font_size_get();
427 char *font_name = NULL;
428 font_name = vconf_get_str(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME);
430 eext_libs.d_eext_config_font_set(font_name, font_size);
432 DYM_CLOSE_HANDLE(d_efl_eext_handle);
437 /* LCOV_EXCL_START */
438 static int __font_size_get()
443 int vconf_value = -1;
444 if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
448 switch (vconf_value) {
449 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
450 font_size = SMALL_FONT_DPI;
452 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
453 font_size = MIDDLE_FONT_DPI;
455 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
456 font_size = LARGE_FONT_DPI;
458 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
459 font_size = HUGE_FONT_DPI;
461 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
462 font_size = GIANT_FONT_DPI;
465 font_size = MIDDLE_FONT_DPI;