raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=75daddc83999403c74cab7b1ed1f8fc3405fd025
commit 75daddc83999403c74cab7b1ed1f8fc3405fd025 Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Sat Nov 11 12:10:32 2017 +0900 Revert "Edje: use textblock by default" This reverts commit ef3d2120bfa58f9247a441602bd30f13cc7f225a. This breaks E. pager ono my right screen looks like: http://devs.enlightenment.org/~raster/shot-2017-11-11_12-13-14.png on my left screen shellf keeps swapping between 2 dizes wobbling back and forth every frame eating cpu and making it "blurry"... note - theme is the flat one in devs/raster/theme/flat2 branch. so this change certainly breaks something... --- src/lib/edje/edje_calc.c | 34 +-- src/lib/edje/edje_load.c | 22 +- src/lib/edje/edje_private.h | 5 - src/lib/edje/edje_textblock.c | 639 +++++++++++------------------------------- src/lib/edje/edje_util.c | 11 +- 5 files changed, 188 insertions(+), 523 deletions(-) diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index be7d9e49b0..1442cb8f14 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -2401,7 +2401,7 @@ _edje_part_recalc_single_filter(Edje *ed, Eina_List *li1, *li2; /* handle TEXT, IMAGE, PROXY, SNAPSHOT part types here */ - if (PART_IS_TEXT(ed, ep)) + if (ep->part->type == EDJE_PART_TYPE_TEXT) { Edje_Part_Description_Text *chosen_edt = (Edje_Part_Description_Text *) chosen_desc; Edje_Part_Description_Text *edt = (Edje_Part_Description_Text *) desc; @@ -2521,10 +2521,6 @@ _edje_part_recalc_single_filter(Edje *ed, } } efl_gfx_filter_program_set(obj, code, filter->name); - if (PART_IS_TEXT(ed, ep)) - { - efl_text_gfx_filter_set(obj, filter->name); - } if (prev_sources != filter_sources) { /* remove sources that are not there anymore @@ -2832,9 +2828,11 @@ _edje_part_recalc_single(Edje *ed, } /* if we have text that wants to make the min size the text size... */ - if (PART_IS_TEXT(ed, ep)) + if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) + _edje_part_recalc_single_textblock(sc, ed, ep, (Edje_Part_Description_Text *)chosen_desc, params, &minw, &minh, &maxw, &maxh); + else if (ep->part->type == EDJE_PART_TYPE_TEXT) { - _edje_part_recalc_single_textblock(sc, ed, ep, (Edje_Part_Description_Text *)chosen_desc, params, &minw, &minh, &maxw, &maxh); + _edje_part_recalc_single_text(sc, ed, ep, (Edje_Part_Description_Text*) desc, (Edje_Part_Description_Text*) chosen_desc, params, &minw, &minh, &maxw, &maxh); _edje_part_recalc_single_filter(ed, ep, desc, chosen_desc, pos); } @@ -4387,6 +4385,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta break; case EDJE_PART_TYPE_TEXT: + _edje_calc_params_need_type_text(p3); + p3->type.text->size = INTP(p1->type.text->size, p2->type.text->size, pos); + EINA_FALLTHROUGH; + + /* no break as we share code with the TEXTBLOCK type here. */ case EDJE_PART_TYPE_TEXTBLOCK: _edje_calc_params_need_type_text(p3); p3->type.text->color2.r = INTP(p1->type.text->color2.r, p2->type.text->color2.r, pos2); @@ -4598,8 +4601,6 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta EINA_FALLTHROUGH; case EDJE_PART_TYPE_RECTANGLE: EINA_FALLTHROUGH; - case EDJE_PART_TYPE_TEXT: - EINA_FALLTHROUGH; case EDJE_PART_TYPE_TEXTBLOCK: EINA_FALLTHROUGH; case EDJE_PART_TYPE_BOX: @@ -4609,18 +4610,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta case EDJE_PART_TYPE_SNAPSHOT: EINA_FALLTHROUGH; case EDJE_PART_TYPE_VECTOR: - if (ep->part->type == EDJE_PART_TYPE_TEXT) - { - evas_object_color_set(ep->object, 255, 255, 255, 255); - } - else - { evas_object_color_set(ep->object, (pf->color.r * pf->color.a) / 255, (pf->color.g * pf->color.a) / 255, (pf->color.b * pf->color.a) / 255, pf->color.a); - } #ifdef HAVE_EPHYSICS /* body attributes should be updated for invisible objects */ @@ -4708,6 +4702,10 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta } break; + case EDJE_PART_TYPE_TEXT: + /* This is correctly handle in _edje_text_recalc_apply at the moment. */ + break; + case EDJE_PART_TYPE_GRADIENT: /* FIXME: definitivly remove this code when we switch to new format. */ abort(); @@ -4912,6 +4910,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta /* Some object need special recalc. */ switch (ep->part->type) { + case EDJE_PART_TYPE_TEXT: + _edje_text_recalc_apply(ed, ep, pf, (Edje_Part_Description_Text*) chosen_desc, EINA_FALSE); + break; case EDJE_PART_TYPE_PROXY: _edje_proxy_recalc_apply(ed, ep, pf, (Edje_Part_Description_Proxy *)chosen_desc, pos); @@ -4929,7 +4930,6 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta _edje_table_recalc_apply(ed, ep, pf, (Edje_Part_Description_Table *)chosen_desc); break; - case EDJE_PART_TYPE_TEXT: case EDJE_PART_TYPE_TEXTBLOCK: _edje_textblock_recalc_apply(ed, ep, pf, (Edje_Part_Description_Text *)chosen_desc); break; diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index c2da41d884..94f8c0e401 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -1045,21 +1045,11 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch break; case EDJE_PART_TYPE_TEXT: - case EDJE_PART_TYPE_TEXTBLOCK: - _edje_textblock_styles_add(ed, rp); - textblocks = eina_list_append(textblocks, rp); - if (rp->part->type == EDJE_PART_TYPE_TEXT) - { - rp->object = efl_add(EFL_CANVAS_TEXT_CLASS, - ed->base.evas); - } - else - { - rp->object = evas_object_textblock_add(ed->base.evas); - } + _edje_text_part_on_add(ed, rp); + rp->object = evas_object_text_add(ed->base.evas); + evas_object_text_font_source_set(rp->object, ed->path); break; - case EDJE_PART_TYPE_GROUP: sources = eina_list_append(sources, rp); @@ -1077,6 +1067,12 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch _edje_callbacks_focus_add(rp->object, ed, rp); break; + case EDJE_PART_TYPE_TEXTBLOCK: + _edje_textblock_styles_add(ed, rp); + textblocks = eina_list_append(textblocks, rp); + rp->object = evas_object_textblock_add(ed->base.evas); + break; + case EDJE_PART_TYPE_BOX: sources = eina_list_append(sources, rp); rp->object = evas_object_box_add(ed->base.evas); diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index f17abdf81c..9f4d07ecab 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -2547,11 +2547,6 @@ const char * _edje_text_class_font_get(Edje *ed, int *size, char **free_later); const char * _edje_text_font_get(const char *base, const char *new, char **free_later); -const char * _set_translated_string(Edje *ed, Edje_Real_Part *ep); - -#define PART_IS_TEXT(ed, ep) \ - (((ep)->part->type == EDJE_PART_TYPE_TEXTBLOCK) || \ - ((ep)->part->type == EDJE_PART_TYPE_TEXT)) void _edje_part_recalc_single_textblock(FLOAT_T sc, diff --git a/src/lib/edje/edje_textblock.c b/src/lib/edje/edje_textblock.c index c46c2a9543..0451099fa4 100644 --- a/src/lib/edje/edje_textblock.c +++ b/src/lib/edje/edje_textblock.c @@ -1,17 +1,5 @@ #include "edje_private.h" -#ifdef DEBUG_TEXT -# define TPRN(...) do { printf(__VA_ARGS__); } while(0) -#else -# define TPRN(...) -#endif - -#define COLOR_SET(color) \ - (color).r * (color).a / 255, \ - (color).g * (color).a / 255, \ - (color).b * (color).a / 255, \ - (color).a - static double _edje_part_recalc_single_textblock_scale_range_adjust(Edje_Part_Description_Text *chosen_desc, double base_scale, double scale) { @@ -32,248 +20,6 @@ _edje_part_recalc_single_textblock_scale_range_adjust(Edje_Part_Description_Text return scale; } -static void -_edje_part_recalc_textblock_font_get(Edje *ed, Edje_Real_Part *ep, - Edje_Part_Description_Text *chosen_desc, - const char **ret_font_source, - const char **ret_font, int *ret_size) - -{ - Edje_Real_Part *source; - const char *font; - int size; - Eina_Bool inlined_font = EINA_FALSE; - const char *font_source = NULL; - char *sfont, *font2; - - sfont = font2 = NULL; - - source = ep->typedata.text->source; - - if (source) - font = _edje_text_class_font_get(ed, - _edje_real_part_text_source_description_get(ep, - &source), &size, &sfont); - else - font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont); - - if (size <= 0) size = 1; - if (!font) font = ""; - - if (source) - { - if (source->typedata.text->font) font = source->typedata.text->font; - if (source->typedata.text->size > 0) size = source->typedata.text->size; - } - else - { - if (ep->typedata.text->font) font = ep->typedata.text->font; - if (ep->typedata.text->size > 0) size = ep->typedata.text->size; - } - - if (ed->file->fonts) - { - Edje_Font_Directory_Entry *fnt; - - fnt = eina_hash_find(ed->file->fonts, font); - - if (fnt) - { - size_t len = strlen(font) + sizeof("edje/fonts/") + 1; - font2 = alloca(len); - sprintf(font2, "edje/fonts/%s", font); - font = font2; - inlined_font = 1; - font2 = NULL; // so it is not freed at the end of the function - } - } - if (inlined_font) - { - font_source = ed->path; - } - - if ((_edje_fontset_append) && (font)) - { - font2 = malloc(strlen(font) + 1 + strlen(_edje_fontset_append) + 1); - if (font2) - { - strcpy(font2, font); - strcat(font2, ","); - strcat(font2, _edje_fontset_append); - font = font2; //font2 needs to be freed at the end of the - // function. - } - } - if (ret_font) *ret_font = font; - if (ret_size) *ret_size = size; - if (ret_font_source) *ret_font_source = font_source; - - if (font2) free(font2); - if (sfont) free(sfont); -} - -static inline Eina_Bool -_edje_part_recalc_textblock_text_get(Edje *ed, Edje_Real_Part *ep, - Edje_Part_Description_Text *chosen_desc, const char **_ret) -{ - Eina_Bool same = EINA_FALSE; - const char *text = NULL; - - if (chosen_desc->text.domain) - { - if (!chosen_desc->text.text.translated) - chosen_desc->text.text.translated = _set_translated_string(ed, ep); - if (chosen_desc->text.text.translated) - text = chosen_desc->text.text.translated; - } - - if (!text) - { - text = edje_string_get(&chosen_desc->text.text); - if (ep->typedata.text->text) text = ep->typedata.text->text; - } - - if (chosen_desc->text.id_text_source >= 0) - { - Edje_Part_Description_Text *et; - Edje_Real_Part *rp; - ep->typedata.text->text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size]; - - et = _edje_real_part_text_text_source_description_get(ep, &rp); - text = edje_string_get(&(et->text.text)); - - if (rp->typedata.text->text) text = rp->typedata.text->text; - } - - if ((text == ep->typedata.text->cache.in_str) - || (text && ep->typedata.text->cache.in_str && !strcmp(ep->typedata.text->cache.in_str, text))) - { - text = ep->typedata.text->cache.in_str; - same = EINA_TRUE; - } - - if (!same) - { - eina_stringshare_replace(&ep->typedata.text->cache.in_str, text); - } - - *_ret = text; - return same; -} - -static inline Edje_Style * -_edje_part_recalc_textblock_style_get(Edje *ed, Edje_Real_Part *ep, - Edje_Part_Description_Text *chosen_desc) -{ - Edje_Style *stl = NULL; - const char *tmp, *style = ""; - Eina_List *l; - - if (chosen_desc->text.id_source >= 0) - { - Edje_Part_Description_Text *et; - - ep->typedata.text->source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size]; - - et = _edje_real_part_text_source_description_get(ep, NULL); - tmp = edje_string_get(&et->text.style); - if (tmp) style = tmp; - } - else - { - ep->typedata.text->source = NULL; - - tmp = edje_string_get(&chosen_desc->text.style); - if (tmp) style = tmp; - } - - EINA_LIST_FOREACH(ed->file->styles, l, stl) - { - if ((stl->name) && (!strcmp(stl->name, style))) break; - stl = NULL; - } - - return stl; -} - -static inline void -_edje_part_recalc_textblock_fit(Edje_Real_Part *ep, - Edje_Part_Description_Text *chosen_desc, - Edje_Calc_Params *params, - FLOAT_T sc, Evas_Coord *tw, Evas_Coord *th) -{ - double base_s = 1.0; - double orig_s; - double s = base_s; - - if (ep->part->scale) base_s = TO_DOUBLE(sc); - efl_canvas_object_scale_set(ep->object, base_s); - efl_canvas_text_size_native_get(ep->object, tw, th); - - orig_s = base_s; - /* Now make it bigger so calculations will be more accurate - * and less influenced by hinting... */ - { - orig_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, - orig_s * TO_INT(params->eval.w) / *tw); - efl_canvas_object_scale_set(ep->object, orig_s); - efl_canvas_text_size_native_get(ep->object, tw, th); - } - if (chosen_desc->text.fit_x) - { - if (*tw > 0) - { - s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, - orig_s * TO_INT(params->eval.w) / *tw); - efl_canvas_object_scale_set(ep->object, s); - efl_canvas_text_size_native_get(ep->object, NULL, NULL); - } - } - if (chosen_desc->text.fit_y) - { - if (*th > 0) - { - double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, - orig_s * TO_INT(params->eval.h) / *th); - /* If we already have X fit, restrict Y to be no bigger - * than what we got with X. */ - if (!((chosen_desc->text.fit_x) && (tmp_s > s))) - { - s = tmp_s; - } - - efl_canvas_object_scale_set(ep->object, s); - efl_canvas_text_size_native_get(ep->object, NULL, NULL); - } - } - - /* Final tuning, try going down 90% at a time, hoping it'll - * actually end up being correct. */ - { - int i = 5; /* Tries before we give up. */ - Evas_Coord fw, fh; - efl_canvas_text_size_native_get(ep->object, &fw, &fh); - - /* If we are still too big, try reducing the size to - * 95% each try. */ - while ((i > 0) && - ((chosen_desc->text.fit_x && (fw > TO_INT(params->eval.w))) || - (chosen_desc->text.fit_y && (fh > TO_INT(params->eval.h))))) - { - double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, s * 0.95); - - /* Break if we are not making any progress. */ - if (EQ(tmp_s, s)) - break; - s = tmp_s; - - efl_canvas_object_scale_set(ep->object, s); - efl_canvas_text_size_native_get(ep->object, &fw, &fh); - i--; - } - } -} - /* * Legacy function for min/max calculation of textblock part. * It can't calculate min/max properly in many cases. @@ -289,7 +35,6 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep, int *maxw, int *maxh) { Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b; - ins_l = ins_r = ins_t = ins_b = 0; /* Legacy code for Textblock min/max calculation */ if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y)) @@ -304,10 +49,8 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep, } else evas_object_textblock_size_native_get(ep->object, &tw, &th); - evas_object_textblock_style_insets_get(ep->object, &ins_l, - &ins_r, &ins_t, &ins_b); - + &ins_r, &ins_t, &ins_b); mw = ins_l + tw + ins_r; mh = ins_t + th + ins_b; if (minw && chosen_desc->text.min_x) @@ -332,10 +75,8 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep, } else evas_object_textblock_size_native_get(ep->object, &tw, &th); - - evas_object_textblock_style_insets_get(ep->object, &ins_l, - &ins_r, &ins_t, &ins_b); - + evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r, + &ins_t, &ins_b); mw = ins_l + tw + ins_r; mh = ins_t + th + ins_b; if (maxw && chosen_desc->text.max_x) @@ -360,25 +101,19 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, { Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b; Evas_Coord min_calc_w = 0, min_calc_h = 0; - unsigned char dmin_x, dmin_y; - - ins_l = ins_r = ins_t = ins_b = 0; /* min_calc_* values need to save calculated minumum size * for maximum size calculation */ if (minw) min_calc_w = *minw; if (minh) min_calc_h = *minh; - dmin_x = chosen_desc->text.min_x; - dmin_y = chosen_desc->text.min_y; - - if (dmin_x || dmin_y) + if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y)) { evas_object_textblock_style_insets_get(ep->object, &ins_l, - &ins_r, &ins_t, &ins_b); + &ins_r, &ins_t, &ins_b); tw = th = 0; - if (!dmin_x) + if (!chosen_desc->text.min_x) { /* text.min: 0 1 * text.max: X X */ @@ -426,7 +161,7 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, { /* text.min: 1 X * text.max: X X */ - if (dmin_y && (!chosen_desc->text.max_x) && + if (chosen_desc->text.min_y && (!chosen_desc->text.max_x) && maxw && (*maxw > -1)) { /* text.min: 1 1 @@ -487,14 +222,14 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, if (tw > min_calc_w) min_calc_w = tw; if (th > min_calc_h) min_calc_h = th; - if (dmin_x && minw) *minw = min_calc_w; - if (dmin_y && minh) *minh = min_calc_h; + if (chosen_desc->text.min_x && minw) *minw = min_calc_w; + if (chosen_desc->text.min_y && minh) *minh = min_calc_h; } if ((chosen_desc->text.max_x) || (chosen_desc->text.max_y)) { - evas_object_textblock_style_insets_get(ep->object, &ins_l, - &ins_r, &ins_t, &ins_b); + evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r, + &ins_t, &ins_b); tw = th = 0; if (!chosen_desc->text.max_x) @@ -549,7 +284,7 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, else { /* text.max: 1 X */ - if (dmin_x) + if (chosen_desc->text.min_x) { /* text.min: 1 X * text.max: 1 X @@ -577,7 +312,7 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, if (min_calc_h > temp_h) temp_h = min_calc_h; - if (dmin_y) + if (chosen_desc->text.min_y) { /* text.min: 0 1 * text.max: 1 1 @@ -648,147 +383,6 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, } } -static void -_edje_textblock_colors_set(Edje *ed EINA_UNUSED, - Edje_Real_Part *ep, - Edje_Calc_Params *params, - Eina_Bool styles) -{ - - Edje_Text_Effect effect; - Efl_Text_Style_Effect_Type st; - Efl_Text_Style_Shadow_Direction dir; - - if (ep->part->type == EDJE_PART_TYPE_TEXT) - { - efl_text_normal_color_set(ep->object, COLOR_SET(params->color)); - evas_object_color_set(ep->object, 255, 255, 255, 255); - } - - effect = ep->part->effect; - switch (effect & EDJE_TEXT_EFFECT_MASK_BASIC) - { - case EDJE_TEXT_EFFECT_NONE: - case EDJE_TEXT_EFFECT_PLAIN: - st = EFL_TEXT_STYLE_EFFECT_TYPE_NONE; - break; - - case EDJE_TEXT_EFFECT_OUTLINE: - st = EFL_TEXT_STYLE_EFFECT_TYPE_OUTLINE; - if (styles) efl_text_outline_color_set(ep->object, - COLOR_SET(params->type.text->color2)); - break; - - case EDJE_TEXT_EFFECT_SOFT_OUTLINE: - st = EFL_TEXT_STYLE_EFFECT_TYPE_SOFT_OUTLINE; - if (styles) efl_text_outline_color_set(ep->object, - COLOR_SET(params->type.text->color2)); - break; - - case EDJE_TEXT_EFFECT_SHADOW: - st = EFL_TEXT_STYLE_EFFECT_TYPE_SHADOW; - if (styles) efl_text_shadow_color_set(ep->object, - COLOR_SET(params->type.text->color3)); - break; - - case EDJE_TEXT_EFFECT_SOFT_SHADOW: - st = EFL_TEXT_STYLE_EFFECT_TYPE_SOFT_SHADOW; - if (styles) efl_text_shadow_color_set(ep->object, - COLOR_SET(params->type.text->color3)); - break; - - case EDJE_TEXT_EFFECT_OUTLINE_SHADOW: - st = EFL_TEXT_STYLE_EFFECT_TYPE_OUTLINE_SHADOW; - if (styles) - { - efl_text_outline_color_set(ep->object, - COLOR_SET(params->type.text->color2)); - efl_text_shadow_color_set(ep->object, - COLOR_SET(params->type.text->color3)); - } - break; - - case EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW: - st = EFL_TEXT_STYLE_EFFECT_TYPE_OUTLINE_SOFT_SHADOW; - if (styles) - { - efl_text_outline_color_set(ep->object, - COLOR_SET(params->type.text->color2)); - efl_text_shadow_color_set(ep->object, - COLOR_SET(params->type.text->color3)); - } - break; - - case EDJE_TEXT_EFFECT_FAR_SHADOW: - st = EFL_TEXT_STYLE_EFFECT_TYPE_FAR_SHADOW; - if (styles) efl_text_shadow_color_set(ep->object, - COLOR_SET(params->type.text->color3)); - break; - - case EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW: - st = EFL_TEXT_STYLE_EFFECT_TYPE_FAR_SOFT_SHADOW; - if (styles) efl_text_shadow_color_set(ep->object, - COLOR_SET(params->type.text->color3)); - break; - - case EDJE_TEXT_EFFECT_GLOW: - st = EFL_TEXT_STYLE_EFFECT_TYPE_GLOW; - if (styles) - { - efl_text_glow_color_set(ep->object, - COLOR_SET(params->type.text->color2)); - efl_text_glow2_color_set(ep->object, - COLOR_SET(params->type.text->color3)); - } - break; - - default: - st = EFL_TEXT_STYLE_EFFECT_TYPE_NONE; - break; - } - - switch (effect & EDJE_TEXT_EFFECT_MASK_SHADOW_DIRECTION) - { - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_RIGHT: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_RIGHT; - break; - - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM; - break; - - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_LEFT: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT; - break; - - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_LEFT: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_LEFT; - break; - - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_LEFT: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT; - break; - - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP; - break; - - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_RIGHT: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT; - break; - - case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_RIGHT: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_RIGHT; - break; - - default: - dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP; - break; - } - efl_text_effect_type_set(ep->object, st); - efl_text_shadow_direction_set(ep->object, dir); -} - void _edje_part_recalc_single_textblock(FLOAT_T sc, Edje *ed, @@ -798,97 +392,172 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, int *minw, int *minh, int *maxw, int *maxh) { - double align_y; - if ((ep->type != EDJE_RP_TYPE_TEXT) || - (!ep->typedata.text)) - return; - - align_y = TO_DOUBLE(params->type.text->align.y); - efl_text_valign_set(ep->object, align_y); + (!ep->typedata.text)) + return; - if (ep->part->type == EDJE_PART_TYPE_TEXT) + if (chosen_desc) { - double align_x; - - align_x = TO_DOUBLE(params->type.text->align.x); + Evas_Coord tw, th; + const char *text = ""; + const char *style = ""; + Edje_Style *stl = NULL; + const char *tmp; + Eina_List *l; - if (align_x < 0) + if (chosen_desc->text.id_source >= 0) { - efl_text_halign_auto_type_set(ep->object, - EFL_TEXT_HORIZONTAL_ALIGNMENT_AUTO_NORMAL); + Edje_Part_Description_Text *et; + + ep->typedata.text->source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size]; + + et = _edje_real_part_text_source_description_get(ep, NULL); + tmp = edje_string_get(&et->text.style); + if (tmp) style = tmp; } else { - efl_text_halign_set(ep->object, align_x); + ep->typedata.text->source = NULL; + + tmp = edje_string_get(&chosen_desc->text.style); + if (tmp) style = tmp; } - } - if (chosen_desc) - { - const char *font, *font_source; - int size; + if (chosen_desc->text.id_text_source >= 0) + { + Edje_Part_Description_Text *et; + Edje_Real_Part *rp; - Evas_Coord tw, th; - Edje_Style *stl = NULL; - const char *text; + ep->typedata.text->text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size]; + + et = _edje_real_part_text_text_source_description_get(ep, &rp); + text = edje_string_get(&et->text.text); - _edje_part_recalc_textblock_text_get(ed, ep, chosen_desc, - &text); + if (rp->typedata.text->text) text = rp->typedata.text->text; + } + else + { + ep->typedata.text->text_source = NULL; + text = edje_string_get(&chosen_desc->text.text); + if (ep->typedata.text->text) text = ep->typedata.text->text; + } - stl = _edje_part_recalc_textblock_style_get(ed, ep, chosen_desc); + EINA_LIST_FOREACH(ed->file->styles, l, stl) + { + if ((stl->name) && (!strcmp(stl->name, style))) break; + stl = NULL; + } if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc)); if ((chosen_desc->text.fit_x) || (chosen_desc->text.fit_y)) { - _edje_part_recalc_textblock_fit(ep, chosen_desc, params, sc, &tw, &th); - } + double base_s = 1.0; + double orig_s; + double s = base_s; + + if (ep->part->scale) base_s = TO_DOUBLE(sc); + efl_canvas_object_scale_set(ep->object, base_s); + efl_canvas_text_size_native_get(ep->object, &tw, &th); + + orig_s = base_s; + /* Now make it bigger so calculations will be more accurate + * and less influenced by hinting... */ + { + orig_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, + orig_s * TO_INT(params->eval.w) / tw); + efl_canvas_object_scale_set(ep->object, orig_s); + efl_canvas_text_size_native_get(ep->object, &tw, &th); + } + if (chosen_desc->text.fit_x) + { + if (tw > 0) + { + s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, + orig_s * TO_INT(params->eval.w) / tw); + efl_canvas_object_scale_set(ep->object, s); + efl_canvas_text_size_native_get(ep->object, NULL, NULL); + } + } + if (chosen_desc->text.fit_y) + { + if (th > 0) + { + double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, + orig_s * TO_INT(params->eval.h) / th); + /* If we already have X fit, restrict Y to be no bigger + * than what we got with X. */ + if (!((chosen_desc->text.fit_x) && (tmp_s > s))) + { + s = tmp_s; + } - _edje_part_recalc_textblock_font_get(ed, ep, chosen_desc, - &font_source, &font, &size); + efl_canvas_object_scale_set(ep->object, s); + efl_canvas_text_size_native_get(ep->object, NULL, NULL); + } + } + + /* Final tuning, try going down 90% at a time, hoping it'll + * actually end up being correct. */ + { + int i = 5; /* Tries before we give up. */ + Evas_Coord fw, fh; + efl_canvas_text_size_native_get(ep->object, &fw, &fh); + + /* If we are still too big, try reducing the size to + * 95% each try. */ + while ((i > 0) && + ((chosen_desc->text.fit_x && (fw > TO_INT(params->eval.w))) || + (chosen_desc->text.fit_y && (fh > TO_INT(params->eval.h))))) + { + double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, s * 0.95); + + /* Break if we are not making any progress. */ + if (EQ(tmp_s, s)) + break; + s = tmp_s; + + efl_canvas_object_scale_set(ep->object, s); + efl_canvas_text_size_native_get(ep->object, &fw, &fh); + i--; + } + } + } if (stl) { if (evas_object_textblock_style_get(ep->object) != stl->style) evas_object_textblock_style_set(ep->object, stl->style); - } - - if (ep->part->type == EDJE_PART_TYPE_TEXT) - { - FLOAT_T ellip = params->type.text->ellipsis; - efl_text_font_set(ep->object, font, size); - efl_text_ellipsis_set(ep->object, (ellip == -1.0) ? -1.0 : 1.0 - ellip); - _edje_textblock_colors_set(ed, ep, params, EINA_TRUE); - } + // FIXME: need to account for editing + if (ep->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) + { + // do nothing - should be done elsewhere + } + else + { + evas_object_textblock_text_markup_set(ep->object, text); + } - // FIXME: need to account for editing - if (ep->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) - { - // do nothing - should be done elsewhere - } - else - { - evas_object_textblock_text_markup_set(ep->object, text); + if ((ed->file->efl_version.major >= 1) && (ed->file->efl_version.minor >= 19)) + { + _edje_part_recalc_single_textblock_min_max_calc(ep, + chosen_desc, + params, + minw, minh, + maxw, maxh); + } + else + { + _edje_part_recalc_single_textblock_min_max_calc_legacy(ep, + chosen_desc, + params, + minw, minh, + maxw, maxh); + } } - if ((ed->file->efl_version.major >= 1) && (ed->file->efl_version.minor >= 19)) - { - _edje_part_recalc_single_textblock_min_max_calc(ep, - chosen_desc, - params, - minw, minh, - maxw, maxh); - } - else - { - _edje_part_recalc_single_textblock_min_max_calc_legacy(ep, - chosen_desc, - params, - minw, minh, - maxw, maxh); - } + evas_object_textblock_valign_set(ep->object, TO_DOUBLE(chosen_desc->text.align.y)); } } @@ -897,11 +566,15 @@ _edje_textblock_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description_Text *chosen_desc) { + /* FIXME: this is just an hack. */ FLOAT_T sc; +#if 0 + _get_text(ep); +#endif + sc = DIV(ed->scale, ed->file->base_scale); if (EQ(sc, ZERO)) sc = DIV(_edje_scale, ed->file->base_scale); - _edje_textblock_colors_set(ed, ep, params, EINA_FALSE); if (chosen_desc->text.fit_x || chosen_desc->text.fit_y) { _edje_part_recalc_single_textblock(sc, ed, ep, chosen_desc, params, diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c index deea92545b..da5c3cb069 100644 --- a/src/lib/edje/edje_util.c +++ b/src/lib/edje/edje_util.c @@ -2078,7 +2078,7 @@ _edje_efl_text_get(Eo *obj EINA_UNUSED, Edje *ed, const char *part, return desc->text.text.str; } } - else + if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) { const char *entry; if (legacy) @@ -3496,7 +3496,7 @@ again: //width if (!ep->chosen_description->fixed.w) { - if ((legacy_calc) && PART_IS_TEXT(ed, ep)) + if ((legacy_calc) && (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)) { //We care textblock width size specially. Evas_Coord tb_mw; @@ -3524,8 +3524,9 @@ again: { if (legacy_calc) { - if (!PART_IS_TEXT(ed, ep) || - ((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x || !skip_h) + if ((ep->part->type != EDJE_PART_TYPE_TEXTBLOCK) || + ((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x || + !skip_h) { if (over_h > max_over_h) { @@ -3535,7 +3536,7 @@ again: } } - if (PART_IS_TEXT(ed, ep)) + if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) has_fixed_tb = EINA_FALSE; } else if (over_h > max_over_h) --