Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/canvas Modified Files: evas_object_textblock.c Log Message: and well.. now tb2 handles all the most important formattign tb1 did. that's about it here for formatting. time to fix up 2 nigglies (no working  ) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v retrieving revision 1.75 retrieving revision 1.76 diff -u -3 -r1.75 -r1.76 --- evas_object_textblock.c 15 Aug 2005 15:39:31 -0000 1.75 +++ evas_object_textblock.c 16 Aug 2005 08:12:14 -0000 1.76 @@ -69,6 +69,8 @@ int x, w, h; int inset, baseline; Evas_Object_Textblock_Format *format; + Evas_Object_Textblock_Node *source_node; + int source_pos; }; struct _Evas_Object_Textblock_Format @@ -129,6 +131,9 @@ Evas_Object_Textblock_Node *nodes; Evas_Object_Textblock_Line *lines; int last_w; + struct { + int l, r, t, b; + } style_pad; char *markup_text; char changed : 1; void *engine_data; @@ -1696,6 +1701,8 @@ int maxascent, maxdescent; int marginl, marginr; int line_no; + int underline_extend; + int have_underline, have_underline2; double align; }; @@ -1735,11 +1742,11 @@ { fmt = calloc(1, sizeof(Evas_Object_Textblock_Format)); c->format_stack = evas_list_prepend(c->format_stack, fmt); + fmt->halign = 0.0; + fmt->valign = -1.0; + fmt->style = STYLE_PLAIN; + fmt->tabstops = 32; } - fmt->halign = 0.0; - fmt->valign = -1.0; - fmt->style = STYLE_PLAIN; - fmt->tabstops = 32; return fmt; } @@ -1789,13 +1796,24 @@ if (endx > c->ln->w) c->ln->w = endx; } if (c->ln->w > c->wmax) c->wmax = c->ln->w; - c->ln->y = c->y; + c->ln->y = c->y + c->o->style_pad.t; c->ln->h = c->maxascent + c->maxdescent; c->ln->baseline = c->maxascent; + if (c->have_underline2) + { + if (c->maxdescent < 4) c->underline_extend = 4 - c->maxdescent; + } + else if (c->have_underline) + { + if (c->maxdescent < 2) c->underline_extend = 2 - c->maxdescent; + } c->ln->line_no = c->line_no; c->line_no++; c->y += c->maxascent + c->maxdescent; - c->ln->x = c->marginl + ((c->w - c->ln->w - c->marginl - c->marginr) * c->align); + c->ln->x = c->marginl + c->o->style_pad.l + + ((c->w - c->ln->w - + c->o->style_pad.l - c->o->style_pad.r - + c->marginl - c->marginr) * c->align); _layout_line_new(c, fmt); } @@ -1817,7 +1835,12 @@ int cx, cy, cw, ch; return c->ENFN->font_char_at_coords_get(c->ENDT, fmt->font.font, it->text, - c->w - c->marginl - c->marginr - c->x, + c->w - + c->o->style_pad.l - + c->o->style_pad.r - + c->marginl - + c->marginr - + c->x, 0, &cx, &cy, &cw, &ch); } @@ -2001,6 +2024,8 @@ else { new_it = _layout_item_new(c, pit->format, pit->text + index); + new_it->source_node = pit->source_node; + new_it->source_pos = pit->source_pos + index; _layout_item_text_cutoff(c, pit, index); _layout_strip_trailing_whitespace(c, pit->format, pit); break; @@ -2080,8 +2105,13 @@ str = str + twrap; } it = _layout_item_new(c, fmt, str); + it->source_node = n; + it->source_pos = str - n->text; c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, it->text, &tw, &th); - if (((fmt->wrap_word) || (fmt->wrap_char)) && ((c->x + tw) > (c->w - c->marginl - c->marginr))) + if (((fmt->wrap_word) || (fmt->wrap_char)) && + ((c->x + tw) > + (c->w - c->o->style_pad.l - c->o->style_pad.r - + c->marginl - c->marginr))) { wrap = _layout_text_cutoff_get(c, fmt, it); if (wrap > 0) @@ -2246,14 +2276,17 @@ static void _layout(Evas_Object *obj, int calc_only, int w, int h, int *w_ret, int *h_ret) { + Evas_Object_Textblock *o; Ctxt ctxt, *c; Evas_Object_List *l, *ll; - Evas_Object_Textblock_Format *fmt = NULL; /* current format */ + Evas_Object_Textblock_Format *fmt = NULL; + int style_pad_l = 0, style_pad_r = 0, style_pad_t = 0, style_pad_b = 0; /* setup context */ + o = (Evas_Object_Textblock *)(obj->object_data); c = &ctxt; c->obj =obj; - c->o = (Evas_Object_Textblock *)(obj->object_data); + c->o = o; c->lines = c->ln = NULL; c->format_stack = NULL; c->x = c->y = 0; @@ -2262,15 +2295,16 @@ c->wmax = c->hmax = 0; c->maxascent = c->maxdescent = 0; c->marginl = c->marginr = 0; + c->have_underline = 0; + c->have_underline2 = 0; + c->underline_extend = 0; c->line_no = 0; c->align = 0.0; /* setup default base style */ if ((c->o->style) && (c->o->style->default_tag)) { - fmt = calloc(1, sizeof(Evas_Object_Textblock_Format)); - fmt->ref = 1; - c->format_stack = evas_list_prepend(c->format_stack, fmt); + fmt = _layout_format_push(c, NULL); _format_fill(c->obj, fmt, c->o->style->default_tag); } /* run thru all text and format nodes generating lines */ @@ -2314,9 +2348,73 @@ } free(item); } + if (fmt->style == STYLE_SHADOW) + { + if (style_pad_r < 1) style_pad_r = 1; + if (style_pad_b < 1) style_pad_b = 1; + } + else if (fmt->style == STYLE_OUTLINE) + { + if (style_pad_l < 1) style_pad_l = 1; + if (style_pad_r < 1) style_pad_r = 1; + if (style_pad_t < 1) style_pad_t = 1; + if (style_pad_b < 1) style_pad_b = 1; + } + else if (fmt->style == STYLE_GLOW) + { + if (style_pad_l < 2) style_pad_l = 2; + if (style_pad_r < 2) style_pad_r = 2; + if (style_pad_t < 2) style_pad_t = 2; + if (style_pad_b < 2) style_pad_b = 2; + } + else if (fmt->style == STYLE_OUTLINE_SHADOW) + { + if (style_pad_l < 1) style_pad_l = 1; + if (style_pad_r < 2) style_pad_r = 2; + if (style_pad_t < 1) style_pad_t = 1; + if (style_pad_b < 2) style_pad_b = 2; + } + else if (fmt->style == STYLE_FAR_SHADOW) + { + if (style_pad_r < 2) style_pad_r = 2; + if (style_pad_b < 2) style_pad_b = 2; + } + else if (fmt->style == STYLE_OUTLINE_SOFT_SHADOW) + { + if (style_pad_l < 1) style_pad_l = 1; + if (style_pad_r < 3) style_pad_r = 3; + if (style_pad_t < 1) style_pad_t = 1; + if (style_pad_b < 3) style_pad_b = 3; + } + else if (fmt->style == STYLE_SOFT_SHADOW) + { + if (style_pad_l < 1) style_pad_l = 1; + if (style_pad_r < 3) style_pad_r = 3; + if (style_pad_t < 1) style_pad_t = 1; + if (style_pad_b < 3) style_pad_b = 3; + } + else if (fmt->style == STYLE_FAR_SOFT_SHADOW) + { + if (style_pad_r < 4) style_pad_r = 4; + if (style_pad_b < 4) style_pad_b = 4; + } + if (fmt->underline2) + c->have_underline2 = 1; + else if (fmt->underline) + c->have_underline = 1; } else if ((n->type == NODE_TEXT) && (n->text)) - _layout_text_append(c, fmt, n); + { + _layout_text_append(c, fmt, n); + if ((c->have_underline2) || (c->have_underline)) + { + if (style_pad_b < c->underline_extend) + style_pad_b = c->underline_extend; + c->have_underline = 0; + c->have_underline2 = 0; + c->underline_extend = 0; + } + } } if ((c->ln) && (c->ln->items) && (fmt)) _layout_line_advance(c, fmt); @@ -2326,14 +2424,26 @@ c->format_stack = evas_list_remove_list(c->format_stack, c->format_stack); _format_free(c->obj, fmt); } - c->hmax = c->y; + c->hmax = c->y + o->style_pad.t + o->style_pad.b; + if (w_ret) *w_ret = c->wmax; + if (h_ret) *h_ret = c->hmax; + if ((o->style_pad.l != style_pad_l) || (o->style_pad.r != style_pad_r) || + (o->style_pad.t != style_pad_t) || (o->style_pad.b != style_pad_b)) + { + _lines_clear(obj, c->lines); + o->style_pad.l = style_pad_l; + o->style_pad.r = style_pad_r; + o->style_pad.t = style_pad_t; + o->style_pad.b = style_pad_b; + return _layout(obj, calc_only, w, h, w_ret, h_ret); + } if (!calc_only) { c->o->lines = c->lines; } else { - /* free lines */ + _lines_clear(obj, c->lines); } } @@ -2405,12 +2515,29 @@ { Evas_Object_Textblock *o; Evas_Object_List *l, *ll; + int i, j; + int pback, backx = 0; + int pline, linex = 0; + int pline2, line2x = 0; + int pstrike, strikex = 0; + int x2; + unsigned char r = 0, g = 0, b = 0, a = 0; + unsigned char r2 = 0, g2 = 0, b2 = 0, a2 = 0; + unsigned char r3 = 0, g3 = 0, b3 = 0, a3 = 0; + const char vals[5][5] = + { + {0, 1, 2, 1, 0}, + {1, 3, 4, 3, 1}, + {2, 4, 5, 4, 2}, + {1, 3, 4, 3, 1}, + {0, 1, 2, 1, 0} + }; /* render object to surface with context, and offxet by x,y */ o = (Evas_Object_Textblock *)(obj->object_data); obj->layer->evas->engine.func->context_multiplier_unset(output, context); -#if 0 /* using for some debugging. will go soon */ +#if 1 /* using for some debugging. will go soon */ obj->layer->evas->engine.func->context_color_set(output, context, 230, 160, 30, 100); @@ -2422,40 +2549,347 @@ obj->cur.cache.geometry.w, obj->cur.cache.geometry.h); #endif - for (l = (Evas_Object_List *)o->lines; l; l = l->next) +#define ITEM_WALK() \ + for (l = (Evas_Object_List *)o->lines; l; l = l->next) \ + { \ + Evas_Object_Textblock_Line *ln; \ + \ + ln = (Evas_Object_Textblock_Line *)l; \ + for (ll = (Evas_Object_List *)ln->items; ll; ll = ll->next) \ + { \ + Evas_Object_Textblock_Item *it; \ + int yoff; \ + \ + it = (Evas_Object_Textblock_Item *)ll; \ + yoff = ln->baseline; \ + if (it->format->valign != -1.0) \ + yoff = (it->format->valign * (double)(ln->h - it->h)) + it->baseline; +#define ITEM_WALK_END() \ + } \ + pback = 0; \ + pline = 0; \ + pline2 = 0; \ + } +#define COLOR_SET(col) \ + ENFN->context_color_set(output, context, \ + it->format->color.col.r, \ + it->format->color.col.g, \ + it->format->color.col.b, \ + it->format->color.col.a); +#define COLOR_SET_AMUL(col, amul) \ + ENFN->context_color_set(output, context, \ + it->format->color.col.r, \ + it->format->color.col.g, \ + it->format->color.col.b, \ + ((int)it->format->color.col.a * (amul)) / 255); +#define DRAW_TEXT(ox, oy) \ + ENFN->font_draw(output, context, surface, it->format->font.font, \ + obj->cur.cache.geometry.x + ln->x + it->x - it->inset + x + (ox), \ + obj->cur.cache.geometry.y + ln->y + yoff + y + (oy), \ + it->w, it->h, it->w, it->h, it->text); + pback = 0; + /* backing */ + ITEM_WALK(); + if ((it->format->backing) && (!pback) && (ll->next)) + { + pback = 1; + backx = it->x; + r = it->format->color.backing.r; + g = it->format->color.backing.g; + b = it->format->color.backing.b; + a = it->format->color.backing.a; + } + else if (((pback) && (!it->format->backing)) || + (!ll->next) || + (it->format->color.backing.r != r) || + (it->format->color.backing.g != g) || + (it->format->color.backing.b != b) || + (it->format->color.backing.a != a)) + { + if ((it->format->backing) && (!pback)) + { + backx = it->x; + r = it->format->color.backing.r; + g = it->format->color.backing.g; + b = it->format->color.backing.b; + a = it->format->color.backing.a; + } + x2 = it->x + it->w; + if (!it->format->backing) + { + x2 = it->x; + pback = 0; + } + if (x2 > backx) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r) / 255, + (obj->cur.cache.clip.g * g) / 255, + (obj->cur.cache.clip.b * b) / 255, + (obj->cur.cache.clip.a * a) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.cache.geometry.x + ln->x + backx + x, + obj->cur.cache.geometry.y + ln->y + y, + x2 - backx, + ln->h); + } + if (it->format->backing) pback = 1; + backx = it->x; + r = it->format->color.backing.r; + g = it->format->color.backing.g; + b = it->format->color.backing.b; + a = it->format->color.backing.a; + } + ITEM_WALK_END(); + + /* shadows */ + ITEM_WALK(); + if (it->format->style == STYLE_SHADOW) + { + COLOR_SET(shadow); + DRAW_TEXT(1, 1); + } + else if ((it->format->style == STYLE_OUTLINE_SHADOW) || + (it->format->style == STYLE_FAR_SHADOW)) + { + COLOR_SET(shadow); + DRAW_TEXT(2, 2); + } + else if ((it->format->style == STYLE_OUTLINE_SOFT_SHADOW) || + (it->format->style == STYLE_FAR_SOFT_SHADOW)) { - Evas_Object_Textblock_Line *ln; - - ln = (Evas_Object_Textblock_Line *)l; - for (ll = (Evas_Object_List *)ln->items; ll; ll = ll->next) + for (j = 0; j < 5; j++) { - Evas_Object_Textblock_Item *it; - int yoff; - - it = (Evas_Object_Textblock_Item *)ll; - ENFN->context_color_set(output, context, - it->format->color.normal.r, - it->format->color.normal.g, - it->format->color.normal.b, - it->format->color.normal.a); - yoff = ln->baseline; - if (it->format->valign != -1.0) - yoff = (it->format->valign * (double)(ln->h - it->h)) + - it->baseline; -// printf("DRAW: %i,%i [%s]\n", ln->x + it->x, ln->y + ln->baseline, it->text); - ENFN->font_draw(output, context, surface, it->format->font.font, - obj->cur.cache.geometry.x + ln->x + it->x + x, - obj->cur.cache.geometry.y + ln->y + yoff + y, - it->w, it->h, it->w, it->h, it->text); + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(shadow, vals[i][j] * 50); + DRAW_TEXT(i, j); + } + } } } - -/* - if (o->engine_data) + else if (it->format->style == STYLE_SOFT_SHADOW) { - + 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 - 1, j - 1); + } + } + } } - */ + ITEM_WALK_END(); + + /* glows */ + ITEM_WALK(); + if (it->format->style == STYLE_GLOW) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + 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); + } + ITEM_WALK_END(); + + /* outlines */ + ITEM_WALK(); + if ((it->format->style == STYLE_OUTLINE) || + (it->format->style == STYLE_OUTLINE_SHADOW) || + (it->format->style == STYLE_OUTLINE_SOFT_SHADOW)) + { + COLOR_SET(outline); + DRAW_TEXT(-1, 0); + DRAW_TEXT(1, 0); + DRAW_TEXT(0, -1); + DRAW_TEXT(0, 1); + } + ITEM_WALK_END(); + + /* normal text */ + ITEM_WALK(); + COLOR_SET(normal); + DRAW_TEXT(0, 0); + if ((it->format->strikethrough) && (!pstrike) && (ll->next)) + { + pstrike = 1; + strikex = it->x; + r3 = it->format->color.strikethrough.r; + g3 = it->format->color.strikethrough.g; + b3 = it->format->color.strikethrough.b; + a3 = it->format->color.strikethrough.a; + } + else if (((pstrike) && (!it->format->strikethrough)) || + (!ll->next) || + (it->format->color.strikethrough.r != r3) || + (it->format->color.strikethrough.g != g3) || + (it->format->color.strikethrough.b != b3) || + (it->format->color.strikethrough.a != a3)) + { + if ((it->format->strikethrough) && (!pstrike)) + { + strikex = it->x; + r3 = it->format->color.strikethrough.r; + g3 = it->format->color.strikethrough.g; + b3 = it->format->color.strikethrough.b; + a3 = it->format->color.strikethrough.a; + } + x2 = it->x + it->w; + if (!it->format->strikethrough) + { + x2 = it->x; + pstrike = 0; + } + if (x2 > strikex) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r3) / 255, + (obj->cur.cache.clip.g * g3) / 255, + (obj->cur.cache.clip.b * b3) / 255, + (obj->cur.cache.clip.a * a3) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.cache.geometry.x + ln->x + strikex + x, + obj->cur.cache.geometry.y + ln->y + y + (ln->h / 2), + x2 - strikex, + 1); + } + if (it->format->strikethrough) pstrike = 1; + strikex = it->x; + r3 = it->format->color.strikethrough.r; + g3 = it->format->color.strikethrough.g; + b3 = it->format->color.strikethrough.b; + a3 = it->format->color.strikethrough.a; + } + if ((it->format->underline) && (!pline) && (ll->next)) + { + pline = 1; + linex = it->x; + r = it->format->color.underline.r; + g = it->format->color.underline.g; + b = it->format->color.underline.b; + a = it->format->color.underline.a; + } + else if (((pline) && (!it->format->underline)) || + (!ll->next) || + (it->format->color.underline.r != r) || + (it->format->color.underline.g != g) || + (it->format->color.underline.b != b) || + (it->format->color.underline.a != a)) + { + if ((it->format->underline) && (!pline)) + { + linex = it->x; + r = it->format->color.underline.r; + g = it->format->color.underline.g; + b = it->format->color.underline.b; + a = it->format->color.underline.a; + } + x2 = it->x + it->w; + if (!it->format->underline) + { + x2 = it->x; + pline = 0; + } + if (x2 > linex) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r) / 255, + (obj->cur.cache.clip.g * g) / 255, + (obj->cur.cache.clip.b * b) / 255, + (obj->cur.cache.clip.a * a) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.cache.geometry.x + ln->x + linex + x, + obj->cur.cache.geometry.y + ln->y + y + ln->baseline + 1, + x2 - linex, + 1); + } + if (it->format->underline) pline = 1; + linex = it->x; + r = it->format->color.underline.r; + g = it->format->color.underline.g; + b = it->format->color.underline.b; + a = it->format->color.underline.a; + } + if ((it->format->underline2) && (!pline2) && (ll->next)) + { + pline2 = 1; + line2x = it->x; + r2 = it->format->color.underline2.r; + g2 = it->format->color.underline2.g; + b2 = it->format->color.underline2.b; + a2 = it->format->color.underline2.a; + } + else if (((pline2) && (!it->format->underline2)) || + (!ll->next) || + (it->format->color.underline2.r != r2) || + (it->format->color.underline2.g != g2) || + (it->format->color.underline2.b != b2) || + (it->format->color.underline2.a != a2)) + { + if ((it->format->underline2) && (!pline2)) + { + line2x = it->x; + r2 = it->format->color.underline2.r; + g2 = it->format->color.underline2.g; + b2 = it->format->color.underline2.b; + a2 = it->format->color.underline2.a; + } + x2 = it->x + it->w; + if (!it->format->underline2) + { + x2 = it->x; + pline2 = 0; + } + if (x2 > line2x) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r2) / 255, + (obj->cur.cache.clip.g * g2) / 255, + (obj->cur.cache.clip.b * b2) / 255, + (obj->cur.cache.clip.a * a2) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.cache.geometry.x + ln->x + line2x + x, + obj->cur.cache.geometry.y + ln->y + y + ln->baseline + 3, + x2 - line2x, + 1); + } + if (it->format->underline2) pline2 = 1; + line2x = it->x; + r2 = it->format->color.underline2.r; + g2 = it->format->color.underline2.g; + b2 = it->format->color.underline2.b; + a2 = it->format->color.underline2.a; + } + ITEM_WALK_END(); } static void ------------------------------------------------------- SF.Net email is Sponsored by the Better Software Conference & EXPO September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs