From 91ae899232bc9fe50554039b9631ef913c8b4a7c Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Fri, 15 Feb 2013 15:38:49 +0000 Subject: [PATCH] Edje textblock: Improved textblock fit and added support for size_range. It's a bit quirky at the moment as you have to set the base font size (text.size) although this doesn't have any effect on textblocks. --- ChangeLog | 5 ++++ NEWS | 2 ++ src/lib/edje/edje_calc.c | 59 ++++++++++++++++++++++++++++++++++------ 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 801a39dfb4..5e062c70f4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-02-15 Tom Hacohen (TAsn) + + * Edje textblock: Improved textblock fit and added support for + size_range. + 2013-02-15 Jiyoun Park (jypark) * Add infrastructure to handle message between ecore and parent ecore in Ecore_Evas. diff --git a/NEWS b/NEWS index cb86002098..7a8c8681d6 100644 --- a/NEWS +++ b/NEWS @@ -64,6 +64,7 @@ Additions: * Add eio_eet_sync symbols. * Add infrastructure to handle buggy touchscreen in Ecore_Input_Evas. * Add infrastructure to handle message between ecore and parent ecore in Ecore_Evas. + * Edje textblock: Added support for size_range. Deprecations: * ecore_x: @@ -167,3 +168,4 @@ Fixes: * Fix memory leak in error case in ethumb. * fix bug not to display preedit string with PREEDIT_TYPE_NONE style * Fix bug candidate word couldn't be selected with up/down key in the preedit status + * Edje textblock: Improved textblock fit. diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index b56d5b70ad..f1ea8cc4f0 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -1144,6 +1144,26 @@ _edje_part_recalc_single_step(Edje_Part_Description_Common *desc, } } +static double +_edje_part_recalc_single_textblock_scale_range_adjust(Edje_Part_Description_Text *chosen_desc, double base_scale, double scale) +{ + double size, min, max; + + if (chosen_desc->text.size == 0) + return scale; + + min = base_scale * chosen_desc->text.size_range_min; + max = chosen_desc->text.size_range_max * base_scale; + size = chosen_desc->text.size * scale; + + if ((size > max) && (max > 0)) + scale = max / (double) chosen_desc->text.size; + else if (size < min) + scale = min / (double) chosen_desc->text.size; + + return scale; +} + static void _edje_part_recalc_single_textblock(FLOAT_T sc, Edje *ed, @@ -1277,35 +1297,56 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, if (minh && (*maxh < *minh)) *maxh = *minh; } } + if ((chosen_desc->text.fit_x) || (chosen_desc->text.fit_y)) { - double s = 1.0; + double base_s = 1.0; + double orig_s; + double s = base_s; - if (ep->part->scale) s = TO_DOUBLE(sc); + if (ep->part->scale) base_s = TO_DOUBLE(sc); eo_do(ep->object, - evas_obj_scale_set(s), + evas_obj_scale_set(base_s), evas_obj_textblock_size_formatted_get(&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 * params->w / (double) tw); + eo_do(ep->object, + evas_obj_scale_set(orig_s), + evas_obj_textblock_size_formatted_get(&tw, &th)); + } if (chosen_desc->text.fit_x) { - if ((tw > 0) && (tw > params->w)) + if (tw > 0) { - s = (s * params->w) / (double)tw; + s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, orig_s * params->w / tw); eo_do(ep->object, evas_obj_scale_set(s), - evas_obj_textblock_size_formatted_get(&tw, &th)); + evas_obj_textblock_size_formatted_get(NULL, NULL)); } } if (chosen_desc->text.fit_y) { - if ((th > 0) && (th > params->h)) + if (th > 0) { - s = (s * params->h) / (double)th; + double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, orig_s * params->h / (double) 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; + } + eo_do(ep->object, evas_obj_scale_set(s), - evas_obj_textblock_size_formatted_get(&tw, &th)); + evas_obj_textblock_size_formatted_get(NULL, NULL)); } } } + evas_object_textblock_valign_set(ep->object, TO_DOUBLE(chosen_desc->text.align.y)); } }