13 #include <libxml/xmlmemory.h>
14 #include <libxml/parser.h>
16 #include <fontconfig/fontconfig.h>
18 #include <Elementary.h>
20 #include <Ecore_Evas.h>
22 #include <pkgmgr-info.h>
24 #include <system_settings.h>
25 #include <system_settings_private.h>
27 #include <tzplatform_config.h>
28 #include <system_settings_util.h>
29 #include <system_settings_font.h>
32 #define SMALL_FONT_DPI (-90)
35 #define SMALL_FONT_DPI (-80)
37 #define MIDDLE_FONT_DPI (-100)
39 #define LARGE_FONT_DPI (-110)
42 #define LARGE_FONT_DPI (-150)
44 #define HUGE_FONT_DPI (-190)
45 #define GIANT_FONT_DPI (-250)
47 #define SETTING_FONT_PRELOAD_FONT_PATH _TZ_SYS_RO_SHARE"/fonts"
48 #define SETTING_FONT_DOWNLOADED_FONT_PATH _TZ_SYS_SHARE"/fonts"
50 #define SETTING_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
52 #define SETTING_FONT_TIZEN_FONT_ALIAS "Tizen"
53 #define SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS "TizenDefaultFont"
55 #define SETTING_FONT_CONFIG_SO_PATH "/usr/lib/libfontconfig.so.1"
56 #define SETTING_ECORE_EVAS_SO_PATH "/usr/lib/libecore_evas.so.1"
57 #define SETTING_EFL_EXTENSION_SO_PATH "/usr/lib/libefl-extension.so.0"
58 #define SETTING_EVAS_SO_PATH "/usr/lib/libevas.so.1"
60 static int __font_size_get();
62 void *d_font_handle = NULL;
63 void *d_ecore_evas_handle = NULL;
64 void *d_evas_handle = NULL;
65 void *d_efl_eext_handle = NULL;
69 #define DYM_FUNC_LOADING(error, handle, pfunc, func_name) do { \
70 pfunc = (void*)dlsym(handle, func_name); \
71 if ((error = dlerror()) != NULL) { \
72 SETTING_TRACE("ERROR!! canNOT find %s function at %s", func_name, #handle); \
79 #define DYM_CLOSE_HANDLE(handle) do { \
89 int loading_dym_font()
94 d_font_handle = dlopen(SETTING_FONT_CONFIG_SO_PATH, RTLD_LAZY);
96 SETTING_TRACE("ERROR!! canNOT find "SETTING_FONT_CONFIG_SO_PATH);
101 DYM_FUNC_LOADING(error, d_font_handle, d_FcInitLoadConfigAndFonts, "FcInitLoadConfigAndFonts");
102 DYM_FUNC_LOADING(error, d_font_handle, d_FcPatternBuild, "FcPatternBuild");
103 DYM_FUNC_LOADING(error, d_font_handle, d_FcConfigDestroy, "FcConfigDestroy");
104 DYM_FUNC_LOADING(error, d_font_handle, d_FcConfigSubstitute, "FcConfigSubstitute");
105 DYM_FUNC_LOADING(error, d_font_handle, d_FcDefaultSubstitute, "FcDefaultSubstitute");
106 DYM_FUNC_LOADING(error, d_font_handle, d_FcFontSort, "FcFontSort");
107 DYM_FUNC_LOADING(error, d_font_handle, d_FcPatternGetString, "FcPatternGetString");
108 DYM_FUNC_LOADING(error, d_font_handle, d_FcFontSetDestroy, "FcFontSetDestroy");
109 DYM_FUNC_LOADING(error, d_font_handle, d_FcPatternDestroy, "FcPatternDestroy");
110 DYM_FUNC_LOADING(error, d_font_handle, d_FcPatternCreate, "FcPatternCreate");
111 DYM_FUNC_LOADING(error, d_font_handle, d_FcObjectSetBuild, "FcObjectSetBuild");
112 DYM_FUNC_LOADING(error, d_font_handle, d_FcFontList, "FcFontList");
113 DYM_FUNC_LOADING(error, d_font_handle, d_FcObjectSetDestroy, "FcObjectSetDestroy");
119 int loading_dym_efl()
123 if (!d_ecore_evas_handle) {
124 d_ecore_evas_handle = dlopen(SETTING_ECORE_EVAS_SO_PATH, RTLD_LAZY);
125 if (!d_ecore_evas_handle) {
126 SETTING_TRACE("ERROR!! canNOT find"SETTING_ECORE_EVAS_SO_PATH);
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);
139 DYM_FUNC_LOADING(error, d_evas_handle, d_evas_init, "evas_init");
140 DYM_FUNC_LOADING(error, d_evas_handle, d_evas_object_image_add, "evas_object_image_add");
141 DYM_FUNC_LOADING(error, d_evas_handle, d_evas_object_image_file_set, "evas_object_image_file_set");
142 DYM_FUNC_LOADING(error, d_evas_handle, d_evas_object_image_load_error_get, "evas_object_image_load_error_get");
143 DYM_FUNC_LOADING(error, d_evas_handle, d_evas_shutdown, "evas_shutdown");
145 DYM_FUNC_LOADING(error, d_ecore_evas_handle, d_ecore_evas_new, "ecore_evas_new");
146 DYM_FUNC_LOADING(error, d_ecore_evas_handle, d_ecore_evas_get, "ecore_evas_get");
147 DYM_FUNC_LOADING(error, d_ecore_evas_handle, d_ecore_evas_free, "ecore_evas_free");
154 DYM_CLOSE_HANDLE(d_evas_handle);
155 DYM_CLOSE_HANDLE(d_ecore_evas_handle);
158 int loading_dym_efl_eext()
162 if (!d_efl_eext_handle) {
163 d_efl_eext_handle = dlopen(SETTING_EFL_EXTENSION_SO_PATH, RTLD_LAZY);
164 if (!d_efl_eext_handle) {
165 SETTING_TRACE("ERROR!! canNOT find "SETTING_EFL_EXTENSION_SO_PATH);
171 DYM_FUNC_LOADING(error, d_efl_eext_handle, d_eext_config_font_set, "eext_config_font_set");
176 /* Returned family name should be free'd manually. */
177 char *__get_main_font_family_name_by_alias(char *alias)
180 FcFontSet *set = NULL;
181 FcPattern *pat = NULL;
182 FcConfig *font_config = NULL;
183 FcChar8 *family = NULL;
187 if (!loading_dym_font())
190 font_config = d_FcInitLoadConfigAndFonts();
191 if (font_config == NULL) {
192 DYM_CLOSE_HANDLE(d_font_handle);
196 pat = d_FcPatternBuild(0, FC_FAMILY, FcTypeString, alias, (char *)0);
199 if (font_config != NULL) {
200 d_FcConfigDestroy(font_config);
203 DYM_CLOSE_HANDLE(d_font_handle);
207 d_FcConfigSubstitute(font_config, pat, FcMatchPattern);
208 d_FcDefaultSubstitute(pat);
211 set = d_FcFontSort(font_config, pat, FcTrue, NULL, &res);
213 if (set != NULL && (set->nfont > 0)) {
214 d_FcPatternGetString(set->fonts[0], FC_FAMILY, 0, &family);
215 ret = g_strdup((char *)family);
217 d_FcFontSetDestroy(set);
222 d_FcFontSetDestroy(set);
227 d_FcPatternDestroy(pat);
231 if (font_config != NULL) {
232 d_FcConfigDestroy(font_config);
235 DYM_CLOSE_HANDLE(d_font_handle);
239 /* LCOV_EXCL_START */
240 bool __is_supported_image_type_load(char *path)
248 if (!d_evas_init()) {
253 ee = d_ecore_evas_new(NULL, 0, 0, 100, 100, NULL);
254 evas = d_ecore_evas_get(ee);
256 Evas_Object *img = d_evas_object_image_add(evas);
257 d_evas_object_image_file_set(img, path, NULL);
258 Evas_Load_Error ret = d_evas_object_image_load_error_get(img);
261 if (ret == EVAS_LOAD_ERROR_NONE) {
262 SETTING_TRACE("%s - OK", path);
265 SETTING_TRACE("%s - NO", path);
268 d_ecore_evas_free(ee);
275 /* LCOV_EXCL_START */
276 void font_config_set_notification()
281 Ecore_X_Window ecore_win = ecore_x_window_root_first_get();
282 Ecore_X_Atom atom = ecore_x_atom_get("FONT_TYPE_change");
283 ecore_x_window_prop_string_set(ecore_win, atom, "tizen");
288 /* LCOV_EXCL_START */
289 int __is_available_font(char *font_name)
292 FcObjectSet *os = NULL;
293 FcFontSet *fs = NULL;
294 FcPattern *pat = NULL;
295 FcConfig *font_config = NULL;
298 if (!loading_dym_font())
301 if (font_name == NULL) {
302 DYM_CLOSE_HANDLE(d_font_handle);
306 font_config = d_FcInitLoadConfigAndFonts();
308 /*setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts"); */
310 char *locale = setlocale(0, NULL);
312 pat = d_FcPatternCreate();
314 os = d_FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
317 fs = d_FcFontList(font_config, pat, os);
318 d_FcObjectSetDestroy(os);
323 d_FcPatternDestroy(pat);
329 SETTING_TRACE("fs->nfont = %d", fs->nfont);
331 for (j = 0; j < fs->nfont; j++) {
332 FcChar8 *family = NULL;
333 FcChar8 *file = NULL;
335 if (d_FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
336 int preload_path_len = strlen(SETTING_FONT_PRELOAD_FONT_PATH);
337 int download_path_len = strlen(SETTING_FONT_DOWNLOADED_FONT_PATH);
339 if (file && (!strncmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len)
340 || !strncmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len))) {
341 char *family_result = NULL;
342 FcChar8 *lang = NULL;
344 if (d_FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
347 if (d_FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
350 family_result = (char *)family;
352 /* Find proper family name for current locale. */
353 while (locale && family && lang) {
354 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
355 family_result = (char *)family;
359 /* I will set english as default family language. */
360 /* If there is no proper family language for current locale, */
361 /* we have to show the english family name. */
362 if (!strcmp((char *)lang, (char *)"en")) {
363 family_result = (char *)family;
366 if (d_FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
369 if (d_FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
375 SETTING_TRACE("-------- FONT - family_result = %s", (char *)family_result);
376 if (strcmp(family_result, font_name) == 0) {
384 d_FcFontSetDestroy(fs);
387 d_FcConfigDestroy(font_config);
389 DYM_CLOSE_HANDLE(d_font_handle);
395 char *_get_default_font()
397 return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS);
401 /* LCOV_EXCL_START */
402 bool font_config_set(char *font_name)
405 if (!loading_dym_efl_eext())
407 int font_size = __font_size_get();
408 bool ret = d_eext_config_font_set(font_name, font_size);
409 DYM_CLOSE_HANDLE(d_efl_eext_handle);
414 /* LCOV_EXCL_START */
415 void __font_size_set()
418 if (!loading_dym_efl_eext())
420 int font_size = __font_size_get();
421 char *font_name = NULL;
422 font_name = vconf_get_str(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME);
424 d_eext_config_font_set(font_name, font_size);
426 DYM_CLOSE_HANDLE(d_efl_eext_handle);
431 /* LCOV_EXCL_START */
432 static int __font_size_get()
437 int vconf_value = -1;
438 if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
442 switch (vconf_value) {
443 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
444 font_size = SMALL_FONT_DPI;
446 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
447 font_size = MIDDLE_FONT_DPI;
449 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
450 font_size = LARGE_FONT_DPI;
452 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
453 font_size = HUGE_FONT_DPI;
455 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
456 font_size = GIANT_FONT_DPI;
459 font_size = MIDDLE_FONT_DPI;