From 17504106501cec1a0a85eb380c5dea7e0ca3729c Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 25 Sep 2017 18:34:22 +0900 Subject: [PATCH] evas: Add scale feature for embedded bitmap fonts. Summary: When evas selects a strike of embedded bitmap font, calculate ratio and use it for scaling embedded bitmap. @feature Reviewers: jpeg, tasn, woohyun, raster, herdsman Reviewed By: raster Subscribers: charlesmilette, Francesco149, cedric Differential Revision: https://phab.enlightenment.org/D2713 --- src/lib/efl/interfaces/efl_text_font.eo | 24 ++++ src/lib/evas/canvas/efl_canvas_text.eo | 1 + src/lib/evas/canvas/evas_font_dir.c | 43 +++---- src/lib/evas/canvas/evas_object_text.c | 105 +++++++++++------- src/lib/evas/canvas/evas_object_textblock.c | 24 +++- src/lib/evas/canvas/evas_object_textgrid.c | 92 +++++++++------ src/lib/evas/canvas/evas_text.eo | 3 +- src/lib/evas/canvas/evas_textgrid.eo | 3 +- src/lib/evas/common/evas_draw.h | 2 +- src/lib/evas/common/evas_draw_main.c | 2 +- src/lib/evas/common/evas_font.h | 22 ++-- src/lib/evas/common/evas_font_compress.c | 11 +- src/lib/evas/common/evas_font_draw.c | 60 ++++++---- src/lib/evas/common/evas_font_load.c | 75 ++++++++----- src/lib/evas/common/evas_font_main.c | 53 +++++++++ src/lib/evas/include/evas_common_private.h | 5 +- src/lib/evas/include/evas_private.h | 10 +- .../evas/engines/gl_common/evas_gl_common.h | 2 +- .../evas/engines/gl_common/evas_gl_font.c | 34 +++--- .../engines/software_generic/evas_engine.c | 19 ++-- 20 files changed, 402 insertions(+), 188 deletions(-) diff --git a/src/lib/efl/interfaces/efl_text_font.eo b/src/lib/efl/interfaces/efl_text_font.eo index b43c522c2a..b68e142b6f 100644 --- a/src/lib/efl/interfaces/efl_text_font.eo +++ b/src/lib/efl/interfaces/efl_text_font.eo @@ -37,6 +37,18 @@ enum Efl.Text.Font.Slant { italic, [[Italic font slant]] } +/* FIXME: It needs to support "normal" option for non-color bitmap font. + For supporting "normal" option, S/W glyph drawing engine should be updated. + */ +enum Efl.Text.Font.Bitmap_Scalable { + [[Scalable of bitmap fonts + + @since 1.21 + ]] + none = 0, [[Disable scalable feature for bitmap fonts.]] + color = (1 << 0), [[Enable scalable feature for color bitmap fonts.]] +} + interface Efl.Text.Font { [[Font settings of the text @@ -114,5 +126,17 @@ interface Efl.Text.Font { lang: string; [[Language]] } } + + @property font_bitmap_scalable { + [[The bitmap fonts have fixed size glyphs for several available sizes. + Basically, it is not scalable. But, it needs to be scalable for some use cases. + (ex. colorful emoji fonts) + + Default is $Efl.Text.Font.Bitmap_Scalable.none\. + ]] + values { + scalable: Efl.Text.Font.Bitmap_Scalable; [[Scalable]] + } + } } } diff --git a/src/lib/evas/canvas/efl_canvas_text.eo b/src/lib/evas/canvas/efl_canvas_text.eo index d18c9bf93f..22b8e9dd0d 100644 --- a/src/lib/evas/canvas/efl_canvas_text.eo +++ b/src/lib/evas/canvas/efl_canvas_text.eo @@ -282,6 +282,7 @@ Efl.Text.Font, Efl.Text.Style, Efl.Text.Format, Efl.Text.Cursor, Efl.Text.Annota Efl.Text.Font.font_weight { get; set; } Efl.Text.Font.font_slant { get; set; } Efl.Text.Font.font_width { get; set; } + Efl.Text.Font.font_bitmap_scalable { get; set; } Efl.Text.Style.normal_color { get; set; } Efl.Text.Style.backing_type { get; set; } Efl.Text.Style.backing_color { get; set; } diff --git a/src/lib/evas/canvas/evas_font_dir.c b/src/lib/evas/canvas/evas_font_dir.c index 80e37fad08..6514b0ffd4 100644 --- a/src/lib/evas/canvas/evas_font_dir.c +++ b/src/lib/evas/canvas/evas_font_dir.c @@ -32,6 +32,7 @@ struct _Fndat Evas_Font_Set *font; int ref; Font_Rend_Flags wanted_rend; + Efl_Text_Font_Bitmap_Scalable bitmap_scalable; #ifdef HAVE_FONTCONFIG FcFontSet *set; @@ -235,7 +236,7 @@ evas_font_free(Evas *eo_evas, void *font) #ifdef HAVE_FONTCONFIG static Evas_Font_Set * _evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int size, - Font_Rend_Flags wanted_rend) + Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS); int i; @@ -248,9 +249,9 @@ _evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int si FcPatternGet(set->fonts[i], FC_FILE, 0, &filename); if (font) - evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)filename.u.s, size, wanted_rend); + evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)filename.u.s, size, wanted_rend, bitmap_scalable); else - font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)filename.u.s, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)filename.u.s, size, wanted_rend, bitmap_scalable); } return font; @@ -550,7 +551,7 @@ evas_font_name_parse(Evas_Font_Description *fdesc, const char *name) } void * -evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size) +evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS); #ifdef HAVE_FONTCONFIG @@ -585,8 +586,9 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, if (((!source) && (!fd->source)) || ((source) && (fd->source) && (!strcmp(source, fd->source)))) { - if ((size == fd->size) && - (wanted_rend == fd->wanted_rend)) + if ((size == fd->size) && + (wanted_rend == fd->wanted_rend) && + (bitmap_scalable == fd->bitmap_scalable)) { fonts_cache = eina_list_promote_list(fonts_cache, l); fd->ref++; @@ -605,7 +607,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, #ifdef HAVE_FONTCONFIG if (found_fd) { - font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend); + font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend, bitmap_scalable); goto on_find; } #endif @@ -638,7 +640,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, #ifdef HAVE_FONTCONFIG if (found_fd) { - font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend); + font = _evas_load_fontconfig(font, evas->evas, found_fd->set, size, wanted_rend, bitmap_scalable); goto on_find; } #endif @@ -656,7 +658,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, fake_name = evas_file_path_join(source, nm); if (fake_name) { - font = evas->engine.func->font_load(_evas_engine_context(evas), fake_name, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), fake_name, size, wanted_rend, bitmap_scalable); if (!font) /* Load from fake name failed, probably not cached */ { /* read original!!! */ @@ -669,7 +671,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, fdata = eet_read(ef, nm, &fsize); if (fdata) { - font = evas->engine.func->font_memory_load(_evas_engine_context(evas), source, nm, size, fdata, fsize, wanted_rend); + font = evas->engine.func->font_memory_load(_evas_engine_context(evas), source, nm, size, fdata, fsize, wanted_rend, bitmap_scalable); free(fdata); } eet_close(ef); @@ -681,7 +683,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, if (!font) /* Source load failed */ { if (evas_file_path_is_full_path((char *)nm)) /* Try filename */ - font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)nm, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)nm, size, wanted_rend, bitmap_scalable); else /* search font path */ { Eina_List *ll; @@ -694,7 +696,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend, bitmap_scalable); if (font) break; } } @@ -708,7 +710,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend, bitmap_scalable); if (font) break; } } @@ -729,7 +731,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, if (fake_name) { /* FIXME: make an engine func */ - if (!evas->engine.func->font_add(_evas_engine_context(evas), font, fake_name, size, wanted_rend)) + if (!evas->engine.func->font_add(_evas_engine_context(evas), font, fake_name, size, wanted_rend, bitmap_scalable)) { /* read original!!! */ ef = eet_open(source, EET_FILE_MODE_READ); @@ -741,7 +743,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, fdata = eet_read(ef, nm, &fsize); if ((fdata) && (fsize > 0)) { - ok = evas->engine.func->font_memory_add(_evas_engine_context(evas), font, source, nm, size, fdata, fsize, wanted_rend); + ok = evas->engine.func->font_memory_add(_evas_engine_context(evas), font, source, nm, size, fdata, fsize, wanted_rend, bitmap_scalable); } eet_close(ef); free(fdata); @@ -755,7 +757,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, if (!ok) { if (evas_file_path_is_full_path((char *)nm)) - evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)nm, size, wanted_rend); + evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)nm, size, wanted_rend, bitmap_scalable); else { Eina_List *ll; @@ -769,7 +771,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend); + fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend, bitmap_scalable); if (fn) break; } @@ -784,7 +786,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend); + fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend, bitmap_scalable); if (fn) break; } @@ -854,7 +856,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, } else { - font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend); + font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend, bitmap_scalable); } } else /* Add a fallback list from fontconfig according to the found font. */ @@ -881,7 +883,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, } else { - font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend); + font = _evas_load_fontconfig(font, evas->evas, set, size, wanted_rend, bitmap_scalable); } } #endif @@ -899,6 +901,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, fd->font = font; fd->wanted_rend = wanted_rend; fd->size = size; + fd->bitmap_scalable = bitmap_scalable; fd->ref = 1; fonts_cache = eina_list_prepend(fonts_cache, fd); #ifdef HAVE_FONTCONFIG diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c index 6704bd3239..5108aad00e 100644 --- a/src/lib/evas/canvas/evas_object_text.c +++ b/src/lib/evas/canvas/evas_object_text.c @@ -48,6 +48,7 @@ struct _Evas_Text_Data Evas_Font_Size size; Evas_Text_Style_Type style; + Efl_Text_Font_Bitmap_Scalable bitmap_scalable; } cur, prev; struct { @@ -417,15 +418,59 @@ _evas_text_efl_text_properties_font_source_get(Eo *eo_obj EINA_UNUSED, Evas_Text return o->cur.source; } -EOLIAN static void -_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size) +static void +_evas_text_font_reload(Eo *eo_obj, Evas_Text_Data *o) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE; Eina_Bool source_invisible = EINA_FALSE; - Evas_Font_Description *fdesc; Eina_List *was = NULL; + if (!(obj->layer->evas->is_frozen)) + { + pass = evas_event_passes_through(eo_obj, obj); + freeze = evas_event_freezes_through(eo_obj, obj); + source_invisible = evas_object_is_source_invisible(eo_obj, obj); + if ((!pass) && (!freeze) && (!source_invisible)) + was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj, + 1, 1); + } + + /* DO IT */ + if (o->font) + { + evas_font_free(obj->layer->evas->evas, o->font); + o->font = NULL; + } + + o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source, + (int)(((double) o->cur.size) * obj->cur->scale), o->cur.bitmap_scalable); + { + o->ascent = 0; + o->descent = 0; + o->max_ascent = 0; + o->max_descent = 0; + } + _evas_object_text_items_clear(o); + _evas_object_text_recalc(eo_obj, o->cur.text); + o->changed = 1; + if (o->has_filter) + evas_filter_changed_set(eo_obj, EINA_TRUE); + evas_object_change(eo_obj, obj); + evas_object_clip_dirty(eo_obj, obj); + evas_object_coords_recalc(eo_obj, obj); + if (!obj->layer->evas->is_frozen && !pass && !freeze && obj->cur->visible) + _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL); + eina_list_free(was); + evas_object_inform_call_resize(eo_obj); +} + +EOLIAN static void +_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size) +{ + Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + Evas_Font_Description *fdesc; + if ((!font) || (size <= 0)) return; evas_object_async_block(obj); @@ -455,43 +500,7 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha eina_stringshare_replace(&o->cur.font, font); o->prev.font = NULL; - if (!(obj->layer->evas->is_frozen)) - { - pass = evas_event_passes_through(eo_obj, obj); - freeze = evas_event_freezes_through(eo_obj, obj); - source_invisible = evas_object_is_source_invisible(eo_obj, obj); - if ((!pass) && (!freeze) && (!source_invisible)) - was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj, - 1, 1); - } - - /* DO IT */ - if (o->font) - { - evas_font_free(obj->layer->evas->evas, o->font); - o->font = NULL; - } - - o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source, - (int)(((double) o->cur.size) * obj->cur->scale)); - { - o->ascent = 0; - o->descent = 0; - o->max_ascent = 0; - o->max_descent = 0; - } - _evas_object_text_items_clear(o); - _evas_object_text_recalc(eo_obj, o->cur.text); - o->changed = 1; - if (o->has_filter) - evas_filter_changed_set(eo_obj, EINA_TRUE); - evas_object_change(eo_obj, obj); - evas_object_clip_dirty(eo_obj, obj); - evas_object_coords_recalc(eo_obj, obj); - if (!obj->layer->evas->is_frozen && !pass && !freeze && obj->cur->visible) - _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL); - eina_list_free(was); - evas_object_inform_call_resize(eo_obj); + _evas_text_font_reload(eo_obj, o); } EOLIAN static void @@ -1618,6 +1627,7 @@ evas_object_text_init(Evas_Object *eo_obj) Evas_Text_Data *o = obj->private_data; /* alloc obj private data */ o->prev.ellipsis = o->cur.ellipsis = -1.0; + o->prev.bitmap_scalable = o->cur.bitmap_scalable = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR; o->prev = o->cur; #ifdef BIDI_SUPPORT o->bidi_par_props = evas_bidi_paragraph_props_new(); @@ -2442,6 +2452,21 @@ _evas_text_efl_canvas_object_paragraph_direction_get(Eo *eo_obj EINA_UNUSED, return o->paragraph_direction; } +EOLIAN static void +_evas_text_efl_text_font_font_bitmap_scalable_set(Eo *eo_obj, Evas_Text_Data *o, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) +{ + if (o->cur.bitmap_scalable == bitmap_scalable) return; + o->prev.bitmap_scalable = o->cur.bitmap_scalable; + o->cur.bitmap_scalable = bitmap_scalable; + _evas_text_font_reload(eo_obj, o); +} + +EOLIAN static Efl_Text_Font_Bitmap_Scalable +_evas_text_efl_text_font_font_bitmap_scalable_get(Eo *eo_obj EINA_UNUSED, Evas_Text_Data *o) +{ + return o->cur.bitmap_scalable; +} + #define EVAS_TEXT_EXTRA_OPS \ EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_text_efl_object_dbg_info_get) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index ac39ea65d6..c804522f21 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -512,6 +512,7 @@ struct _Evas_Object_Textblock_Format const char *source; /**< Pointer to object from which to search for the font. */ Evas_Font_Set *font; /**< Pointer to font set. */ Evas_Font_Size size; /**< Size of the font. */ + Efl_Text_Font_Bitmap_Scalable bitmap_scalable; /**< Scalable for bitmap font. */ } font; struct { struct { @@ -629,6 +630,7 @@ struct _Evas_Object_Textblock Efl_Text_Style_Effect_Type effect; Efl_Text_Style_Shadow_Direction shadow_direction; Efl_Text_Format_Wrap wrap; + Efl_Text_Font_Bitmap_Scalable bitmap_scalable; } info; } default_format; double valign; @@ -2826,7 +2828,7 @@ _format_dup(Evas_Object *eo_obj, const Evas_Object_Textblock_Format *fmt) /* FIXME: just ref the font here... */ fmt2->font.font = evas_font_load(obj->layer->evas->evas, fmt2->font.fdesc, - fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur->scale)); + fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur->scale), fmt2->font.bitmap_scalable); if (fmt->gfx_filter) { @@ -3365,6 +3367,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt, c->format_stack = eina_list_prepend(c->format_stack, fmt); *fmt = c->o->default_format.format; fmt->ref = 1; + fmt->font.bitmap_scalable = _FMT_INFO(bitmap_scalable); // Apply font if specified if (_FMT_INFO(font)) @@ -3389,7 +3392,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt, fmt->font.fdesc->width = _FMT_INFO(font_width); fmt->font.fdesc->lang = _FMT_INFO(font_lang); fmt->font.font = evas_font_load(evas_obj->layer->evas->evas, fmt->font.fdesc, - fmt->font.source, (int)(((double) _FMT_INFO(size)) * evas_obj->cur->scale)); + fmt->font.source, (int)(((double) _FMT_INFO(size)) * evas_obj->cur->scale), fmt->font.bitmap_scalable); } if (_FMT_INFO(gfx_filter_name)) { @@ -4490,7 +4493,7 @@ _format_finalize(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt) of = fmt->font.font; fmt->font.font = evas_font_load(obj->layer->evas->evas, fmt->font.fdesc, - fmt->font.source, (int)(((double) fmt->font.size) * obj->cur->scale)); + fmt->font.source, (int)(((double) fmt->font.size) * obj->cur->scale), fmt->font.bitmap_scalable); if (of) evas_font_free(obj->layer->evas->evas, of); } @@ -6760,6 +6763,7 @@ _efl_canvas_text_efl_object_constructor(Eo *eo_obj, Efl_Canvas_Text_Data *class_ _FMT(linerelgap) = 0.0; _FMT(password) = 1; _FMT(ellipsis) = -1; + _FMT_INFO(bitmap_scalable) = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR; return eo_obj; } @@ -15159,6 +15163,20 @@ _efl_canvas_text_efl_text_font_font_width_get(Eo *obj EINA_UNUSED, Efl_Canvas_Te return _FMT_INFO(font_width); } +EOLIAN static void +_efl_canvas_text_efl_text_font_font_bitmap_scalable_set(Eo *obj, Efl_Canvas_Text_Data *o, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) +{ + if (_FMT_INFO(bitmap_scalable) == bitmap_scalable) return; + _FMT_INFO(bitmap_scalable) = bitmap_scalable; + _canvas_text_format_changed(obj, o); +} + +EOLIAN static Efl_Text_Font_Bitmap_Scalable +_efl_canvas_text_efl_text_font_font_bitmap_scalable_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o) +{ + return _FMT_INFO(bitmap_scalable); +} + /* Efl.Text.Style interface implementation */ /* Helper: sets color fields of style 'x' and informs if any are changed. */ diff --git a/src/lib/evas/canvas/evas_object_textgrid.c b/src/lib/evas/canvas/evas_object_textgrid.c index 1a24086d3e..7f6dc76eb6 100644 --- a/src/lib/evas/canvas/evas_object_textgrid.c +++ b/src/lib/evas/canvas/evas_object_textgrid.c @@ -36,6 +36,7 @@ struct _Evas_Textgrid_Data Eina_Array palette_standard; Eina_Array palette_extended; + Efl_Text_Font_Bitmap_Scalable bitmap_scalable; } cur, prev; int ascent; @@ -156,6 +157,7 @@ evas_object_textgrid_init(Evas_Object *eo_obj) Evas_Textgrid_Data *o = obj->private_data; o->magic = MAGIC_OBJ_TEXTGRID; + o->prev.bitmap_scalable = o->cur.bitmap_scalable = EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR; o->prev = o->cur; eina_array_step_set(&o->cur.palette_standard, sizeof (Eina_Array), 16); eina_array_step_set(&o->cur.palette_extended, sizeof (Eina_Array), 16); @@ -1005,7 +1007,8 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj, fdesc, o->cur.font_source, (int)(((double) o->cur.font_size) * - obj->cur->scale)); + obj->cur->scale), + o->cur.bitmap_scalable); if (font) { Eina_Unicode W[2] = { 'O', 0 }; @@ -1054,11 +1057,8 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj, return ret; } -EOLIAN static void -_evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, - Evas_Textgrid_Data *o, - const char *font_name, - Evas_Font_Size font_size) +static void +_evas_textgrid_font_reload(Eo *eo_obj, Evas_Textgrid_Data *o) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE; @@ -1066,30 +1066,7 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, Evas_Font_Description *fdesc; Eina_List *was = NULL; - if ((!font_name) || (!*font_name) || (font_size <= 0)) - return; - - evas_object_async_block(obj); - fdesc = evas_font_desc_new(); - /* Set default language according to locale. */ - eina_stringshare_replace(&(fdesc->lang), - evas_font_lang_normalize("auto")); - evas_font_name_parse(fdesc, font_name); - if (o->cur.font_description_normal && - !evas_font_desc_cmp(fdesc, o->cur.font_description_normal) && - (font_size == o->cur.font_size)) - { - evas_font_desc_unref(fdesc); - return; - } - - if (o->cur.font_description_normal) - evas_font_desc_unref(o->cur.font_description_normal); - o->cur.font_description_normal = fdesc; - - o->cur.font_size = font_size; - eina_stringshare_replace(&o->cur.font_name, font_name); - o->prev.font_name = NULL; + fdesc = o->cur.font_description_normal; if (!(obj->layer->evas->is_frozen)) { @@ -1111,7 +1088,8 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, o->cur.font_description_normal, o->cur.font_source, (int)(((double) o->cur.font_size) * - obj->cur->scale)); + obj->cur->scale), + o->cur.bitmap_scalable); if (o->font_normal) { Eina_Unicode W[2] = { 'O', 0 }; @@ -1244,6 +1222,43 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, evas_object_change(eo_obj, obj); } +EOLIAN static void +_evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, + Evas_Textgrid_Data *o, + const char *font_name, + Evas_Font_Size font_size) +{ + Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + Evas_Font_Description *fdesc; + + if ((!font_name) || (!*font_name) || (font_size <= 0)) + return; + + evas_object_async_block(obj); + fdesc = evas_font_desc_new(); + /* Set default language according to locale. */ + eina_stringshare_replace(&(fdesc->lang), + evas_font_lang_normalize("auto")); + evas_font_name_parse(fdesc, font_name); + if (o->cur.font_description_normal && + !evas_font_desc_cmp(fdesc, o->cur.font_description_normal) && + (font_size == o->cur.font_size)) + { + evas_font_desc_unref(fdesc); + return; + } + + if (o->cur.font_description_normal) + evas_font_desc_unref(o->cur.font_description_normal); + o->cur.font_description_normal = fdesc; + + o->cur.font_size = font_size; + eina_stringshare_replace(&o->cur.font_name, font_name); + o->prev.font_name = NULL; + + _evas_textgrid_font_reload(eo_obj, o); +} + EOLIAN static void _evas_textgrid_efl_text_properties_font_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o, const char **font_name, Evas_Font_Size *font_size) { @@ -1500,6 +1515,21 @@ evas_object_textgrid_font_get(const Eo *obj, const char **font_name, Evas_Font_S efl_text_properties_font_get((Eo *) obj, font_name, font_size); } +EOLIAN static void +_evas_textgrid_efl_text_font_font_bitmap_scalable_set(Eo *eo_obj, Evas_Textgrid_Data *o, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) +{ + if (o->cur.bitmap_scalable == bitmap_scalable) return; + o->prev.bitmap_scalable = o->cur.bitmap_scalable; + o->cur.bitmap_scalable = bitmap_scalable; + _evas_textgrid_font_reload(eo_obj, o); +} + +EOLIAN static Efl_Text_Font_Bitmap_Scalable +_evas_textgrid_efl_text_font_font_bitmap_scalable_get(Eo *eo_obj EINA_UNUSED, Evas_Textgrid_Data *o) +{ + return o->cur.bitmap_scalable; +} + #define EVAS_TEXTGRID_EXTRA_OPS \ EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _evas_textgrid_efl_object_dbg_info_get) diff --git a/src/lib/evas/canvas/evas_text.eo b/src/lib/evas/canvas/evas_text.eo index 017d5b34ca..68623a672e 100644 --- a/src/lib/evas/canvas/evas_text.eo +++ b/src/lib/evas/canvas/evas_text.eo @@ -1,6 +1,6 @@ type @extern Evas.Text_Style_Type : __undefined_type; [[External text style type]] -class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Filter.Internal) +class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Text.Font, Efl.Canvas.Filter.Internal) { [[Evas text class]] legacy_prefix: evas_object_text; @@ -274,6 +274,7 @@ class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Fi Efl.Text.text { get; set; } Efl.Text.Properties.font { get; set; } Efl.Text.Properties.font_source { get; set; } + Efl.Text.Font.font_bitmap_scalable { get; set; } Efl.Gfx.Filter.filter_program { set; } Efl.Canvas.Filter.Internal.filter_dirty; Efl.Canvas.Filter.Internal.filter_input_alpha; diff --git a/src/lib/evas/canvas/evas_textgrid.eo b/src/lib/evas/canvas/evas_textgrid.eo index 2dd3966f2d..369068862b 100644 --- a/src/lib/evas/canvas/evas_textgrid.eo +++ b/src/lib/evas/canvas/evas_textgrid.eo @@ -20,7 +20,7 @@ enum Evas.Textgrid.Font_Style { /* XXX: Actual definition is in C. */ struct Evas.Textgrid.Cell; [[Evas textgrid cell data structure]] -class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties) +class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties, Efl.Text.Font) { [[Evas textgrid class]] legacy_prefix: evas_object_textgrid; @@ -200,5 +200,6 @@ class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties) Efl.Object.destructor; Efl.Text.Properties.font { get; set; } Efl.Text.Properties.font_source { get; set; } + Efl.Text.Font.font_bitmap_scalable { get; set; } } } diff --git a/src/lib/evas/common/evas_draw.h b/src/lib/evas/common/evas_draw.h index 28b7c9429f..e045a186ce 100644 --- a/src/lib/evas/common/evas_draw.h +++ b/src/lib/evas/common/evas_draw.h @@ -11,7 +11,7 @@ EAPI void evas_common_draw_context_font_ext_set (RGBA_D void *data, void *(*gl_new) (void *data, RGBA_Font_Glyph *fg), void (*gl_free) (void *ext_dat), - void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y), + void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h), void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace), void (*gl_image_free) (void *image), void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth)); diff --git a/src/lib/evas/common/evas_draw_main.c b/src/lib/evas/common/evas_draw_main.c index d6b0a8942b..2f3fa949de 100644 --- a/src/lib/evas/common/evas_draw_main.c +++ b/src/lib/evas/common/evas_draw_main.c @@ -215,7 +215,7 @@ evas_common_draw_context_font_ext_set(RGBA_Draw_Context *dc, void *data, void *(*gl_new) (void *data, RGBA_Font_Glyph *fg), void (*gl_free) (void *ext_dat), - void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y), + void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h), void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace), void (*gl_image_free) (void *image), void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth)) diff --git a/src/lib/evas/common/evas_font.h b/src/lib/evas/common/evas_font.h index f9f8026c85..b50b68d530 100644 --- a/src/lib/evas/common/evas_font.h +++ b/src/lib/evas/common/evas_font.h @@ -46,27 +46,27 @@ 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_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 (const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); 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 *source, 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 *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_memory_load (const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); +EAPI RGBA_Font *evas_common_font_load (const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); +EAPI RGBA_Font *evas_common_font_add (RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); +EAPI RGBA_Font *evas_common_font_memory_add (RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); EAPI void evas_common_font_free (RGBA_Font *fn); EAPI void evas_common_font_int_unref (RGBA_Font_Int *fi); 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 *source, 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 *source, 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_memory_hinting_load (const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); +EAPI RGBA_Font *evas_common_font_hinting_load (const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); +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, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); +EAPI RGBA_Font *evas_common_font_memory_hinting_add (RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); 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, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font_Int *evas_common_font_int_find (const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); EAPI void evas_common_font_all_clear (void); EAPI void evas_common_font_ext_clear (void); @@ -85,7 +85,7 @@ EAPI int evas_common_font_query_run_font_end_get(RGBA_Font *fn, RG EAPI void evas_common_font_ascent_descent_get(RGBA_Font *fn, const Evas_Text_Props *text_props, int *ascent, int *descent); EAPI void *evas_common_font_glyph_compress(void *data, int num_grays, int pixel_mode, int pitch_data, int w, int h, int *size_ret); -EAPI void evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, RGBA_Draw_Context *dc, RGBA_Image *dst, int dst_pitch, int x, int y, int cx, int cy, int cw, int ch); +EAPI void evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, RGBA_Draw_Context *dc, RGBA_Image *dst, int dst_pitch, int dx, int dy, int dw, int dh, int cx, int cy, int cw, int ch); EAPI DATA8 *evas_common_font_glyph_uncompress(RGBA_Font_Glyph *fg, int *wret, int *hret); void evas_common_font_load_init(void); diff --git a/src/lib/evas/common/evas_font_compress.c b/src/lib/evas/common/evas_font_compress.c index 3a0e90c64f..5e7658caf8 100644 --- a/src/lib/evas/common/evas_font_compress.c +++ b/src/lib/evas/common/evas_font_compress.c @@ -482,14 +482,19 @@ EAPI void evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, RGBA_Draw_Context *dc, RGBA_Image *dst_image, int dst_pitch, - int x, int y, int cx, int cy, int cw, int ch) + int dx, int dy, int dw, int dh, int cx, int cy, int cw, int ch) { RGBA_Font_Glyph_Out *fgo = fg->glyph_out; - int w, h, x1, x2, y1, y2, i, *iptr; + int x, y, w, h, x1, x2, y1, y2, i, *iptr; DATA32 *dst = dst_image->image.data; DATA32 coltab[16], col; DATA16 mtab[16], v; + // FIXME: Use dw, dh for scaling glyphs... + (void) dw; + (void) dh; + x = dx; + y = dy; w = fgo->bitmap.width; h = fgo->bitmap.rows; // skip if totally clipped out if ((y >= (cy + ch)) || ((y + h) <= cy) || @@ -582,7 +587,7 @@ evas_common_font_glyph_draw(RGBA_Font_Glyph *fg, ptr = dst + (x + x1) + ((y + row) * dst_pitch); buf_ptr = buf + (row * w) + x1; - func(buf_ptr, mask, 0, ptr, x2 - x1); + func(buf_ptr, mask, 0, ptr, w); } } else diff --git a/src/lib/evas/common/evas_font_draw.c b/src/lib/evas/common/evas_font_draw.c index f7fcb13bd8..4bdecddafe 100644 --- a/src/lib/evas/common/evas_font_draw.c +++ b/src/lib/evas/common/evas_font_draw.c @@ -24,16 +24,25 @@ evas_common_font_draw_init(void) } static void * -_evas_font_image_new_from_data(int w, int h, DATA32 *image_data, int alpha, Evas_Colorspace cspace) +_evas_font_image_new(RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace) { + DATA32 *image_data; + int src_w, src_h; + + if (!fg) return NULL; + + image_data = (DATA32 *)fg->glyph_out->bitmap.buffer; + src_w = fg->glyph_out->bitmap.width; + src_h = fg->glyph_out->bitmap.rows; + #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { Evas_Cache2 *cache = evas_common_image_cache2_get(); - return evas_cache2_image_data(cache, w, h, image_data, alpha, cspace); + return evas_cache2_image_data(cache, src_w, src_h, image_data, alpha, cspace); } #endif - return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace); + return evas_cache_image_data(evas_common_image_cache_get(), src_w, src_h, image_data, alpha, cspace); } static void @@ -50,12 +59,15 @@ _evas_font_image_free(void *image) } static void -_evas_font_image_draw(void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +_evas_font_image_draw(void *context, void *surface, void *image, RGBA_Font_Glyph *fg, int x, int y, int w, int h, int smooth) { RGBA_Image *im; + int src_w, src_h; - if (!image) return; + if (!image || !fg) return; im = image; + src_w = fg->glyph_out->bitmap.width; + src_h = fg->glyph_out->bitmap.rows; #ifdef BUILD_PIPE_RENDER if ((eina_cpu_count() > 1)) @@ -66,24 +78,24 @@ _evas_font_image_draw(void *context, void *surface, void *image, int src_x, int #endif evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im), surface, context, smooth, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); + 0, 0, src_w, src_h, + x, y, w, h); evas_common_pipe_image_draw(im, surface, context, smooth, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); + 0, 0, src_w, src_h, + x, y, w, h); } else #endif { evas_common_rgba_image_scalecache_prepare (&im->cache_entry, surface, context, smooth, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); + 0, 0, src_w, src_h, + x, y, w, h); evas_common_rgba_image_scalecache_do (&im->cache_entry, surface, context, smooth, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); + 0, 0, src_w, src_h, + x, y, w, h); evas_common_cpu_end_opt(); } @@ -111,9 +123,20 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int chr_x, chr_y, w, h; fg = glyph->fg; + w = fg->glyph_out->bitmap.width; h = fg->glyph_out->bitmap.rows; + if (FT_HAS_FIXED_SIZES(fg->fi->src->ft.face)) + { + if ((fg->fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) && + FT_HAS_COLOR(fg->fi->src->ft.face)) + { + w *= fg->fi->scale_factor; + h *= fg->fi->scale_factor; + } + } + if ((!fg->ext_dat) && (dc->font_ext.func.gl_new)) { /* extension calls */ @@ -132,9 +155,7 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, } else { - fg->ext_dat = _evas_font_image_new_from_data - (w, h, (DATA32 *)fg->glyph_out->bitmap.buffer, - EINA_TRUE, EVAS_COLORSPACE_ARGB8888); + fg->ext_dat = _evas_font_image_new(fg, EINA_TRUE, EVAS_COLORSPACE_ARGB8888); fg->ext_dat_free = _evas_font_image_free; } } @@ -150,10 +171,11 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, if ((fg->ext_dat) && (dc->font_ext.func.gl_draw)) dc->font_ext.func.gl_draw(dc->font_ext.data, dst, dc, fg, - chr_x, y - (chr_y - y)); + chr_x, y - (chr_y - y), w, h); else + // TODO: scale with evas_font_compress_draw.c... evas_common_font_glyph_draw(fg, dc, dst, im_w, - chr_x, y - (chr_y - y), + chr_x, y - (chr_y - y), w, h, ext_x, ext_y, ext_w, ext_h); } @@ -165,7 +187,7 @@ evas_common_font_rgba_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, chr_x, y - (chr_y - y), w, h, EINA_TRUE); else _evas_font_image_draw - (dc, dst, fg->ext_dat, 0, 0, w, h, + (dc, dst, fg->ext_dat, fg, chr_x, y - (chr_y - y), w, h, EINA_TRUE); } } diff --git a/src/lib/evas/common/evas_font_load.c b/src/lib/evas/common/evas_font_load.c index 2afd124941..6bf1e34a08 100644 --- a/src/lib/evas/common/evas_font_load.c +++ b/src/lib/evas/common/evas_font_load.c @@ -42,9 +42,16 @@ _evas_font_cache_int_cmp(const RGBA_Font_Int *k1, int k1_length EINA_UNUSED, if (k1->src->name == k2->src->name) { if (k1->size == k2->size) - return k1->wanted_rend - k2->wanted_rend; + { + if (k1->wanted_rend == k2->wanted_rend) + return k1->bitmap_scalable - k2->bitmap_scalable; + else + return k1->wanted_rend - k2->wanted_rend; + } else - return k1->size - k2->size; + { + return k1->size - k2->size; + } } return strcmp(k1->src->name, k2->src->name); } @@ -57,6 +64,7 @@ _evas_font_cache_int_hash(const RGBA_Font_Int *key, int key_length EINA_UNUSED) 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)); + hash ^= eina_hash_int32(&key->bitmap_scalable, sizeof (int)); return hash; } @@ -322,13 +330,13 @@ _evas_common_font_int_cache_init(RGBA_Font_Int *fi) } EAPI RGBA_Font_Int * -evas_common_font_int_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) +evas_common_font_int_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font_Int *fi; char *fake_name; fake_name = evas_file_path_join(source, name); - fi = evas_common_font_int_find(fake_name, size, wanted_rend); + fi = evas_common_font_int_find(fake_name, size, wanted_rend, bitmap_scalable); if (fi) { free(fake_name); @@ -350,6 +358,7 @@ evas_common_font_int_memory_load(const char *source, const char *name, int size, return NULL; } fi->size = size; + fi->bitmap_scalable = bitmap_scalable; _evas_common_font_int_cache_init(fi); fi = evas_common_font_int_load_init(fi); evas_common_font_int_load_complete(fi); @@ -374,11 +383,12 @@ evas_common_font_int_memory_load(const char *source, const char *name, int size, EAPI RGBA_Font_Int * evas_common_font_int_load(const char *name, int size, - Font_Rend_Flags wanted_rend) + Font_Rend_Flags wanted_rend, + Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font_Int *fi; - fi = evas_common_font_int_find(name, size, wanted_rend); + fi = evas_common_font_int_find(name, size, wanted_rend, bitmap_scalable); if (fi) return fi; fi = calloc(1, sizeof(RGBA_Font_Int)); if (!fi) return NULL; @@ -393,6 +403,7 @@ evas_common_font_int_load(const char *name, int size, } fi->size = size; fi->wanted_rend = wanted_rend; + fi->bitmap_scalable = bitmap_scalable; _evas_common_font_int_cache_init(fi); fi = evas_common_font_int_load_init(fi); #ifdef EVAS_CSERVE2 @@ -437,6 +448,7 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi) FT_Activate_Size(fi->ft.size); } fi->real_size = fi->size * 64; + fi->scale_factor = 1.0; error = FT_Set_Char_Size(fi->src->ft.face, 0, fi->real_size, font_dpi, font_dpi); if (error) error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size); @@ -468,9 +480,20 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi) FTLOCK(); if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) - error = FT_Select_Size(fi->src->ft.face, strike_index); + { + error = FT_Select_Size(fi->src->ft.face, strike_index); + + if (!error) + { + if (FT_HAS_COLOR(fi->src->ft.face) && + fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) + fi->scale_factor = (float)fi->size * 64.0 / (float)fi->real_size; + } + } else - error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size); + { + error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size); + } FTUNLOCK(); if (error) @@ -543,13 +566,13 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi) } EAPI RGBA_Font * -evas_common_font_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) +evas_common_font_memory_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font *fn; RGBA_Font_Int *fi; fi = evas_common_font_int_memory_load(source, name, size, data, data_size, - wanted_rend); + wanted_rend, bitmap_scalable); if (!fi) return NULL; fn = calloc(1, sizeof(RGBA_Font)); if (!fn) @@ -577,12 +600,12 @@ evas_common_font_memory_load(const char *source, const char *name, int size, con // fi->fs EAPI RGBA_Font * -evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend) +evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font *fn; RGBA_Font_Int *fi; - fi = evas_common_font_int_load(name, size, wanted_rend); + fi = evas_common_font_int_load(name, size, wanted_rend, bitmap_scalable); if (!fi) return NULL; /* First font, complete load */ if (!fi->ft.size) @@ -619,12 +642,12 @@ 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) +evas_common_font_add(RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font_Int *fi; if (!fn) return NULL; - fi = evas_common_font_int_load(name, size, wanted_rend); + fi = evas_common_font_int_load(name, size, wanted_rend, bitmap_scalable); if (fi) { fn->fonts = eina_list_append(fn->fonts, fi); @@ -641,13 +664,13 @@ evas_common_font_add(RGBA_Font *fn, const char *name, int size, Font_Rend_Flags } EAPI RGBA_Font * -evas_common_font_memory_add(RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) +evas_common_font_memory_add(RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font_Int *fi; if (!fn) return NULL; - fi = evas_common_font_int_memory_load(source, name, size, data, data_size, wanted_rend); + fi = evas_common_font_int_memory_load(source, name, size, data, data_size, wanted_rend, bitmap_scalable); if (fi) { fn->fonts = eina_list_append(fn->fonts, fi); @@ -744,38 +767,38 @@ evas_common_hinting_available(Font_Hint_Flags hinting) } EAPI RGBA_Font * -evas_common_font_memory_hinting_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend) +evas_common_font_memory_hinting_load(const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font *fn; - fn = evas_common_font_memory_load(source, name, size, data, data_size, wanted_rend); + fn = evas_common_font_memory_load(source, name, size, data, data_size, wanted_rend, bitmap_scalable); 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, Font_Rend_Flags wanted_rend) +evas_common_font_hinting_load(const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font *fn; - fn = evas_common_font_load(name, size, wanted_rend); + fn = evas_common_font_load(name, size, wanted_rend, bitmap_scalable); 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, Font_Rend_Flags wanted_rend) +evas_common_font_hinting_add(RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { - fn = evas_common_font_add(fn, name, size, wanted_rend); + fn = evas_common_font_add(fn, name, size, wanted_rend, bitmap_scalable); 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 *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend) +evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *source, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { fn = evas_common_font_memory_add(fn, source, name, size, data, data_size, - wanted_rend); + wanted_rend, bitmap_scalable); if (fn) evas_common_font_hinting_set(fn, hinting); return fn; } @@ -939,7 +962,8 @@ evas_common_font_flush_last(void) EAPI RGBA_Font_Int * evas_common_font_int_find(const char *name, int size, - Font_Rend_Flags wanted_rend) + Font_Rend_Flags wanted_rend, + Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { RGBA_Font_Int tmp_fi; RGBA_Font_Source tmp_fn; @@ -949,6 +973,7 @@ evas_common_font_int_find(const char *name, int size, tmp_fi.src = &tmp_fn; tmp_fi.size = size; tmp_fi.wanted_rend = wanted_rend; + tmp_fi.bitmap_scalable = bitmap_scalable; fi = eina_hash_find(fonts, &tmp_fi); if (fi) { diff --git a/src/lib/evas/common/evas_font_main.c b/src/lib/evas/common/evas_font_main.c index 91db4d52ec..0b25e31868 100644 --- a/src/lib/evas/common/evas_font_main.c +++ b/src/lib/evas/common/evas_font_main.c @@ -115,6 +115,14 @@ evas_common_font_instance_ascent_get(RGBA_Font_Int *fi) WRN("NOT SCALABLE!"); } val = (int)fi->src->ft.face->size->metrics.ascender; + + if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) + { + if (FT_HAS_COLOR(fi->src->ft.face) && + fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) + val *= fi->scale_factor; + } + return FONT_METRIC_ROUNDUP(val); // printf("%i | %i\n", val, val >> 6); // if (fi->src->ft.face->units_per_EM == 0) @@ -137,6 +145,14 @@ evas_common_font_instance_descent_get(RGBA_Font_Int *fi) fi->src->current_size = fi->size; } val = -(int)fi->src->ft.face->size->metrics.descender; + + if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) + { + if (FT_HAS_COLOR(fi->src->ft.face) && + fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) + val *= fi->scale_factor; + } + return FONT_METRIC_ROUNDUP(val); // if (fi->src->ft.face->units_per_EM == 0) // return val; @@ -165,6 +181,14 @@ evas_common_font_instance_max_ascent_get(RGBA_Font_Int *fi) val = FONT_METRIC_ROUNDUP((int)fi->src->ft.face->size->metrics.ascender); else val = (int)fi->src->ft.face->bbox.yMax; + + if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) + { + if (FT_HAS_COLOR(fi->src->ft.face) && + fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) + val *= fi->scale_factor; + } + if (fi->src->ft.face->units_per_EM == 0) return val; dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; @@ -192,6 +216,14 @@ evas_common_font_instance_max_descent_get(RGBA_Font_Int *fi) val = FONT_METRIC_ROUNDUP(-(int)fi->src->ft.face->size->metrics.descender); else val = -(int)fi->src->ft.face->bbox.yMin; + + if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) + { + if (FT_HAS_COLOR(fi->src->ft.face) && + fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) + val *= fi->scale_factor; + } + if (fi->src->ft.face->units_per_EM == 0) return val; dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; @@ -244,6 +276,14 @@ evas_common_font_get_line_advance(RGBA_Font *fn) fi->src->current_size = fi->size; } val = (int)fi->src->ft.face->size->metrics.height; + + if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) + { + if ((fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) && + FT_HAS_COLOR(fi->src->ft.face)) + val *= fi->scale_factor; + } + if ((fi->src->ft.face->bbox.yMax == 0) && (fi->src->ft.face->bbox.yMin == 0) && (fi->src->ft.face->units_per_EM == 0)) @@ -558,6 +598,19 @@ evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt idx) fg->width = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMax - outbox.xMin); fg->x_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMin); fg->y_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.yMax); + + if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) + { + if (FT_HAS_COLOR(fi->src->ft.face) && + fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) + { + fg->glyph->advance.x *= fi->scale_factor; + fg->glyph->advance.y *= fi->scale_factor; + fg->width *= fi->scale_factor; + fg->x_bear *= fi->scale_factor; + fg->y_bear *= fi->scale_factor; + } + } } fg->index = idx; diff --git a/src/lib/evas/include/evas_common_private.h b/src/lib/evas/include/evas_common_private.h index a4b3ae3623..12cda89d02 100644 --- a/src/lib/evas/include/evas_common_private.h +++ b/src/lib/evas/include/evas_common_private.h @@ -749,7 +749,7 @@ struct _RGBA_Draw_Context struct { void *(*gl_new) (void *data, RGBA_Font_Glyph *fg); void (*gl_free) (void *ext_dat); - void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y); + void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y, int w, int h); void *(*gl_image_new) (void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace); void (*gl_image_free) (void *image); void (*gl_image_draw) (void *gc, void *im, int dx, int dy, int dw, int dh, int smooth); @@ -1010,6 +1010,7 @@ struct _RGBA_Font_Int Eina_Hash *kerning; Fash_Glyph *fash; unsigned int size; + float scale_factor; int real_size; int max_h; int references; @@ -1033,6 +1034,8 @@ struct _RGBA_Font_Int int generation; + Efl_Text_Font_Bitmap_Scalable bitmap_scalable; + unsigned char sizeok : 1; unsigned char inuse : 1; }; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 12419998de..02c93c54a8 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1501,10 +1501,10 @@ struct _Evas_Func void *(*image_plane_assign) (void *data, void *image, int x, int y); void (*image_plane_release) (void *data, void *image, void *plane); - Evas_Font_Set *(*font_load) (void *engine, const char *name, int size, Font_Rend_Flags wanted_rend); - Evas_Font_Set *(*font_memory_load) (void *engine, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend); - Evas_Font_Set *(*font_add) (void *engine, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend); - Evas_Font_Set *(*font_memory_add) (void *engine, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend); + Evas_Font_Set *(*font_load) (void *engine, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); + Evas_Font_Set *(*font_memory_load) (void *engine, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); + Evas_Font_Set *(*font_add) (void *engine, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); + Evas_Font_Set *(*font_memory_add) (void *engine, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); void (*font_free) (void *engine, Evas_Font_Set *font); int (*font_ascent_get) (void *engine, Evas_Font_Set *font); int (*font_descent_get) (void *engine, Evas_Font_Set *font); @@ -1774,7 +1774,7 @@ void evas_font_desc_unref(Evas_Font_Description *fdesc); int evas_font_desc_cmp(const Evas_Font_Description *a, const Evas_Font_Description *b); Evas_Font_Description *evas_font_desc_ref(Evas_Font_Description *fdesc); const char *evas_font_lang_normalize(const char *lang); -void * evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size); +void * evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char *source, Evas_Font_Size size, Efl_Text_Font_Bitmap_Scalable bitmap_scalable); void evas_font_load_hinting_set(Evas *evas, void *font, int hinting); void evas_object_smart_member_cache_invalidate(Evas_Object *obj, Eina_Bool pass_events, Eina_Bool freeze_events, Eina_Bool sourve_invisible); void evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b); diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h index 6124cf8da0..8e212952c4 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_common.h @@ -748,7 +748,7 @@ Evas_GL_Image *evas_gl_common_image_virtual_scaled_get(Evas_GL_Image *scaled, void *evas_gl_font_texture_new(void *gc, RGBA_Font_Glyph *fg); void evas_gl_font_texture_free(void *); -void evas_gl_font_texture_draw(void *gc, void *surface, void *dc, RGBA_Font_Glyph *fg, int x, int y); +void evas_gl_font_texture_draw(void *gc, void *surface, void *dc, RGBA_Font_Glyph *fg, int x, int y, int w, int h); void *evas_gl_font_image_new(void *gc, RGBA_Font_Glyph *fg, int alpha, Evas_Colorspace cspace); void evas_gl_font_image_free(void *im); void evas_gl_font_image_draw(void *gc, void *im, int dx, int dy, int dw, int dh, int smooth); diff --git a/src/modules/evas/engines/gl_common/evas_gl_font.c b/src/modules/evas/engines/gl_common/evas_gl_font.c index 1b3e35b607..2e2c5263a9 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_font.c +++ b/src/modules/evas/engines/gl_common/evas_gl_font.c @@ -57,7 +57,7 @@ evas_gl_font_texture_free(void *tex) } void -evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_context, RGBA_Font_Glyph *fg, int x, int y) +evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_context, RGBA_Font_Glyph *fg, int x, int y, int w, int h) { Evas_Engine_GL_Context *gc = context; RGBA_Draw_Context *dc = draw_context; @@ -108,25 +108,25 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c { int nx, ny, nw, nh; - nx = x; ny = y; nw = tex->w; nh = tex->h; + nx = x; ny = y; nw = w; nh = h; RECTS_CLIP_TO_RECT(nx, ny, nw, nh, gc->dc->clip.x, gc->dc->clip.y, gc->dc->clip.w, gc->dc->clip.h); if ((nw < 1) || (nh < 1)) return; - if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h)) + if ((nx == x) && (ny == y) && (nw == w) && (nh == h)) { evas_gl_common_context_font_push(gc, tex, 0.0, 0.0, 0.0, 0.0, // sx, sy, sw, sh, - x, y, tex->w, tex->h, + x, y, w, h, mtex, mx, my, mw, mh, mask_smooth, mask_color, r, g, b, a); return; } - ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w)); - ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h)); - ssw = ((double)sw * (double)(nw)) / (double)(tex->w); - ssh = ((double)sh * (double)(nh)) / (double)(tex->h); + ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w)); + ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h)); + ssw = ((double)sw * (double)(nw)) / (double)(w); + ssh = ((double)sh * (double)(nh)) / (double)(h); evas_gl_common_context_font_push(gc, tex, ssx, ssy, ssw, ssh, nx, ny, nw, nh, @@ -138,7 +138,7 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c evas_gl_common_context_font_push(gc, tex, 0.0, 0.0, 0.0, 0.0, // sx, sy, sw, sh, - x, y, tex->w, tex->h, + x, y, w, h, mtex, mx, my, mw, mh, mask_smooth, mask_color, r, g, b, a); } @@ -147,7 +147,7 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c /* save out clip info */ c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h; evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->shared->w, gc->shared->h); - evas_common_draw_context_clip_clip(gc->dc, x, y, tex->w, tex->h); + evas_common_draw_context_clip_clip(gc->dc, x, y, w, h); /* our clip is 0 size.. abort */ if ((gc->dc->clip.w <= 0) || (gc->dc->clip.h <= 0)) { @@ -160,23 +160,23 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c int nx, ny, nw, nh; rct = _evas_gl_common_cutout_rects->rects + i; - nx = x; ny = y; nw = tex->w; nh = tex->h; + nx = x; ny = y; nw = w; nh = h; RECTS_CLIP_TO_RECT(nx, ny, nw, nh, rct->x, rct->y, rct->w, rct->h); if ((nw < 1) || (nh < 1)) continue; - if ((nx == x) && (ny == y) && (nw == tex->w) && (nh == tex->h)) + if ((nx == x) && (ny == y) && (nw == w) && (nh == h)) { evas_gl_common_context_font_push(gc, tex, 0.0, 0.0, 0.0, 0.0, // sx, sy, sw, sh, - x, y, tex->w, tex->h, + x, y, w, h, mtex, mx, my, mw, mh, mask_smooth, mask_color, r, g, b, a); continue; } - ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(tex->w)); - ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(tex->h)); - ssw = ((double)sw * (double)(nw)) / (double)(tex->w); - ssh = ((double)sh * (double)(nh)) / (double)(tex->h); + ssx = (double)sx + ((double)(sw * (nx - x)) / (double)(w)); + ssy = (double)sy + ((double)(sh * (ny - y)) / (double)(h)); + ssw = ((double)sw * (double)(nw)) / (double)(w); + ssh = ((double)sh * (double)(nh)) / (double)(h); evas_gl_common_context_font_push(gc, tex, ssx, ssy, ssw, ssh, nx, ny, nw, nh, diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index d7253de9fb..554fdf8d3b 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -3192,30 +3192,33 @@ eng_image_cache_get(void *data EINA_UNUSED) static Evas_Font_Set * eng_font_load(void *data EINA_UNUSED, const char *name, int size, - Font_Rend_Flags wanted_rend) + Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { - return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend); + return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend, bitmap_scalable); } static Evas_Font_Set * -eng_font_memory_load(void *data EINA_UNUSED, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend) +eng_font_memory_load(void *data EINA_UNUSED, const char *source, const char *name, int size, const void *fdata, int fdata_size, + Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { return (Evas_Font_Set *) evas_common_font_memory_load(source, name, size, - fdata, fdata_size, wanted_rend); + fdata, fdata_size, wanted_rend, bitmap_scalable); } static Evas_Font_Set * -eng_font_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend) +eng_font_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend, + Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { return (Evas_Font_Set *) evas_common_font_add((RGBA_Font *) font, name, - size, wanted_rend); + size, wanted_rend, bitmap_scalable); } static Evas_Font_Set * -eng_font_memory_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend) +eng_font_memory_add(void *data EINA_UNUSED, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, + Font_Rend_Flags wanted_rend, Efl_Text_Font_Bitmap_Scalable bitmap_scalable) { return (Evas_Font_Set *) evas_common_font_memory_add((RGBA_Font *) font, - source, name, size, fdata, fdata_size, wanted_rend); + source, name, size, fdata, fdata_size, wanted_rend, bitmap_scalable); } static void