From 5aba518db03c935a592bb4b9305fbbcc9459663d Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Thu, 21 Jul 2011 14:04:52 +0000 Subject: [PATCH] Evas textblock: Fixed native size calculation with relative items. SVN revision: 61560 --- .../src/lib/canvas/evas_object_textblock.c | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_object_textblock.c b/legacy/evas/src/lib/canvas/evas_object_textblock.c index f1c714f2aa..f8a68db754 100644 --- a/legacy/evas/src/lib/canvas/evas_object_textblock.c +++ b/legacy/evas/src/lib/canvas/evas_object_textblock.c @@ -8228,6 +8228,39 @@ evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w, if (h) *h = o->formatted.h; } +static void +_size_native_calc_line_finalize(const Evas_Object *obj, Eina_List *items, + Evas_Coord *ascent, Evas_Coord *descent, Evas_Coord *w) +{ + Evas_Object_Textblock_Item *it; + Eina_List *i; + + it = eina_list_data_get(items); + /* If there are no text items yet, calc ascent/descent + * according to the current format. */ + if (it && (*ascent + *descent == 0)) + _layout_format_ascent_descent_adjust(obj, ascent, descent, it->format); + + *w = 0; + /* Adjust all the item sizes according to the final line size, + * and update the x positions of all the items of the line. */ + EINA_LIST_FOREACH(items, i, it) + { + if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT) + { + Evas_Coord fw, fh, fy; + + Evas_Object_Textblock_Format_Item *fi = _ITEM_FORMAT(it); + if (!fi->formatme) goto loop_advance; + _layout_calculate_format_item_size(obj, fi, ascent, + descent, &fy, &fw, &fh); + } + +loop_advance: + *w += it->adv; + } +} + /* FIXME: doc */ static void _size_native_calc_paragraph_size(const Evas_Object *obj, @@ -8237,55 +8270,61 @@ _size_native_calc_paragraph_size(const Evas_Object *obj, { Eina_List *i; Evas_Object_Textblock_Item *it; - Evas_Coord x = 0, y = 0, wmax = 0, h = 0, ascent = 0, descent = 0; + Eina_List *line_items = NULL; + Evas_Coord w = 0, y = 0, wmax = 0, h = 0, ascent = 0, descent = 0; EINA_LIST_FOREACH(par->logical_items, i, it) { + line_items = eina_list_append(line_items, it); if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT) { Evas_Object_Textblock_Format_Item *fi = _ITEM_FORMAT(it); if (fi->item && (_IS_LINE_SEPARATOR(fi->item) || _IS_PARAGRAPH_SEPARATOR(o, fi->item))) { - /* If there are no text items yet, calc ascent/descent - * according to the current format. */ - if (ascent + descent == 0) - _layout_format_ascent_descent_adjust(obj, &ascent, - &descent, it->format); + _size_native_calc_line_finalize(obj, line_items, &ascent, + &descent, &w); if (ascent + descent > h) h = ascent + descent; - if (x + it->adv > wmax) - wmax = x + it->adv; + y += h; - x = h = 0; + if (w > wmax) + wmax = w; + h = 0; ascent = descent = 0; + line_items = eina_list_free(line_items); } else { Evas_Coord fw, fh, fy; + /* If there are no text items yet, calc ascent/descent + * according to the current format. */ + if (it && (ascent + descent == 0)) + _layout_format_ascent_descent_adjust(obj, &ascent, + &descent, it->format); _layout_calculate_format_item_size(obj, fi, &ascent, &descent, &fy, &fw, &fh); - - if (fh > h) - h = fh; - x += fw; } } else { _layout_format_ascent_descent_adjust(obj, &ascent, &descent, it->format); - x += it->adv; } } + _size_native_calc_line_finalize(obj, line_items, &ascent, &descent, &w); + + line_items = eina_list_free(line_items); + /* Do the last addition */ if (ascent + descent > h) h = ascent + descent; - if (x > wmax) - wmax = x; + + if (w > wmax) + wmax = w; *_h = y + h; *_w = wmax;