From 3367bf0aba5d06b809b471475505ce18be958c0a Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 27 Dec 2013 00:05:11 +0900 Subject: [PATCH] Revert "evas: improve textblock rendering by walking even less in all case." This reverts commit a69c5ba0aee81e84e2f03475faca21bb1c939843. yes - this broke text rendering. revert it. several dialogs/uses in e broke with shadow and glow text being heavily offset up/to the right of the proper text. --- src/lib/evas/canvas/evas_object_textblock.c | 440 +++++++++----------- 1 file changed, 207 insertions(+), 233 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 485145d890..5851918c5e 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -373,17 +373,14 @@ typedef enum _Evas_Textblock_Item_Type struct _Evas_Object_Textblock_Item { EINA_INLIST; + Evas_Textblock_Item_Type type; Evas_Object_Textblock_Node_Text *text_node; Evas_Object_Textblock_Format *format; - Evas_Object_Textblock_Line *ln; size_t text_pos; #ifdef BIDI_SUPPORT size_t visual_pos; #endif - Evas_Textblock_Item_Type type; - Evas_Coord adv, x, w, h; - Evas_Coord yoff; Eina_Bool merge : 1; /* Indicates whether this item should merge to the previous item or not */ @@ -4442,7 +4439,6 @@ _layout_handle_ellipsis(Ctxt *c, Evas_Object_Textblock_Item *it, Eina_List *i) c->ln->items = (Evas_Object_Textblock_Item *) eina_inlist_append(EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(it)); - it->ln = c->ln; if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT) { Evas_Object_Textblock_Format_Item *fi; @@ -4453,7 +4449,6 @@ _layout_handle_ellipsis(Ctxt *c, Evas_Object_Textblock_Item *it, Eina_List *i) c->ln->items = (Evas_Object_Textblock_Item *) eina_inlist_append(EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(_ITEM(ellip_ti))); - _ITEM(ellip_ti)->ln = c->ln; c->position = (c->position == TEXTBLOCK_POSITION_START) ? TEXTBLOCK_POSITION_SINGLE : TEXTBLOCK_POSITION_END; @@ -4473,7 +4468,7 @@ _layout_paragraph_reorder_lines(Evas_Object_Textblock_Paragraph *par) } #endif -static inline void +static void _layout_paragraph_render(Evas_Object_Textblock *o, Evas_Object_Textblock_Paragraph *par) { @@ -4705,7 +4700,6 @@ _layout_par(Ctxt *c) eina_inlist_remove( EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(it))); - it->ln = c->ln; i = eina_list_prev(i); it = eina_list_data_get(i); } @@ -4775,7 +4769,6 @@ _layout_par(Ctxt *c) c->ln->items = (Evas_Object_Textblock_Item *) eina_inlist_append(EINA_INLIST_GET(c->ln->items), EINA_INLIST_GET(it)); - it->ln = c->ln; if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT) { Evas_Object_Textblock_Format_Item *fi; @@ -10713,16 +10706,10 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, int x, int y, Eina_Bool do_async) { Evas_Object_Textblock_Paragraph *par, *start = NULL; - Evas_Object_Textblock_Item *itr; Evas_Object_Textblock_Line *ln; Evas_Object_Textblock *o = type_private_data; - Eina_List *shadows = NULL; - Eina_List *glows = NULL; - Eina_List *outlines = NULL; int i, j; int cx, cy, cw, ch, clip; - int ca, cr, cg, cb; - int na, nr, ng, nb; const char vals[5][5] = { {0, 1, 2, 1, 0}, @@ -10731,6 +10718,9 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, {1, 3, 4, 3, 1}, {0, 1, 2, 1, 0} }; + Eina_Bool have_shadow = EINA_FALSE; + Eina_Bool have_glow = EINA_FALSE; + Eina_Bool have_outline = EINA_FALSE; /* render object to surface with context, and offxet by x,y */ obj->layer->evas->engine.func->context_multiplier_unset(output, @@ -10747,9 +10737,6 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, * there's nothing left to do. */ if (!o->paragraphs) return; - ENFN->context_color_set(output, context, 0, 0, 0, 0); - ca = cr = cg = cb = 0; - #define ITEM_WALK() \ EINA_INLIST_FOREACH(start, par) \ { \ @@ -10764,6 +10751,8 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, _layout_paragraph_render(o, par); \ EINA_INLIST_FOREACH(par->lines, ln) \ { \ + Evas_Object_Textblock_Item *itr; \ + \ if (clip) \ { \ if ((obj->cur->geometry.y + y + par->y + ln->y + ln->h) < (cy - 20)) \ @@ -10778,7 +10767,6 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, if (itr->format->valign != -1.0) \ { \ yoff += itr->format->valign * (ln->h - itr->h); \ - itr->yoff = yoff; \ } \ if (clip) \ { \ @@ -10797,28 +10785,18 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, } \ } \ do {} while(0) -#define COLOR_SET(col) \ - nr = obj->cur->cache.clip.r * ti->parent.format->color.col.r; \ - ng = obj->cur->cache.clip.g * ti->parent.format->color.col.g; \ - nb = obj->cur->cache.clip.b * ti->parent.format->color.col.b; \ - na = obj->cur->cache.clip.a * ti->parent.format->color.col.a; \ - if (na != ca || nb != cb || ng != cg || nr != cr) \ - { \ - ENFN->context_color_set(output, context, \ - nr / 255, ng / 255, nb / 255, na / 255); \ - cr = nr; cg = ng; cb = nb; ca = na; \ - } -#define COLOR_SET_AMUL(col, amul) \ - nr = obj->cur->cache.clip.r * ti->parent.format->color.col.r * (amul); \ - ng = obj->cur->cache.clip.g * ti->parent.format->color.col.g * (amul); \ - nb = obj->cur->cache.clip.b * ti->parent.format->color.col.b * (amul); \ - na = obj->cur->cache.clip.a * ti->parent.format->color.col.a * (amul); \ - if (na != ca || nb != cb || ng != cg || nr != cr) \ - { \ - ENFN->context_color_set(output, context, \ - nr / 65025, ng / 65025, nb / 65025, na / 65025); \ - cr = nr; cg = ng; cb = nb; ca = na; \ - } +#define COLOR_SET(col) \ + ENFN->context_color_set(output, context, \ + (obj->cur->cache.clip.r * ti->parent.format->color.col.r) / 255, \ + (obj->cur->cache.clip.g * ti->parent.format->color.col.g) / 255, \ + (obj->cur->cache.clip.b * ti->parent.format->color.col.b) / 255, \ + (obj->cur->cache.clip.a * ti->parent.format->color.col.a) / 255); +#define COLOR_SET_AMUL(col, amul) \ + ENFN->context_color_set(output, context, \ + (obj->cur->cache.clip.r * ti->parent.format->color.col.r * (amul)) / 65025, \ + (obj->cur->cache.clip.g * ti->parent.format->color.col.g * (amul)) / 65025, \ + (obj->cur->cache.clip.b * ti->parent.format->color.col.b * (amul)) / 65025, \ + (obj->cur->cache.clip.a * ti->parent.format->color.col.a * (amul)) / 65025); #define DRAW_TEXT(ox, oy) \ if (ti->parent.format->font.font) \ evas_font_draw_async_check(obj, output, context, surface, \ @@ -10829,28 +10807,24 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, &ti->text_props, do_async); /* backing */ -#define DRAW_RECT(ox, oy, ow, oh, or, og, ob, oa) \ - do \ - { \ - nr = obj->cur->cache.clip.r * or; \ - ng = obj->cur->cache.clip.g * og; \ - nb = obj->cur->cache.clip.b * ob; \ - na = obj->cur->cache.clip.a * oa; \ - if (na != ca || nb != cb || ng != cg || nr != cr) \ - { \ - ENFN->context_color_set(output, context, \ - cr / 255, cg / 255, cb / 255, ca / 255); \ - cr = nr; cg = ng; cb = nb; ca = na; \ - } \ - ENFN->rectangle_draw(output, \ - context, \ - surface, \ - obj->cur->geometry.x + ln->x + x + (ox), \ - obj->cur->geometry.y + ln->par->y + ln->y + y + (oy), \ - (ow), \ - (oh), \ - do_async); \ - } \ +#define DRAW_RECT(ox, oy, ow, oh, or, og, ob, oa) \ + do \ + { \ + ENFN->context_color_set(output, \ + context, \ + (obj->cur->cache.clip.r * or) / 255, \ + (obj->cur->cache.clip.g * og) / 255, \ + (obj->cur->cache.clip.b * ob) / 255, \ + (obj->cur->cache.clip.a * oa) / 255); \ + ENFN->rectangle_draw(output, \ + context, \ + surface, \ + obj->cur->geometry.x + ln->x + x + (ox), \ + obj->cur->geometry.y + ln->par->y + ln->y + y + (oy), \ + (ow), \ + (oh), \ + do_async); \ + } \ while (0) #define DRAW_FORMAT_DASHED(oname, oy, oh, dw, dp) \ @@ -10919,35 +10893,38 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, ITEM_WALK() { /* Check which other pass are necessary to avoid useless WALK */ - Evas_Object_Textblock_Text_Item *ti; - - ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; - if (ti) + if (!have_shadow && !have_glow && !have_outline) { - if (ti->parent.format->style & (EVAS_TEXT_STYLE_SHADOW | - EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW | - EVAS_TEXT_STYLE_OUTLINE_SHADOW | - EVAS_TEXT_STYLE_FAR_SHADOW | - EVAS_TEXT_STYLE_FAR_SOFT_SHADOW | - EVAS_TEXT_STYLE_SOFT_SHADOW)) + Evas_Object_Textblock_Text_Item *ti; + + ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; + if (ti) { - shadows = eina_list_append(shadows, itr); - } - if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == - EVAS_TEXT_STYLE_GLOW) - { - glows = eina_list_append(glows, itr); - } - if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE) || - ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || - ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) || - (ti->parent.format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE)) - { - outlines = eina_list_append(outlines, itr); + if (ti->parent.format->style & (EVAS_TEXT_STYLE_SHADOW | + EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW | + EVAS_TEXT_STYLE_OUTLINE_SHADOW | + EVAS_TEXT_STYLE_FAR_SHADOW | + EVAS_TEXT_STYLE_FAR_SOFT_SHADOW | + EVAS_TEXT_STYLE_SOFT_SHADOW)) + { + have_shadow = EINA_TRUE; + } + if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == + EVAS_TEXT_STYLE_GLOW) + { + have_glow = EINA_TRUE; + } + if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE) || + ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || + ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) || + (ti->parent.format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE)) + { + have_outline = EINA_TRUE; + } } + } - /* Draw background */ DRAW_FORMAT(backing, 0, ln->h); } ITEM_WALK_END(); @@ -10958,185 +10935,182 @@ evas_object_textblock_render(Evas_Object *eo_obj EINA_UNUSED, /* prepare everything for text draw */ /* shadows */ - EINA_LIST_FREE(shadows, itr) + if (have_shadow) { - int shad_dst, shad_sz, dx, dy, haveshad; - Evas_Object_Textblock_Text_Item *ti; - Evas_Coord yoff; - - ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; - if (!ti) continue; - - yoff = itr->yoff; - ln = itr->ln; - - shad_dst = shad_sz = dx = dy = haveshad = 0; - switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) + ITEM_WALK() { - case EVAS_TEXT_STYLE_SHADOW: - shad_dst = 1; - haveshad = 1; - break; - case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW: - shad_dst = 1; - shad_sz = 2; - haveshad = 1; - break; - case EVAS_TEXT_STYLE_OUTLINE_SHADOW: - case EVAS_TEXT_STYLE_FAR_SHADOW: - shad_dst = 2; - haveshad = 1; - break; - case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW: - shad_dst = 2; - shad_sz = 2; - haveshad = 1; - break; - case EVAS_TEXT_STYLE_SOFT_SHADOW: - shad_dst = 1; - shad_sz = 2; - haveshad = 1; - break; - default: - break; - } - if (haveshad) - { - if (shad_dst > 0) + int shad_dst, shad_sz, dx, dy, haveshad; + Evas_Object_Textblock_Text_Item *ti; + ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; + if (!ti) continue; + + shad_dst = shad_sz = dx = dy = haveshad = 0; + switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) { - switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION) - { - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT: - dx = 1; - dy = 1; - break; - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM: - dx = 0; - dy = 1; - break; - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT: - dx = -1; - dy = 1; - break; - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT: - dx = -1; - dy = 0; - break; - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT: - dx = -1; - dy = -1; - break; - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP: - dx = 0; - dy = -1; - break; - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT: - dx = 1; - dy = -1; - break; - case EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT: - dx = 1; - dy = 0; - default: - break; - } - dx *= shad_dst; - dy *= shad_dst; - } - switch (shad_sz) - { - case 0: - COLOR_SET(shadow); - DRAW_TEXT(dx, dy); + case EVAS_TEXT_STYLE_SHADOW: + shad_dst = 1; + haveshad = 1; break; - case 2: - for (j = 0; j < 5; j++) - { - for (i = 0; i < 5; i++) - { - if (vals[i][j] != 0) - { - COLOR_SET_AMUL(shadow, vals[i][j] * 50); - DRAW_TEXT(i - 2 + dx, j - 2 + dy); - } - } - } + case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW: + shad_dst = 1; + shad_sz = 2; + haveshad = 1; + break; + case EVAS_TEXT_STYLE_OUTLINE_SHADOW: + case EVAS_TEXT_STYLE_FAR_SHADOW: + shad_dst = 2; + haveshad = 1; + break; + case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW: + shad_dst = 2; + shad_sz = 2; + haveshad = 1; + break; + case EVAS_TEXT_STYLE_SOFT_SHADOW: + shad_dst = 1; + shad_sz = 2; + haveshad = 1; break; default: break; } + if (haveshad) + { + if (shad_dst > 0) + { + switch (ti->parent.format->style & EVAS_TEXT_STYLE_MASK_SHADOW_DIRECTION) + { + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT: + dx = 1; + dy = 1; + break; + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM: + dx = 0; + dy = 1; + break; + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT: + dx = -1; + dy = 1; + break; + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT: + dx = -1; + dy = 0; + break; + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT: + dx = -1; + dy = -1; + break; + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP: + dx = 0; + dy = -1; + break; + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT: + dx = 1; + dy = -1; + break; + case EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT: + dx = 1; + dy = 0; + default: + break; + } + dx *= shad_dst; + dy *= shad_dst; + } + switch (shad_sz) + { + case 0: + COLOR_SET(shadow); + DRAW_TEXT(dx, dy); + break; + case 2: + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(shadow, vals[i][j] * 50); + DRAW_TEXT(i - 2 + dx, j - 2 + dy); + } + } + } + break; + default: + break; + } + } } + ITEM_WALK_END(); } /* glows */ - EINA_LIST_FREE(glows, itr) + if (have_glow) { - Evas_Object_Textblock_Text_Item *ti; - Evas_Coord yoff; - - ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; - if (!ti) continue; - - yoff = itr->yoff; - ln = itr->ln; - - if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_GLOW) + ITEM_WALK() { - for (j = 0; j < 5; j++) + Evas_Object_Textblock_Text_Item *ti; + ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; + if (!ti) continue; + + if ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_GLOW) { - for (i = 0; i < 5; i++) + for (j = 0; j < 5; j++) { - if (vals[i][j] != 0) + for (i = 0; i < 5; i++) { - COLOR_SET_AMUL(glow, vals[i][j] * 50); - DRAW_TEXT(i - 2, j - 2); + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(glow, vals[i][j] * 50); + DRAW_TEXT(i - 2, j - 2); + } } } + COLOR_SET(glow2); + DRAW_TEXT(-1, 0); + DRAW_TEXT(1, 0); + DRAW_TEXT(0, -1); + DRAW_TEXT(0, 1); } - COLOR_SET(glow2); - DRAW_TEXT(-1, 0); - DRAW_TEXT(1, 0); - DRAW_TEXT(0, -1); - DRAW_TEXT(0, 1); } + ITEM_WALK_END(); } /* outlines */ - EINA_LIST_FREE(outlines, itr) + if (have_outline) { - Evas_Object_Textblock_Text_Item *ti; - Evas_Coord yoff; - - ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; - if (!ti) continue; - - yoff = itr->yoff; - ln = itr->ln; - - if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE) || - ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || - ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW)) + ITEM_WALK() { - COLOR_SET(outline); - DRAW_TEXT(-1, 0); - DRAW_TEXT(1, 0); - DRAW_TEXT(0, -1); - DRAW_TEXT(0, 1); - } - else if (ti->parent.format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE) - { - for (j = 0; j < 5; j++) + Evas_Object_Textblock_Text_Item *ti; + ti = (itr->type == EVAS_TEXTBLOCK_ITEM_TEXT) ? _ITEM_TEXT(itr) : NULL; + if (!ti) continue; + + if (((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE) || + ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || + ((ti->parent.format->style & EVAS_TEXT_STYLE_MASK_BASIC) == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW)) { - for (i = 0; i < 5; i++) + COLOR_SET(outline); + DRAW_TEXT(-1, 0); + DRAW_TEXT(1, 0); + DRAW_TEXT(0, -1); + DRAW_TEXT(0, 1); + } + else if (ti->parent.format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE) + { + for (j = 0; j < 5; j++) { - if (((i != 2) || (j != 2)) && (vals[i][j] != 0)) + for (i = 0; i < 5; i++) { - COLOR_SET_AMUL(outline, vals[i][j] * 50); - DRAW_TEXT(i - 2, j - 2); + if (((i != 2) || (j != 2)) && (vals[i][j] != 0)) + { + COLOR_SET_AMUL(outline, vals[i][j] * 50); + DRAW_TEXT(i - 2, j - 2); + } } } } } + ITEM_WALK_END(); } /* normal text and lines */