diff options
author | Daniel Hirt <hirt.danny@gmail.com> | 2017-05-18 13:45:54 +0300 |
---|---|---|
committer | Daniel Hirt <hirt.danny@gmail.com> | 2017-05-20 21:05:39 +0300 |
commit | 1a21d6ec46277e4e9d199a7d9bc4b8555f92e60d (patch) | |
tree | cec0c15e1b4b7f974b6b7cfb1ca38fd99948a5bf | |
parent | 6e380447849c3e9ff437be4d0be09bde479a9721 (diff) | |
download | efl-1a21d6ec46277e4e9d199a7d9bc4b8555f92e60d.tar.gz |
Canvas text: reimpl. font, impl. weight
-rw-r--r-- | src/bin/elementary/test_efl_ui_text.c | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_object_textblock.c | 101 |
2 files changed, 81 insertions, 23 deletions
diff --git a/src/bin/elementary/test_efl_ui_text.c b/src/bin/elementary/test_efl_ui_text.c index 3aa45c75f2..c8c44536b3 100644 --- a/src/bin/elementary/test_efl_ui_text.c +++ b/src/bin/elementary/test_efl_ui_text.c @@ -171,8 +171,9 @@ test_efl_ui_text(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve " new UI Text widget.\xE2\x80\xA9This is the next paragraph.\nThis" " is the next line.\nThis is Yet another line! Line and paragraph" " separators are actually different!"); - efl_text_properties_font_set(en, "Sans", 10); + efl_text_font_set(en, "Sans", 14); efl_text_properties_color_set(en, 255, 255, 255, 255); + efl_text_font_weight_set(en, EFL_TEXT_FONT_WEIGHT_BOLD); main_cur = efl_canvas_text_cursor_get(en); cur = efl_ui_text_cursor_new(en); diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 4712def0ce..623bc90dc0 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -607,11 +607,13 @@ struct _Evas_Object_Textblock int l, r, t, b; } style_pad; struct { - Evas_Object_Textblock_Format format; - struct { - Eina_Stringshare *font; - Evas_Font_Size size; - } info; + Evas_Object_Textblock_Format format; + struct { + Eina_Stringshare *font; + Evas_Font_Size size; + Eina_Stringshare *font_source; + int font_weight; + } info; } default_format; double valign; Eina_Stringshare *markup_text; @@ -3332,7 +3334,13 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt, if (_FMT_INFO(font)) { Evas_Object_Protected_Data *evas_obj = efl_data_scope_get(c->obj, EFL_CANVAS_OBJECT_CLASS); + + if (fmt->font.fdesc) + { + evas_font_desc_unref(fmt->font.fdesc); + } fmt->font.fdesc = evas_font_desc_new(); + evas_font_name_parse(fmt->font.fdesc, _FMT_INFO(font)); eina_stringshare_replace(&(fmt->font.fdesc->lang), evas_font_lang_normalize("auto")); @@ -3340,6 +3348,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt, fmt->font.size = _FMT_INFO(size); 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.fdesc->weight = _FMT_INFO(font_weight); } } @@ -6637,7 +6646,6 @@ _efl_canvas_text_efl_object_constructor(Eo *eo_obj, Efl_Canvas_Text_Data *class_ _FMT(password) = 1; _FMT(ellipsis) = -1; - return eo_obj; } @@ -14993,90 +15001,139 @@ _efl_canvas_text_efl_text_properties_color_get(Eo *eo_obj EINA_UNUSED, Efl_Canva } static void -_efl_canvas_text_efl_text_font_font_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, const char *font EINA_UNUSED, int size EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const char *font EINA_UNUSED, int size EINA_UNUSED) { + Eina_Bool changed = EINA_FALSE; + + Eina_Stringshare *nfont; + + if (o->default_format.info.size != size) + { + o->default_format.info.size = size; + changed = EINA_TRUE; + } + + if (o->default_format.info.font != font) + { + nfont = eina_stringshare_add(font); + if (nfont == _FMT_INFO(font)) + { + /* Already stringshared here, unref */ + eina_stringshare_del(nfont); + } + else + { + // Set immediately, load font later + _FMT_INFO(font) = nfont; + changed = EINA_TRUE; + } + } + + if (changed) + { + _canvas_text_format_changed(obj, o); + } } static void -_efl_canvas_text_efl_text_font_font_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, const char **font EINA_UNUSED, int *size EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const char **font EINA_UNUSED, int *size EINA_UNUSED) { + if (font) *font = o->default_format.info.font; + if (size) *size = o->default_format.info.size; } static void -_efl_canvas_text_efl_text_font_font_source_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, const char *font_source EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_source_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const char *font_source EINA_UNUSED) { + Eina_Stringshare *nfont_source; + if (o->default_format.info.font_source != font_source) + { + nfont_source = eina_stringshare_add(font_source); + if (nfont_source == _FMT_INFO(font_source)) + { + /* Already stringshared here, unref */ + eina_stringshare_del(nfont_source); + } + else + { + // Set immediately, load font_source later + _FMT_INFO(font_source) = nfont_source; + _canvas_text_format_changed(obj, o); + } + } } static const char* -_efl_canvas_text_efl_text_font_font_source_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_source_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED) { - return NULL; + return _FMT_INFO(font_source); } static void -_efl_canvas_text_efl_text_font_font_fallbacks_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, const char *font_fallbacks EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_fallbacks_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const char *font_fallbacks EINA_UNUSED) { } static const char* -_efl_canvas_text_efl_text_font_font_fallbacks_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_fallbacks_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED) { return NULL; } static void -_efl_canvas_text_efl_text_font_font_lang_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, const char *lang EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_lang_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const char *lang EINA_UNUSED) { } static const char* -_efl_canvas_text_efl_text_font_font_lang_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_lang_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED) { return NULL; } static void -_efl_canvas_text_efl_text_font_font_weight_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, Efl_Text_Font_Weight font_weight EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_weight_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Font_Weight font_weight EINA_UNUSED) { + _FMT_INFO(font_weight) = font_weight; } static Efl_Text_Font_Weight -_efl_canvas_text_efl_text_font_font_weight_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_weight_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED) { - return 0; + return _FMT_INFO(font_weight); } static void -_efl_canvas_text_efl_text_font_font_style_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, Efl_Text_Font_Style style EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_style_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Font_Style style EINA_UNUSED) { } static Efl_Text_Font_Style -_efl_canvas_text_efl_text_font_font_style_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_style_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED) { return 0; } static void -_efl_canvas_text_efl_text_font_font_width_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, Efl_Text_Font_Width width EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_width_set(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Font_Width width EINA_UNUSED) { } static Efl_Text_Font_Width -_efl_canvas_text_efl_text_font_font_width_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED) +_efl_canvas_text_efl_text_font_font_width_get(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED) { return 0; } |