From ad3b167e889235349a75975a0b7bfc5e7f4f7d97 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Tue, 12 Apr 2011 09:05:47 +0000 Subject: [PATCH] Evas font-engine: Added support for runtime-italic/bold. Now when setting :style=Oblique/Italic/Cursiva/Bold and etc and there's no matching font found in the system, adjustments will be done on runtime to support that feature. Patch by Myoungwoon Roy Kim (roy_kim). SVN revision: 58584 --- legacy/evas/AUTHORS | 1 + legacy/evas/ChangeLog | 7 ++ legacy/evas/src/lib/canvas/evas_font_dir.c | 54 ++++++++------ .../evas/src/lib/engines/common/evas_font.h | 21 +++--- .../src/lib/engines/common/evas_font_draw.c | 16 ++++- .../src/lib/engines/common/evas_font_load.c | 72 +++++++++++++------ .../src/lib/engines/common/evas_text_utils.c | 40 +++++++++++ .../src/lib/engines/common/evas_text_utils.h | 4 ++ legacy/evas/src/lib/include/evas_common.h | 10 +++ legacy/evas/src/lib/include/evas_private.h | 8 +-- .../engines/software_generic/evas_engine.c | 19 ++--- 11 files changed, 184 insertions(+), 68 deletions(-) diff --git a/legacy/evas/AUTHORS b/legacy/evas/AUTHORS index 75b5960810..cb75a4a773 100644 --- a/legacy/evas/AUTHORS +++ b/legacy/evas/AUTHORS @@ -22,3 +22,4 @@ Samsung Electronics Samsung SAIT Sung W. Park Jiyoun Park +Myoungwoon Roy Kim(roy_kim) diff --git a/legacy/evas/ChangeLog b/legacy/evas/ChangeLog index 5911a510c1..457660efde 100644 --- a/legacy/evas/ChangeLog +++ b/legacy/evas/ChangeLog @@ -239,3 +239,10 @@ * Feature: Text & Textblock - Add 8 explicit shadow directions for text style effects. +2011-04-12 Myoungwoon Roy Kim (roy_kim) + + * Font-engine: Added runtime italic (actually slanting) and + emboldening. - Automatically slants/emboldens a font at runtime if + italic/bold/crusiva and etc are requested but not found in the + system. + diff --git a/legacy/evas/src/lib/canvas/evas_font_dir.c b/legacy/evas/src/lib/canvas/evas_font_dir.c index 91eed78159..c0118877c1 100644 --- a/legacy/evas/src/lib/canvas/evas_font_dir.c +++ b/legacy/evas/src/lib/canvas/evas_font_dir.c @@ -26,11 +26,12 @@ typedef struct _Fndat Fndat; struct _Fndat { - const char *name; - const char *source; - int size; - void *font; - int ref; + const char *name; + const char *source; + int size; + void *font; + int ref; + Font_Rend_Flags wanted_rend; #ifdef HAVE_FONTCONFIG FcFontSet *set; @@ -230,7 +231,8 @@ evas_font_init(void) #ifdef HAVE_FONTCONFIG static void * -evas_load_fontconfig(Evas *evas, FcFontSet *set, int size) +evas_load_fontconfig(Evas *evas, FcFontSet *set, int size, + Font_Rend_Flags wanted_rend) { void *font = NULL; int i; @@ -243,9 +245,9 @@ evas_load_fontconfig(Evas *evas, FcFontSet *set, int size) FcPatternGet(set->fonts[i], FC_FILE, 0, &filename); if (font) - evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size); + evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size, wanted_rend); else - font = evas->engine.func->font_load(evas->engine.data.output, (char *)filename.u.s, size); + font = evas->engine.func->font_load(evas->engine.data.output, (char *)filename.u.s, size, wanted_rend); } return font; @@ -271,6 +273,12 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) Eina_List *fonts, *l; Fndat *fd; char *nm; + Font_Rend_Flags wanted_rend = 0; + + if (evas_common_text_font_style_match(name, "Italic")) + wanted_rend |= FONT_REND_ITALIC; + if (evas_common_text_font_style_match(name, "Bold")) + wanted_rend |= FONT_REND_BOLD; if (!name) return NULL; if (name[0] == 0) return NULL; @@ -284,7 +292,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) if (((!source) && (!fd->source)) || ((source) && (fd->source) && (!strcmp(source, fd->source)))) { - if (size == fd->size) + if ((size == fd->size) && (wanted_rend = fd->wanted_rend)) { fonts_cache = eina_list_promote_list(fonts_cache, l); fd->ref++; @@ -293,7 +301,8 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) #ifdef HAVE_FONTCONFIG else if (fd->set && fd->p_nm) { - font = evas_load_fontconfig(evas, fd->set, size); + font = evas_load_fontconfig(evas, fd->set, size, + wanted_rend); goto on_find; } #endif @@ -308,7 +317,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) if (((!source) && (!fd->source)) || ((source) && (fd->source) && (!strcmp(source, fd->source)))) { - if (size == fd->size) + if ((size == fd->size) && (wanted_rend = fd->wanted_rend)) { fonts_zero = eina_list_remove_list(fonts_zero, l); fonts_cache = eina_list_prepend(fonts_cache, fd); @@ -318,13 +327,15 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) #ifdef HAVE_FONTCONFIG else if (fd->set && fd->p_nm) { - font = evas_load_fontconfig(evas, fd->set, size); + font = evas_load_fontconfig(evas, fd->set, size, + wanted_rend); goto on_find; } #endif } } } + fonts = evas_font_set_get(name); EINA_LIST_FOREACH(fonts, l, nm) /* Load each font in append */ { @@ -339,7 +350,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) fake_name = evas_file_path_join(source, nm); if (fake_name) { - font = evas->engine.func->font_load(evas->engine.data.output, fake_name, size); + font = evas->engine.func->font_load(evas->engine.data.output, fake_name, size, wanted_rend); if (!font) /* Load from fake name failed, probably not cached */ { /* read original!!! */ @@ -352,7 +363,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) fdata = eet_read(ef, nm, &fsize); if ((fdata) && (fsize > 0)) { - font = evas->engine.func->font_memory_load(evas->engine.data.output, fake_name, size, fdata, fsize); + font = evas->engine.func->font_memory_load(evas->engine.data.output, fake_name, size, fdata, fsize, wanted_rend); free(fdata); } eet_close(ef); @@ -365,7 +376,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) { #endif if (evas_file_path_is_full_path((char *)nm)) /* Try filename */ - font = evas->engine.func->font_load(evas->engine.data.output, (char *)nm, size); + font = evas->engine.func->font_load(evas->engine.data.output, (char *)nm, size, wanted_rend); else /* search font path */ { Eina_List *l; @@ -378,7 +389,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - font = evas->engine.func->font_load(evas->engine.data.output, f_file, size); + font = evas->engine.func->font_load(evas->engine.data.output, f_file, size, wanted_rend); if (font) break; } } @@ -401,7 +412,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) if (fake_name) { /* FIXME: make an engine func */ - if (!evas->engine.func->font_add(evas->engine.data.output, font, fake_name, size)) + if (!evas->engine.func->font_add(evas->engine.data.output, font, fake_name, size, wanted_rend)) { /* read original!!! */ ef = eet_open(source, EET_FILE_MODE_READ); @@ -413,7 +424,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) fdata = eet_read(ef, nm, &fsize); if ((fdata) && (fsize > 0)) { - ok = evas->engine.func->font_memory_add(evas->engine.data.output, font, fake_name, size, fdata, fsize); + ok = evas->engine.func->font_memory_add(evas->engine.data.output, font, fake_name, size, fdata, fsize, wanted_rend); free(fdata); } eet_close(ef); @@ -428,7 +439,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) { #endif if (evas_file_path_is_full_path((char *)nm)) - evas->engine.func->font_add(evas->engine.data.output, font, (char *)nm, size); + evas->engine.func->font_add(evas->engine.data.output, font, (char *)nm, size, wanted_rend); else { Eina_List *l; @@ -441,7 +452,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - if (evas->engine.func->font_add(evas->engine.data.output, font, f_file, size)) + if (evas->engine.func->font_add(evas->engine.data.output, font, f_file, size, wanted_rend)) break; } } @@ -479,7 +490,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) // to FcTrue... // ok - not a bugfix... but there is something going on somewhere that's wierd? // FcPatternReference(p_nm); /* we have to reference count the pat */ - font = evas_load_fontconfig(evas, set, size); + font = evas_load_fontconfig(evas, set, size, wanted_rend); } } #endif @@ -492,6 +503,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size) if (source) fd->source = eina_stringshare_add(source); fd->size = size; fd->font = font; + fd->wanted_rend = wanted_rend; fd->ref = 1; fonts_cache = eina_list_prepend(fonts_cache, fd); #ifdef HAVE_FONTCONFIG diff --git a/legacy/evas/src/lib/engines/common/evas_font.h b/legacy/evas/src/lib/engines/common/evas_font.h index 6c6d54f44d..f174dbf66d 100644 --- a/legacy/evas/src/lib/engines/common/evas_font.h +++ b/legacy/evas/src/lib/engines/common/evas_font.h @@ -30,27 +30,26 @@ EAPI int evas_common_font_source_load_complete (RGBA_Font_Source * EAPI RGBA_Font_Source *evas_common_font_source_find (const char *name); EAPI void evas_common_font_source_free (RGBA_Font_Source *fs); EAPI void evas_common_font_size_use (RGBA_Font *fn); -EAPI RGBA_Font *evas_common_font_memory_load (const char *name, int size, const void *data, int data_size); -EAPI RGBA_Font_Int *evas_common_font_int_load (const char *name, int size); +EAPI RGBA_Font_Int *evas_common_font_int_load (const char *name, int size, Font_Rend_Flags wanted_rend); EAPI RGBA_Font_Int *evas_common_font_int_load_init (RGBA_Font_Int *fn); EAPI RGBA_Font_Int *evas_common_font_int_load_complete (RGBA_Font_Int *fi); -EAPI RGBA_Font *evas_common_font_memory_load (const char *name, int size, const void *data, int data_size); -EAPI RGBA_Font *evas_common_font_load (const char *name, int size); -EAPI RGBA_Font *evas_common_font_add (RGBA_Font *fn, const char *name, int size); -EAPI RGBA_Font *evas_common_font_memory_add (RGBA_Font *fn, const char *name, int size, const void *data, int data_size); +EAPI RGBA_Font *evas_common_font_memory_load (const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_load (const char *name, int size, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_add (RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_memory_add (RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend); EAPI void evas_common_font_free (RGBA_Font *fn); EAPI void evas_common_font_hinting_set (RGBA_Font *fn, Font_Hint_Flags hinting); EAPI Eina_Bool evas_common_hinting_available (Font_Hint_Flags hinting); -EAPI RGBA_Font *evas_common_font_memory_hinting_load (const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting); -EAPI RGBA_Font *evas_common_font_hinting_load (const char *name, int size, Font_Hint_Flags hinting); -EAPI RGBA_Font *evas_common_font_hinting_add (RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting); -EAPI RGBA_Font *evas_common_font_memory_hinting_add (RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting); +EAPI RGBA_Font *evas_common_font_memory_hinting_load (const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_hinting_load (const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_hinting_add (RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_memory_hinting_add (RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend); EAPI void evas_common_font_int_modify_cache_by (RGBA_Font_Int *fi, int dir); EAPI int evas_common_font_cache_get (void); EAPI void evas_common_font_cache_set (int size); EAPI void evas_common_font_flush (void); EAPI void evas_common_font_flush_last (void); -EAPI RGBA_Font_Int *evas_common_font_int_find (const char *name, int size); +EAPI RGBA_Font_Int *evas_common_font_int_find (const char *name, int size, Font_Rend_Flags wanted_rend); EAPI void evas_common_font_all_clear (void); /* query */ diff --git a/legacy/evas/src/lib/engines/common/evas_font_draw.c b/legacy/evas/src/lib/engines/common/evas_font_draw.c index 5845b35509..8d0b4f6cf7 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_draw.c +++ b/legacy/evas/src/lib/engines/common/evas_font_draw.c @@ -7,9 +7,12 @@ #include "evas_font_ot.h" +#include FT_OUTLINE_H + #define WORD_CACHE_MAXLEN 50 /* How many to cache */ #define WORD_CACHE_NWORDS 40 + static int max_cached_words = WORD_CACHE_NWORDS; struct prword @@ -201,6 +204,7 @@ evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt index) int size; const FT_Int32 hintflags[3] = { FT_LOAD_NO_HINTING, FT_LOAD_FORCE_AUTOHINT, FT_LOAD_NO_AUTOHINT }; + static FT_Matrix transform = {0x10000, 0x05000, 0x0000, 0x10000}; // about 12 degree. evas_common_font_int_promote(fi); if (fi->fash) @@ -217,9 +221,9 @@ evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt index) evas_common_font_int_reload(fi); FTLOCK(); -// error = FT_Load_Glyph(fi->src->ft.face, index, FT_LOAD_NO_BITMAP); error = FT_Load_Glyph(fi->src->ft.face, index, - FT_LOAD_RENDER | hintflags[fi->hinting]); + FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | + hintflags[fi->hinting]); FTUNLOCK(); if (error) { @@ -228,6 +232,14 @@ evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt index) return NULL; } + /* Transform the outline of Glyph according to runtime_rend. */ + if (fi->runtime_rend & FONT_REND_ITALIC) + FT_Outline_Transform(&fi->src->ft.face->glyph->outline, &transform); + /* Embolden the outline of Glyph according to rundtime_rend. */ + if (fi->runtime_rend & FONT_REND_BOLD) + FT_Outline_Embolden(&fi->src->ft.face->glyph->outline, + (fi->src->ft.face->size->metrics.x_ppem * 5 * 64) / 100); + fg = malloc(sizeof(struct _RGBA_Font_Glyph)); if (!fg) return NULL; memset(fg, 0, (sizeof(struct _RGBA_Font_Glyph))); diff --git a/legacy/evas/src/lib/engines/common/evas_font_load.c b/legacy/evas/src/lib/engines/common/evas_font_load.c index 9048d53f8f..e69f20a8e7 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_load.c +++ b/legacy/evas/src/lib/engines/common/evas_font_load.c @@ -26,7 +26,12 @@ _evas_font_cache_int_cmp(const RGBA_Font_Int *k1, int k1_length __UNUSED__, { /* RGBA_Font_Source->name is a stringshare */ if (k1->src->name == k2->src->name) - return k1->size - k2->size; + { + if (k1->size == k2->size) + return k1->wanted_rend - k2->wanted_rend; + else + return k1->size - k2->size; + } return strcmp(k1->src->name, k2->src->name);; } @@ -34,8 +39,10 @@ static int _evas_font_cache_int_hash(const RGBA_Font_Int *key, int key_length __UNUSED__) { int hash; + unsigned int wanted_rend = key->wanted_rend; hash = eina_hash_djb2(key->src->name, eina_stringshare_strlen(key->src->name) + 1); hash ^= eina_hash_int32(&key->size, sizeof (int)); + hash ^= eina_hash_int32(&wanted_rend, sizeof (int)); return hash; } @@ -304,11 +311,11 @@ _evas_common_font_int_cache_init(RGBA_Font_Int *fi) } EAPI RGBA_Font_Int * -evas_common_font_int_memory_load(const char *name, int size, const void *data, int data_size) +evas_common_font_int_memory_load(const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) { RGBA_Font_Int *fi; - fi = evas_common_font_int_find(name, size); + fi = evas_common_font_int_find(name, size, wanted_rend); if (fi) return fi; fi = calloc(1, sizeof(RGBA_Font_Int)); if (!fi) return NULL; @@ -328,23 +335,26 @@ evas_common_font_int_memory_load(const char *name, int size, const void *data, i } EAPI RGBA_Font_Int * -evas_common_font_int_load(const char *name, int size) +evas_common_font_int_load(const char *name, int size, + Font_Rend_Flags wanted_rend) { RGBA_Font_Int *fi; - fi = evas_common_font_int_find(name, size); + fi = evas_common_font_int_find(name, size, wanted_rend); if (fi) return fi; fi = calloc(1, sizeof(RGBA_Font_Int)); if (!fi) return NULL; fi->src = evas_common_font_source_find(name); if (!fi->src && evas_file_path_is_file(name)) fi->src = evas_common_font_source_load(name); + if (!fi->src) { free(fi); return NULL; } fi->size = size; + fi->wanted_rend = wanted_rend; _evas_common_font_int_cache_init(fi); fi = evas_common_font_int_load_init(fi); // evas_common_font_int_load_complete(fi); @@ -431,16 +441,30 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi) } else ret = val; fi->max_h += ret; + + /* If the loaded font doesn't match with wanted_rend value requested by + * textobject and textblock, Set the runtime_rend value as FONT_REND_ITALIC + * or FONT_REND_BOLD for software rendering. */ + fi->runtime_rend = FONT_REND_REGULAR; + if ((fi->wanted_rend & FONT_REND_ITALIC) && + !(fi->src->ft.face->style_flags & FT_STYLE_FLAG_ITALIC)) + fi->runtime_rend |= FONT_REND_ITALIC; + + if ((fi->wanted_rend & FONT_REND_BOLD) && + !(fi->src->ft.face->style_flags & FT_STYLE_FLAG_BOLD)) + fi->runtime_rend |= FONT_REND_BOLD; + return fi; } EAPI RGBA_Font * -evas_common_font_memory_load(const char *name, int size, const void *data, int data_size) +evas_common_font_memory_load(const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) { RGBA_Font *fn; RGBA_Font_Int *fi; - fi = evas_common_font_int_memory_load(name, size, data, data_size); + fi = evas_common_font_int_memory_load(name, size, data, data_size, + wanted_rend); if (!fi) return NULL; fn = calloc(1, sizeof(RGBA_Font)); if (!fn) @@ -479,12 +503,12 @@ evas_common_font_memory_load(const char *name, int size, const void *data, int d // fi->fs EAPI RGBA_Font * -evas_common_font_load(const char *name, int size) +evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend) { RGBA_Font *fn; RGBA_Font_Int *fi; - fi = evas_common_font_int_load(name, size); + fi = evas_common_font_int_load(name, size, wanted_rend); if (!fi) return NULL; /* First font, complete load */ if (!fi->ft.size) @@ -517,6 +541,7 @@ evas_common_font_load(const char *name, int size) } return NULL; } + fn->fonts = eina_list_append(fn->fonts, fi); fn->hinting = FONT_BYTECODE_HINT; fi->hinting = fn->hinting; @@ -537,12 +562,12 @@ evas_common_font_load(const char *name, int size) } EAPI RGBA_Font * -evas_common_font_add(RGBA_Font *fn, const char *name, int size) +evas_common_font_add(RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend) { RGBA_Font_Int *fi; if (!fn) return NULL; - fi = evas_common_font_int_load(name, size); + fi = evas_common_font_int_load(name, size, wanted_rend); if (fi) { fn->fonts = eina_list_append(fn->fonts, fi); @@ -559,13 +584,13 @@ evas_common_font_add(RGBA_Font *fn, const char *name, int size) } EAPI RGBA_Font * -evas_common_font_memory_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size) +evas_common_font_memory_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) { RGBA_Font_Int *fi; if (!fn) return NULL; - fi = evas_common_font_int_memory_load(name, size, data, data_size); + fi = evas_common_font_int_memory_load(name, size, data, data_size, wanted_rend); if (fi) { fn->fonts = eina_list_append(fn->fonts, fi); @@ -672,37 +697,38 @@ evas_common_hinting_available(Font_Hint_Flags hinting) } EAPI RGBA_Font * -evas_common_font_memory_hinting_load(const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting) +evas_common_font_memory_hinting_load(const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend) { RGBA_Font *fn; - fn = evas_common_font_memory_load(name, size, data, data_size); + fn = evas_common_font_memory_load(name, size, data, data_size, wanted_rend); if (fn) evas_common_font_hinting_set(fn, hinting); return fn; } EAPI RGBA_Font * -evas_common_font_hinting_load(const char *name, int size, Font_Hint_Flags hinting) +evas_common_font_hinting_load(const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend) { RGBA_Font *fn; - fn = evas_common_font_load(name, size); + fn = evas_common_font_load(name, size, wanted_rend); if (fn) evas_common_font_hinting_set(fn, hinting); return fn; } EAPI RGBA_Font * -evas_common_font_hinting_add(RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting) +evas_common_font_hinting_add(RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend) { - fn = evas_common_font_add(fn, name, size); + fn = evas_common_font_add(fn, name, size, wanted_rend); if (fn) evas_common_font_hinting_set(fn, hinting); return fn; } EAPI RGBA_Font * -evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting) +evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend) { - fn = evas_common_font_memory_add(fn, name, size, data, data_size); + fn = evas_common_font_memory_add(fn, name, size, data, data_size, + wanted_rend); if (fn) evas_common_font_hinting_set(fn, hinting); return fn; } @@ -881,7 +907,8 @@ evas_common_font_flush_last(void) } EAPI RGBA_Font_Int * -evas_common_font_int_find(const char *name, int size) +evas_common_font_int_find(const char *name, int size, + Font_Rend_Flags wanted_rend) { RGBA_Font_Int tmp_fi; RGBA_Font_Source tmp_fn; @@ -890,6 +917,7 @@ evas_common_font_int_find(const char *name, int size) tmp_fn.name = (char*) eina_stringshare_add(name); tmp_fi.src = &tmp_fn; tmp_fi.size = size; + tmp_fi.wanted_rend = wanted_rend; fi = eina_hash_find(fonts, &tmp_fi); if (fi) { diff --git a/legacy/evas/src/lib/engines/common/evas_text_utils.c b/legacy/evas/src/lib/engines/common/evas_text_utils.c index 616cd7edb3..23e32f6102 100644 --- a/legacy/evas/src/lib/engines/common/evas_text_utils.c +++ b/legacy/evas/src/lib/engines/common/evas_text_utils.c @@ -367,3 +367,43 @@ evas_common_text_props_content_create(void *_fn, const Eina_Unicode *text, return EINA_TRUE; } +Eina_Bool +evas_common_text_font_style_match(const char *font_name, const char *style_name) +{ + char *style_key = NULL; + + if (!font_name) return EINA_FALSE; + if (!style_name) return EINA_FALSE; + style_key = strchr(font_name, ':'); + if (!style_key) return EINA_FALSE; + if (strlen(style_key) > 2) style_key++; + if (strstr(style_key, "style=")) + { + if (!strcmp(style_name, "Italic")) + { + if (strstr(style_key, "Italic") + || strstr(style_key, "italic") + || strstr(style_key, "Cursiva") + || strstr(style_key, "cursiva")) + return EINA_TRUE; + else + return EINA_FALSE; + } + else if (!strcmp(style_name, "Bold")) + { + if (strstr(style_key, "Bold") + || strstr(style_key, "bold") + || strstr(style_key, "Negreta") + || strstr(style_key, "negreta")) + return EINA_TRUE; + else + return EINA_FALSE; + } + else + return EINA_FALSE; + } + else + return EINA_FALSE; +} + + diff --git a/legacy/evas/src/lib/engines/common/evas_text_utils.h b/legacy/evas/src/lib/engines/common/evas_text_utils.h index e4907ab97b..d29d3eb632 100644 --- a/legacy/evas/src/lib/engines/common/evas_text_utils.h +++ b/legacy/evas/src/lib/engines/common/evas_text_utils.h @@ -73,4 +73,8 @@ evas_common_text_props_split(Evas_Text_Props *base, Evas_Text_Props *ext, int cutoff); EAPI void evas_common_text_props_merge(Evas_Text_Props *item1, const Evas_Text_Props *item2); + +Eina_Bool +evas_common_text_font_style_match(const char *font_name, const char *style_name); + #endif diff --git a/legacy/evas/src/lib/include/evas_common.h b/legacy/evas/src/lib/include/evas_common.h index db8fbd8336..379b1ff7b8 100644 --- a/legacy/evas/src/lib/include/evas_common.h +++ b/legacy/evas/src/lib/include/evas_common.h @@ -510,6 +510,13 @@ typedef enum _Font_Hint_Flags FONT_BYTECODE_HINT } Font_Hint_Flags; +typedef enum _Font_Rend_Flags +{ + FONT_REND_REGULAR = 0, + FONT_REND_ITALIC = (1 << 0), + FONT_REND_BOLD = (1 << 1), +} Font_Rend_Flags; + /*****************************************************************************/ struct _RGBA_Image_Loadopts @@ -901,6 +908,9 @@ struct _RGBA_Font_Int } ft; LK(ft_mutex); Font_Hint_Flags hinting; + Font_Rend_Flags wanted_rend; /* The wanted rendering style */ + Font_Rend_Flags runtime_rend; /* The rendering we need to do on runtime + in order to comply with the wanted_rend. */ unsigned char sizeok : 1; unsigned char inuse : 1; }; diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index 0957c6e02a..68af2c53df 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -647,10 +647,10 @@ struct _Evas_Func void (*image_cache_set) (void *data, int bytes); int (*image_cache_get) (void *data); - void *(*font_load) (void *data, const char *name, int size); - void *(*font_memory_load) (void *data, char *name, int size, const void *fdata, int fdata_size); - void *(*font_add) (void *data, void *font, const char *name, int size); - void *(*font_memory_add) (void *data, void *font, char *name, int size, const void *fdata, int fdata_size); + void *(*font_load) (void *data, const char *name, int size, Font_Rend_Flags wanted_rend); + void *(*font_memory_load) (void *data, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend); + void *(*font_add) (void *data, void *font, const char *name, int size, Font_Rend_Flags wanted_rend); + void *(*font_memory_add) (void *data, void *font, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend); void (*font_free) (void *data, void *font); int (*font_ascent_get) (void *data, void *font); int (*font_descent_get) (void *data, void *font); diff --git a/legacy/evas/src/modules/engines/software_generic/evas_engine.c b/legacy/evas/src/modules/engines/software_generic/evas_engine.c index e8200131ac..b5ffb6aee0 100644 --- a/legacy/evas/src/modules/engines/software_generic/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_generic/evas_engine.c @@ -673,27 +673,30 @@ eng_image_cache_get(void *data __UNUSED__) } static void * -eng_font_load(void *data __UNUSED__, const char *name, int size) +eng_font_load(void *data __UNUSED__, const char *name, int size, + Font_Rend_Flags wanted_rend) { - return evas_common_font_load(name, size); + return evas_common_font_load(name, size, wanted_rend); } static void * -eng_font_memory_load(void *data __UNUSED__, char *name, int size, const void *fdata, int fdata_size) +eng_font_memory_load(void *data __UNUSED__, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend) { - return evas_common_font_memory_load(name, size, fdata, fdata_size); + return evas_common_font_memory_load(name, size, fdata, fdata_size, + wanted_rend); } static void * -eng_font_add(void *data __UNUSED__, void *font, const char *name, int size) +eng_font_add(void *data __UNUSED__, void *font, const char *name, int size, Font_Rend_Flags wanted_rend) { - return evas_common_font_add(font, name, size); + return evas_common_font_add(font, name, size, wanted_rend); } static void * -eng_font_memory_add(void *data __UNUSED__, void *font, char *name, int size, const void *fdata, int fdata_size) +eng_font_memory_add(void *data __UNUSED__, void *font, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend) { - return evas_common_font_memory_add(font, name, size, fdata, fdata_size); + return evas_common_font_memory_add(font, name, size, fdata, fdata_size, + wanted_rend); } static void