From: Enlightenment S. <no-...@en...> - 2010-08-09 16:47:41
|
Log: Evas: Fixed compilation without BiDi support. Author: tasn Date: 2010-08-09 09:47:35 -0700 (Mon, 09 Aug 2010) New Revision: 50934 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-09 16:46:04 UTC (rev 50933) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-09 16:47:35 UTC (rev 50934) @@ -4661,9 +4661,9 @@ /* Advance the formats */ if (fnode && (fnode->text_node == cur->node)) fnode->offset += len; - +#ifdef BIDI_SUPPORT evas_bidi_update_props(eina_ustrbuf_string_get(n->unicode), &n->bidi_props); - +#endif _evas_textblock_changed(o, cur->obj); free(text); return len; |
From: Enlightenment S. <no-...@en...> - 2010-08-10 08:34:53
|
Log: Evas: Fixed a bug when erasing the last paragraph of a textblock. Author: tasn Date: 2010-08-10 01:34:47 -0700 (Tue, 10 Aug 2010) New Revision: 50958 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-10 08:17:06 UTC (rev 50957) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-10 08:34:47 UTC (rev 50958) @@ -4246,7 +4246,7 @@ { Evas_Object_Textblock_Node_Format *nnode; Evas_Object_Textblock_Node_Text *tnode; - int off; + nnode = n; tnode = n->text_node; do @@ -4254,11 +4254,10 @@ Evas_Object_Textblock_Node_Format *curnode; curnode = nnode; nnode = _NODE_FORMAT(EINA_INLIST_GET(nnode)->next); - off = nnode->offset; _evas_textblock_node_format_remove(o, curnode); } - while (nnode && (nnode->text_node == tnode) && (off == 0)); + while (nnode && (nnode->text_node == tnode) && (nnode->offset == 0)); } /* end = -1 means to the end */ |
From: Enlightenment S. <no-...@en...> - 2010-08-11 07:23:55
|
Log: Evas: Added auto lines alignment to textblock. RTL lines will automatically align to the right and LTR lines to the left. This is not done per line, but per paragraph so a line break will not force recalculation of auto-alignment, only a PS. Author: tasn Date: 2010-08-11 00:23:48 -0700 (Wed, 11 Aug 2010) New Revision: 50984 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 06:57:07 UTC (rev 50983) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 07:23:48 UTC (rev 50984) @@ -240,6 +240,7 @@ { int ref; double halign; + Eina_Bool halign_auto; double valign; struct { const char *name; @@ -1260,10 +1261,11 @@ if (*endptr == '%') val /= 100.0; } - fmt->halign = val;; + fmt->halign = val; if (fmt->halign < 0.0) fmt->halign = 0.0; else if (fmt->halign > 1.0) fmt->halign = 1.0; } + fmt->halign_auto = EINA_FALSE; } else if (cmd == valignstr) { @@ -1673,6 +1675,7 @@ int underline_extend; int have_underline, have_underline2; double align; + Eina_Bool align_auto; }; /** @@ -1737,6 +1740,7 @@ { c->ln = calloc(1, sizeof(Evas_Object_Textblock_Line)); c->align = fmt->halign; + c->align_auto = fmt->halign_auto; c->marginl = fmt->margin.l; c->marginr = fmt->margin.r; c->par->lines = (Evas_Object_Textblock_Line *)eina_inlist_append(EINA_INLIST_GET(c->par->lines), EINA_INLIST_GET(c->ln)); @@ -1823,6 +1827,7 @@ c->format_stack = eina_list_prepend(c->format_stack, fmt); fmt->ref = 1; fmt->halign = 0.0; + fmt->halign_auto = EINA_TRUE; fmt->valign = -1.0; fmt->style = EVAS_TEXT_STYLE_PLAIN; fmt->tabstops = 32; @@ -1876,6 +1881,7 @@ if (key) eina_stringshare_del(key); if (val) eina_stringshare_del(val); c->align = fmt->halign; + c->align_auto = fmt->halign_auto; c->marginl = fmt->margin.l; c->marginr = fmt->margin.r; } @@ -1889,6 +1895,36 @@ /** * @internal + * Get the current line's alignment from the context. + * + * @param c the context to work on - Not NULL. + */ +static inline double +_layout_line_align_get(Ctxt *c) +{ +#ifdef BIDI_SUPPORT + if (c->align_auto && c->ln && c->ln->items) + { + if ((c->ln->items->source_node->bidi_props.direction == + FRIBIDI_PAR_RTL) || + (c->ln->items->source_node->bidi_props.direction == + FRIBIDI_PAR_WRTL)) + { + /* Align right*/ + return 1.0; + } + else + { + /* Align left */ + return 0.0; + } + } +#endif + return c->align; +} + +/** + * @internal * Create a new line and append it to the lines in the context. * * @param c the context to work on - Not NULL. @@ -1982,7 +2018,7 @@ 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); + c->marginl - c->marginr) * _layout_line_align_get(c)); if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax) c->wmax = c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l; } @@ -2910,6 +2946,7 @@ c->underline_extend = 0; c->line_no = 0; c->align = 0.0; + c->align_auto = EINA_TRUE; c->ln = NULL; /* setup default base style */ |
From: Enlightenment S. <no-...@en...> - 2010-08-11 07:46:43
|
Log: Evas: Added align=auto format to textblock. This is the default. This lets you make textblock (or parts affected by this tag) auto align according to the natural paragraph direction. Author: tasn Date: 2010-08-11 00:46:37 -0700 (Wed, 11 Aug 2010) New Revision: 50985 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 07:23:48 UTC (rev 50984) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 07:46:37 UTC (rev 50985) @@ -1246,26 +1246,33 @@ &(fmt->color.strikethrough.b), &(fmt->color.strikethrough.a)); else if (cmd == alignstr) { - if (!strcmp(tmp_param, "middle")) fmt->halign = 0.5; - else if (!strcmp(tmp_param, "center")) fmt->halign = 0.5; - else if (!strcmp(tmp_param, "left")) fmt->halign = 0.0; - else if (!strcmp(tmp_param, "right")) fmt->halign = 1.0; + if (!strcmp(tmp_param, "auto")) + { + fmt->halign_auto = EINA_TRUE; + } else { - char *endptr = NULL; - double val = strtod(tmp_param, &endptr); - if (endptr) + if (!strcmp(tmp_param, "middle")) fmt->halign = 0.5; + else if (!strcmp(tmp_param, "center")) fmt->halign = 0.5; + else if (!strcmp(tmp_param, "left")) fmt->halign = 0.0; + else if (!strcmp(tmp_param, "right")) fmt->halign = 1.0; + else { - while (*endptr && _is_white(*endptr)) - endptr++; - if (*endptr == '%') - val /= 100.0; + char *endptr = NULL; + double val = strtod(tmp_param, &endptr); + if (endptr) + { + while (*endptr && _is_white(*endptr)) + endptr++; + if (*endptr == '%') + val /= 100.0; + } + fmt->halign = val; + if (fmt->halign < 0.0) fmt->halign = 0.0; + else if (fmt->halign > 1.0) fmt->halign = 1.0; } - fmt->halign = val; - if (fmt->halign < 0.0) fmt->halign = 0.0; - else if (fmt->halign > 1.0) fmt->halign = 1.0; + fmt->halign_auto = EINA_FALSE; } - fmt->halign_auto = EINA_FALSE; } else if (cmd == valignstr) { |
From: Enlightenment S. <no-...@en...> - 2010-08-11 08:33:30
|
Log: Evas: fix range text get in textblock. Author: tasn Date: 2010-08-11 01:33:22 -0700 (Wed, 11 Aug 2010) New Revision: 50988 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 08:25:02 UTC (rev 50987) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 08:33:22 UTC (rev 50988) @@ -1152,7 +1152,7 @@ * * @param obj the evas object - should not be NULL. * @param fmt The format to populate - should not be NULL. - * @param[in] cmd the command to proccess + * @param[in] cmd the command to proccess, should be stringshared. * @param[in] param the parameter of the command. */ static void @@ -5887,7 +5887,7 @@ if (n1 == n2) { text = eina_ustrbuf_string_get(n1->unicode); - eina_ustrbuf_append_length(buf, text, cur2->pos - cur1->pos); + eina_ustrbuf_append_length(buf, text + cur1->pos, cur2->pos - cur1->pos); } else { @@ -5903,11 +5903,10 @@ len = eina_ustrbuf_length_get(n1->unicode); text = eina_ustrbuf_string_get(n1->unicode); - eina_ustrbuf_append_length(buf, text, len - cur1->pos); + eina_ustrbuf_append_length(buf, text + cur1->pos, len - cur1->pos); - len = eina_ustrbuf_length_get(n2->unicode); text = eina_ustrbuf_string_get(n2->unicode); - eina_ustrbuf_append_length(buf, text + cur2->pos, len - cur2->pos); + eina_ustrbuf_append_length(buf, text, cur2->pos); } /* return the string */ |
From: Enlightenment S. <no-...@en...> - 2010-08-11 10:27:51
|
Log: Evas: Cursor updates is now done in one function and it's updated correctly everywhere. Author: tasn Date: 2010-08-11 03:27:44 -0700 (Wed, 11 Aug 2010) New Revision: 50990 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 09:40:21 UTC (rev 50989) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 10:27:44 UTC (rev 50990) @@ -391,6 +391,9 @@ static void _evas_textblock_node_format_free(Evas_Object_Textblock_Node_Format *n); static void _evas_textblock_node_text_free(Evas_Object_Textblock_Node_Text *n); static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj); +static void _evas_textblock_cursors_update(const Evas_Textblock_Cursor *cur, + const Evas_Object_Textblock_Node_Text *n, + int start, int offset); /* styles */ /** @@ -3719,6 +3722,7 @@ evas_textblock_cursor_paragraph_first(o->cursor); evas_object_textblock_text_markup_prepend(o->cursor, text); + /* Point all the cursors to the starrt */ { Eina_List *l; Evas_Textblock_Cursor *data; @@ -4076,30 +4080,19 @@ { Evas_Object_Textblock_Node_Text *nnode; Evas_Object_Textblock *o; + int len; + len = eina_ustrbuf_length_get(cur->node->unicode); + if (!cur) return; o = (Evas_Object_Textblock *)(cur->obj->object_data); nnode = _NODE_TEXT(EINA_INLIST_GET(cur->node)->next); _evas_textblock_nodes_merge(o, cur->node, nnode); + _evas_textblock_cursors_update(o->cursor, nnode, 0, len); + if (nnode == o->cursor->node) { - Eina_List *l; - Evas_Textblock_Cursor *data; - int len; - len = eina_ustrbuf_length_get(cur->node->unicode); - - if (nnode == o->cursor->node) - { - o->cursor->node = cur->node; - o->cursor->pos += len; - } - EINA_LIST_FOREACH(o->cursors, l, data) - { - if (nnode == data->node) - { - data->node = cur->node; - data->pos += len; - } - } + o->cursor->node = cur->node; + o->cursor->pos += len; } } @@ -5326,6 +5319,48 @@ /** * @internal + * Update all the cursors after cur. + * + * @param cur the cursor. + * @param n the current textblock node. + * @param start the starting pos. + * @param offset how much to adjust (can be negative). + */ +static void +_evas_textblock_cursors_update(const Evas_Textblock_Cursor *cur, + const Evas_Object_Textblock_Node_Text *n, + int start, int offset) +{ + Eina_List *l; + Evas_Textblock_Cursor *data; + Evas_Object_Textblock *o; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + + if (cur != o->cursor) + { + if ((n == o->cursor->node) && + (o->cursor->pos > start)) + { + o->cursor->pos += offset; + if (o->cursor->pos < 0) o->cursor->pos = 0; + } + } + EINA_LIST_FOREACH(o->cursors, l, data) + { + if (data != cur) + { + if ((n == data->node) && + (data->pos > start)) + { + data->pos += offset; + if (data->pos < 0) data->pos = 0; + } + } + } +} + +/** + * @internal * Mark and notifiy that the textblock has changed. * * @param o the textblock object. @@ -5367,30 +5402,13 @@ if (!cur) return 0; text = evas_common_encoding_utf8_to_unicode(_text, &len); o = (Evas_Object_Textblock *)(cur->obj->object_data); - /*FIXME: should we? cause we don't. */ /* Update all the cursors after our position. */ - { - Eina_List *l; - Evas_Textblock_Cursor *data; + _evas_textblock_cursors_update(cur, cur->node, cur->pos, eina_unicode_strlen(text)); - if (cur != o->cursor) - { - if (cur->node == o->cursor->node) - { - if ((o->cursor->node) && - (o->cursor->pos >= cur->pos)) - { - o->cursor->pos += eina_unicode_strlen(text); - } - } - } - } - n = cur->node; if (n) { Evas_Object_Textblock_Node_Format *nnode; - /*FIXME: won't work for invisible formats */ if (evas_textblock_cursor_format_is_visible_get(cur)) { fnode = _evas_textblock_cursor_node_format_before_pos_get(cur); @@ -5599,22 +5617,8 @@ eina_ustrbuf_insert_char(cur->node->unicode, EVAS_TEXTBLOCK_REPLACEMENT_CHAR, cur->pos); - /*FIXME: should we? because we don't */ /* Advance all the cursors after our cursor */ - Eina_List *l; - Evas_Textblock_Cursor *data; - - if (cur != o->cursor) - { - if (cur->node == o->cursor->node) - { - if ((o->cursor->node) && - (o->cursor->pos >= cur->pos)) - { - o->cursor->pos++; - } - } - } + _evas_textblock_cursors_update(cur, cur->node, cur->pos, 1); } if (_IS_PARAGRAPH_SEPARATOR(format)) @@ -5731,32 +5735,8 @@ } } - { - Eina_List *l; - Evas_Textblock_Cursor *data; - - if (cur != o->cursor) - { - if ((n == o->cursor->node) && - (o->cursor->pos > ppos)) - { - o->cursor->pos -= (index - ppos); - } - } - EINA_LIST_FOREACH(o->cursors, l, data) - { - if (data != cur) - { - if ((n == data->node) && - (data->pos > ppos)) - { - data->pos -= (index - ppos); - } - } - } - } - - _evas_textblock_changed(o, cur->obj); + _evas_textblock_cursors_update(cur, n, ppos, -(index - ppos)); + _evas_textblock_changed(o, cur->obj); } /** @@ -5772,6 +5752,7 @@ Evas_Object_Textblock *o; Evas_Object_Textblock_Node_Text *n1, *n2, *n; Evas_Object_Textblock_Node_Format *fnode = NULL; + /*FIXME: Update cursors */ if (!cur1 || !cur1->node) return; if (!cur2 || !cur2->node) return; @@ -5816,6 +5797,7 @@ { fnode->offset -= cur2->pos - cur1->pos; } + _evas_textblock_cursors_update(cur1, cur1->node, cur1->pos, - (cur2->pos - cur1->pos)); } else { @@ -5841,6 +5823,8 @@ } /* Merge the nodes because we removed the PS */ _evas_textblock_nodes_merge(o, n1, n2); + _evas_textblock_cursors_update(cur1, cur1->node, cur1->pos, - cur1->pos); + _evas_textblock_cursors_update(cur2, cur2->node, 0, - cur2->pos); } evas_textblock_cursor_copy(cur1, cur2); _evas_textblock_changed(o, cur1->obj); |
From: Enlightenment S. <no-...@en...> - 2010-08-11 11:20:18
|
Log: Evas: Textblock - Sanitized format init and shutdown. Author: tasn Date: 2010-08-11 04:20:10 -0700 (Wed, 11 Aug 2010) New Revision: 50991 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 10:27:44 UTC (rev 50990) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 11:20:10 UTC (rev 50991) @@ -979,6 +979,8 @@ *b = (*b * *a) / 255; } +/* The refcount for the formats. */ +static int format_refcount = 0; /* Holders for the stringshares */ static const char *fontstr = NULL; static const char *font_fallbacksstr = NULL; @@ -1017,7 +1019,7 @@ static void _format_command_init(void) { - if (!fontstr) + if (format_refcount == 0) { fontstr = eina_stringshare_add("font"); font_fallbacksstr = eina_stringshare_add("font_fallbacks"); @@ -1049,40 +1051,7 @@ itemstr = eina_stringshare_add("item"); linefillstr = eina_stringshare_add("linefill"); } - else - { - /*FIXME: just implement proper refcounting */ - return; - eina_stringshare_ref(fontstr); - eina_stringshare_ref(font_fallbacksstr); - eina_stringshare_ref(font_sizestr); - eina_stringshare_ref(font_sourcestr); - eina_stringshare_ref(colorstr); - eina_stringshare_ref(underline_colorstr); - eina_stringshare_ref(underline2_colorstr); - eina_stringshare_ref(outline_colorstr); - eina_stringshare_ref(shadow_colorstr); - eina_stringshare_ref(glow_colorstr); - eina_stringshare_ref(glow2_colorstr); - eina_stringshare_ref(backing_colorstr); - eina_stringshare_ref(strikethrough_colorstr); - eina_stringshare_ref(alignstr); - eina_stringshare_ref(valignstr); - eina_stringshare_ref(wrapstr); - eina_stringshare_ref(left_marginstr); - eina_stringshare_ref(right_marginstr); - eina_stringshare_ref(underlinestr); - eina_stringshare_ref(strikethroughstr); - eina_stringshare_ref(backingstr); - eina_stringshare_ref(stylestr); - eina_stringshare_ref(tabstopsstr); - eina_stringshare_ref(linesizestr); - eina_stringshare_ref(linerelsizestr); - eina_stringshare_ref(linegapstr); - eina_stringshare_ref(linerelgapstr); - eina_stringshare_ref(itemstr); - eina_stringshare_ref(linefillstr); - } + format_refcount++; } /** @@ -1092,10 +1061,8 @@ static void _format_command_shutdown(void) { - return; - /*FIXME: should del, the problem is that it's not possible to know the ref - * count so it's not possible to know when the last textblock finished. - * Should probably just add a refcount to the object. */ + if (--format_refcount > 0) return; + eina_stringshare_del(fontstr); eina_stringshare_del(font_fallbacksstr); eina_stringshare_del(font_sizestr); @@ -3769,7 +3736,6 @@ if (tag_end) { /* If we reached to a tag ending, analyze the tag */ - /* FIXME: Move tag analyzing to a different function */ char *ttag; size_t ttag_len = tag_end - tag_start -1; |
From: Enlightenment S. <no-...@en...> - 2010-08-11 12:29:27
|
Log: Evas: Improved evas_textblock_cursor_range_text_get to return markup text instead of plain text. Author: tasn Date: 2010-08-11 05:29:20 -0700 (Wed, 11 Aug 2010) New Revision: 50992 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 11:20:10 UTC (rev 50991) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-11 12:29:20 UTC (rev 50992) @@ -2957,7 +2957,6 @@ Evas_Object_Textblock_Node_Format *fnode; size_t start; int off; - int first_run; /*FIXME-tom: A hack, so we'll only have one paragraph * until full support is implemented */ @@ -2975,7 +2974,6 @@ * we don't want to print them. */ fnode = n->format_node; start = off = 0; - first_run = 1; while (fnode && (fnode->text_node == n)) { off += fnode->offset; @@ -3000,7 +2998,6 @@ { off = 0; } - first_run = 0; fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next); } _layout_text_append(c, fmt, n, start, -1, o->repch); @@ -3664,6 +3661,8 @@ /** * Sets the tetxblock's text to the markup text. * + * @note assumes text does not include the unicode replacement char (0xFFFD) + * * @param obj the textblock object. * @param text the markup text to use. * @return Return no value. @@ -3703,6 +3702,8 @@ /** * Prepends markup to the cursor cur. * + * @note assumes text does not include the unicode replacement char (0xFFFD) + * * @param cur the cursor to prepend to. * @param text the markup text to prepend. * @return Return no value. @@ -3930,7 +3931,6 @@ Evas_Object_Textblock_Node_Format *fnode; Eina_Unicode *text_base, *text; int off; - int first_run; /* For each text node to thorugh all of it's format nodes * append text from the start to the offset of the next format @@ -3942,7 +3942,6 @@ eina_unicode_strdup(eina_ustrbuf_string_get(n->unicode)); fnode = n->format_node; off = 0; - first_run = 1; while (fnode && (fnode->text_node == n)) { Eina_Unicode tmp_ch; @@ -3963,7 +3962,6 @@ { off = 0; } - first_run = 0; fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next); } /* Add the rest, skip replacement */ @@ -4956,6 +4954,7 @@ } /** + * @internal * Removes all the format nodes between start and end in the text node n. * This function updates the offset of the next format node and the * text nodes pointing to it. if end == -1 end means the end of the string. @@ -4996,6 +4995,41 @@ } /** + * @internal + * Returns the first format in the range between start and end in the textblock + * n. + * + * @param o the textblock object. + * @param n the text node the positinos refer to. + * @param start the start of where to delete from. + * @param end the end of the section to delete, if end == -1 it means the end of the string. + */ +static Evas_Object_Textblock_Node_Format * +_evas_textblock_node_text_get_first_format_between(Evas_Object_Textblock *o, + Evas_Object_Textblock_Node_Text *n, int start, int end) +{ + Evas_Object_Textblock_Node_Format *itr; + int use_end = 1; + itr = n->format_node; + if (end < 0) end = 0; + while (itr && (itr->text_node == n)) + { + start -= itr->offset; + end -= itr->offset; + if ((end <= 0) && use_end) + { + break; + } + if (start <= 0) + { + return itr; + } + itr = _NODE_FORMAT(EINA_INLIST_GET(itr)->next); + } + return NULL; +} + +/** * Removes a text node and the corresponding format nodes. * * @param o the textblock objec.t @@ -5799,21 +5833,23 @@ /** * Return the text in the range between cur1 and cur2 * + * FIXME: format is currently unused, you always get markup back. + * * @param cur1 one side of the range. * @param cur2 the other side of the range * @param format to be documented * @return the text in the range + * @see elm_entry_markup_to_utf8() */ -/* FIXME: support format and markup */ EAPI char * -evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *_cur2, Evas_Textblock_Text_Type format) +evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *_cur2, Evas_Textblock_Text_Type format __UNUSED__) { Evas_Object_Textblock *o; - Evas_Object_Textblock_Node_Text *n1, *n2, *n; - const Eina_Unicode *text; - Eina_UStrbuf *buf; + Evas_Object_Textblock_Node_Text *n1, *n2, *tnode; + Eina_Unicode *text; + Eina_Strbuf *buf; Evas_Textblock_Cursor *cur2; - buf = eina_ustrbuf_new(); + buf = eina_strbuf_new(); if (!cur1 || !cur1->node) return; if (!_cur2 || !_cur2->node) return; @@ -5834,38 +5870,76 @@ cur2->obj = _cur2->obj; evas_textblock_cursor_copy(_cur2, cur2); cur2->pos++; /* We want to also copy the pointed to char */ - if (n1 == n2) + /* Parse the text between the cursors. */ + for (tnode = cur1->node ; tnode ; + tnode = _NODE_TEXT(EINA_INLIST_GET(tnode)->next)) { - text = eina_ustrbuf_string_get(n1->unicode); - eina_ustrbuf_append_length(buf, text + cur1->pos, cur2->pos - cur1->pos); - } - else - { - int len; - n = _NODE_TEXT(EINA_INLIST_GET(n1)->next); - /* Add all the text nodes between */ - while (n && (n != n2)) + Evas_Object_Textblock_Node_Format *fnode; + Eina_Unicode *text_base, *text; + int off, first_pos; + + text_base = text = + eina_unicode_strdup(eina_ustrbuf_string_get(n1->unicode)); + fnode = _evas_textblock_node_text_get_first_format_between(o, n1, cur1->pos, cur2->pos); + /* Init the offset so the first one will count starting from cur1->pos + * and not the previous format node */ + if ((tnode == cur1->node) && fnode) { - text = eina_ustrbuf_string_get(n->unicode); - eina_ustrbuf_append(buf, text); - n = _NODE_TEXT(EINA_INLIST_GET(n)->next); + off = _evas_textblock_node_format_pos_get(fnode) - cur1->pos - fnode->offset; } - - len = eina_ustrbuf_length_get(n1->unicode); - text = eina_ustrbuf_string_get(n1->unicode); - eina_ustrbuf_append_length(buf, text + cur1->pos, len - cur1->pos); - - text = eina_ustrbuf_string_get(n2->unicode); - eina_ustrbuf_append_length(buf, text, cur2->pos); + else + { + off = 0; + } + text += cur1->pos; + while (fnode && (fnode->text_node == tnode)) + { + Eina_Unicode tmp_ch; + off += fnode->offset; + if ((tnode == cur2->node) && (text - text_base + off >= cur2->pos)) + { + break; + } + /* No need to skip on the first run */ + tmp_ch = text[off]; + text[off] = 0; /* Null terminate the part of the string */ + _markup_get_text_append(buf, text); + _markup_get_format_append(o, buf, fnode); + text[off] = tmp_ch; /* Restore the char */ + text += off; + if (fnode->visible) + { + off = -1; + text++; + } + else + { + off = 0; + } + fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next); + } + /* If we got to the last node, stop and add the rest outside */ + if (cur2->node == tnode) + { + /* Add the rest, skip replacement */ + /* Don't go past the second cursor pos */ + text_base[cur2->pos] = '\0'; + _markup_get_text_append(buf, text); + free(text_base); + break; + } + else + { + /* Add the rest, skip replacement */ + _markup_get_text_append(buf, text); + free(text_base); + } } - /* return the string */ { char *ret; - const Eina_Unicode *tmp; - tmp = eina_ustrbuf_string_get(buf); - ret = evas_common_encoding_unicode_to_utf8(tmp, NULL); - eina_ustrbuf_free(buf); + ret = eina_strbuf_string_steal(buf); + eina_strbuf_free(buf); return ret; } } |
From: Enlightenment S. <no-...@en...> - 2010-08-12 07:02:37
|
Log: Evas: fixed textblock compiler warnings. Author: tasn Date: 2010-08-12 00:02:30 -0700 (Thu, 12 Aug 2010) New Revision: 51029 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 06:11:13 UTC (rev 51028) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 07:02:30 UTC (rev 51029) @@ -1563,7 +1563,6 @@ while ((item = _format_parse(&s))) { - char tmp_delim = *s; if (_format_is_param(item)) { const char *key = NULL, *val = NULL; @@ -2373,7 +2372,6 @@ int wrap, twrap, ch, index, white_stripped; Eina_Unicode *alloc_str = NULL; const Eina_Unicode *str = EINA_UNICODE_EMPTY_STRING; - const Eina_Unicode *ustr; const Eina_Unicode *tbase; Evas_Object_Textblock_Item *it; @@ -2391,7 +2389,8 @@ str = alloca((len + 1) * sizeof(Eina_Unicode)); tbase = str; ind = 0; - urepch = evas_common_encoding_utf8_get_next(repch, &ind); + urepch = evas_common_encoding_utf8_get_next( + (const unsigned char *)repch, &ind); for (i = 0, ptr = (Eina_Unicode *)tbase; i < len; ptr++, i++) *ptr = urepch; *ptr = 0; @@ -3113,7 +3112,6 @@ if (!o->formatted.valid) _relayout(obj); EINA_INLIST_FOREACH(o->lines, ln) { - Evas_Object_Textblock_Format_Item *fit; Evas_Object_Textblock_Item *it; Evas_Object_Textblock_Line *lnn; @@ -4315,7 +4313,7 @@ EAPI Eina_Bool evas_textblock_cursor_is_format(const Evas_Textblock_Cursor *cur) { - if (!cur || !cur->node) return; + if (!cur || !cur->node) return EINA_FALSE; if (evas_textblock_cursor_format_is_visible_get(cur)) return EINA_TRUE; return (_evas_textblock_cursor_node_format_at_pos_get(cur)) ? EINA_TRUE : EINA_FALSE; @@ -4870,8 +4868,6 @@ Evas_Object_Textblock_Node_Text *tnode, Evas_Object_Textblock_Node_Format *fmt, int offset) { - size_t position = 0; - if (fmt) { fmt = _NODE_FORMAT(EINA_INLIST_GET(fmt)->next); @@ -5405,10 +5401,10 @@ Evas_Object_Textblock_Node_Text *n; Evas_Object_Textblock_Node_Format *fnode = NULL; Eina_Unicode *text; - size_t len = 0; + int len = 0; if (!cur) return 0; - text = evas_common_encoding_utf8_to_unicode(_text, &len); + text = evas_common_encoding_utf8_to_unicode((const unsigned char *) _text, &len); o = (Evas_Object_Textblock *)(cur->obj->object_data); /* Update all the cursors after our position. */ _evas_textblock_cursors_update(cur, cur->node, cur->pos, eina_unicode_strlen(text)); @@ -5478,13 +5474,14 @@ * @return Returns the len of the text added. * @see evas_textblock_cursor_text_append() */ - EAPI size_t +EAPI size_t evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *_text) { size_t len; /*append is essentially prepend without advancing */ len = evas_textblock_cursor_text_append(cur, _text); cur->pos += len; /*Advance */ + return len; } /** @@ -5493,7 +5490,7 @@ * * @prama n the format node to free */ - static void +static void _evas_textblock_node_format_free(Evas_Object_Textblock_Node_Format *n) { if (!n) return; @@ -5855,14 +5852,13 @@ { Evas_Object_Textblock *o; Evas_Object_Textblock_Node_Text *n1, *n2, *tnode; - Eina_Unicode *text; Eina_Strbuf *buf; Evas_Textblock_Cursor *cur2; buf = eina_strbuf_new(); - if (!cur1 || !cur1->node) return; - if (!_cur2 || !_cur2->node) return; - if (cur1->obj != _cur2->obj) return; + if (!cur1 || !cur1->node) return NULL; + if (!_cur2 || !_cur2->node) return NULL; + if (cur1->obj != _cur2->obj) return NULL; o = (Evas_Object_Textblock *)(cur1->obj->object_data); if (evas_textblock_cursor_compare(cur1, _cur2) > 0) { @@ -5885,7 +5881,7 @@ { Evas_Object_Textblock_Node_Format *fnode; Eina_Unicode *text_base, *text; - int off, first_pos; + int off; text_base = text = eina_unicode_strdup(eina_ustrbuf_string_get(n1->unicode)); |
From: Enlightenment S. <no-...@en...> - 2010-08-12 09:31:51
|
Log: Evas: textblock - Made _format_param_parse sane and cleaner and fixed compilation warnings about unused functions. Author: tasn Date: 2010-08-12 02:31:43 -0700 (Thu, 12 Aug 2010) New Revision: 51031 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 07:22:34 UTC (rev 51030) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 09:31:43 UTC (rev 51031) @@ -860,7 +860,7 @@ * @param[in] s start of the string * @param[in] p end of the string */ -static void +static void __UNUSED__ _append_text_run(Evas_Object_Textblock *o, const char *s, const char *p) { if ((s) && (p > s)) @@ -872,6 +872,7 @@ ts[p - s] = 0; ts = _clean_white(0, 0, ts); evas_textblock_cursor_text_append(o->cursor, ts); + free(ts); } } @@ -895,6 +896,7 @@ ts[p - s] = 0; ts = _clean_white(0, 0, ts); evas_textblock_cursor_text_prepend(o->cursor, ts); + free(ts); } } @@ -1477,29 +1479,28 @@ * It expects item to be of the structure: * "key=val" * - * FIXME: item should be const. - * * @param[in] item the item to parse - Not NULL. * @param[out] key where to store the key at - Not NULL. * @param[out] val where to store the value at - Not NULL. */ static void -_format_param_parse(char *item, const char **key, const char **val) +_format_param_parse(const char *item, const char **key, const char **val) { - char *p, *tmp; - const char *k, *v; + const char *equal, *end; - p = strchr(item, '='); - *p = '\0'; - k = eina_stringshare_add(item); - *key = k; - *p = '='; - p++; + equal = strchr(item, '='); + *key = eina_stringshare_add_length(item, equal - item); + equal++; /* Advance after the '=' */ /* Null terminate before the spaces */ - tmp = strchr(item, ' '); - if (tmp) *tmp = '\0'; - v = eina_stringshare_add(p); - *val = v; + end = strchr(equal, ' '); + if (end) + { + *val = eina_stringshare_add_length(equal, end - equal); + } + else + { + *val = eina_stringshare_add(equal); + } } /** @@ -4828,7 +4829,7 @@ * @param fmt the format to set according to. * @return nothing. */ -static void +static void __UNUSED__ _evas_textblock_cursor_node_text_at_format(Evas_Textblock_Cursor *cur, Evas_Object_Textblock_Node_Format *fmt) { Evas_Object_Textblock_Node_Text *text; |
From: Enlightenment S. <no-...@en...> - 2010-08-12 09:36:03
|
Log: Evas: textblock - made _format_fill faster. Author: tasn Date: 2010-08-12 02:35:53 -0700 (Thu, 12 Aug 2010) New Revision: 51032 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 09:31:43 UTC (rev 51031) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 09:35:53 UTC (rev 51032) @@ -1567,11 +1567,8 @@ if (_format_is_param(item)) { const char *key = NULL, *val = NULL; - char *tmp = alloca(s - item + 1); - strncpy(tmp, item, s - item); - tmp[s - item] = '\0'; - _format_param_parse(tmp, &key, &val); + _format_param_parse(item, &key, &val); _format_command(obj, fmt, key, val); eina_stringshare_del(key); eina_stringshare_del(val); |
From: Enlightenment S. <no-...@en...> - 2010-08-12 14:20:26
|
Log: Evas: Each paragraph has at least one layout item in order to mark it's existence. Author: tasn Date: 2010-08-12 07:20:19 -0700 (Thu, 12 Aug 2010) New Revision: 51039 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 14:16:32 UTC (rev 51038) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 14:20:19 UTC (rev 51039) @@ -2396,6 +2396,7 @@ else { int len; + int orig_off = off; len = eina_ustrbuf_length_get(n->unicode); if (off == 0) return; else if (off < 0) off = len - start; @@ -2404,6 +2405,13 @@ { start = 0; } + else if ((start == 0) && (off == 0) && (orig_off == -1)) + { + /* Special case that means that we need to add an empty + * item */ + str = EINA_UNICODE_EMPTY_STRING; + goto skip; + } else if ((start >= len) || (off > len)) { return; @@ -2415,13 +2423,11 @@ { alloc_str[off] = 0; } - tbase = str = alloc_str; + str = alloc_str; } } - else - { - tbase = str; - } +skip: + tbase = str; // printf("add: wrap: %i|%i, width: %i '%s'\n", fmt->wrap_word, fmt->wrap_char, c->w, str); new_line = 0; empty_item = 0; |
From: Enlightenment S. <no-...@en...> - 2010-08-12 14:59:48
|
Log: Evas: Textblock - Fixed a couple of segs/invalid memory access. Author: tasn Date: 2010-08-12 07:59:42 -0700 (Thu, 12 Aug 2010) New Revision: 51044 Modified: trunk/evas/src/lib/canvas/evas_object_text.c trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_text.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_text.c 2010-08-12 14:37:36 UTC (rev 51043) +++ trunk/evas/src/lib/canvas/evas_object_text.c 2010-08-12 14:59:42 UTC (rev 51044) @@ -336,7 +336,7 @@ return; MAGIC_CHECK_END(); - text = evas_common_encoding_utf8_to_unicode(_text, NULL); + text = evas_common_encoding_utf8_to_unicode((unsigned char *) _text, NULL); if (!text) text = eina_unicode_strdup(EINA_UNICODE_EMPTY_STRING); if ((o->cur.text) && (text) && (!eina_unicode_strcmp(o->cur.text, text))) Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 14:37:36 UTC (rev 51043) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 14:59:42 UTC (rev 51044) @@ -390,10 +390,8 @@ static void _evas_textblock_node_format_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Format *n); static void _evas_textblock_node_format_free(Evas_Object_Textblock_Node_Format *n); static void _evas_textblock_node_text_free(Evas_Object_Textblock_Node_Text *n); -static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj); -static void _evas_textblock_cursors_update(const Evas_Textblock_Cursor *cur, - const Evas_Object_Textblock_Node_Text *n, - int start, int offset); +static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj);static void _evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, int start, int offset); +static void _evas_textblock_cursors_set_node(Evas_Object_Textblock *o, const Evas_Object_Textblock_Node_Text *n, Evas_Object_Textblock_Node_Text *new_node); /* styles */ /** @@ -1879,10 +1877,11 @@ #ifdef BIDI_SUPPORT if (c->align_auto && c->ln && c->ln->items) { - if ((c->ln->items->source_node->bidi_props.direction == - FRIBIDI_PAR_RTL) || - (c->ln->items->source_node->bidi_props.direction == - FRIBIDI_PAR_WRTL)) + if (c->ln->items->source_node && + ((c->ln->items->source_node->bidi_props.direction == + FRIBIDI_PAR_RTL) || + (c->ln->items->source_node->bidi_props.direction == + FRIBIDI_PAR_WRTL))) { /* Align right*/ return 1.0; @@ -2441,12 +2440,15 @@ it = _layout_item_new(c, fmt, str); it->source_node = n; it->source_pos = start + str - tbase; - it->bidi_props.start = it->source_pos; - it->bidi_props.props = &it->source_node->bidi_props; + if (it->source_node) + { + it->bidi_props.start = it->source_pos; + it->bidi_props.props = &it->source_node->bidi_props; # ifdef BIDI_SUPPORT - evas_bidi_shape_string(it->text, &it->bidi_props, - eina_unicode_strlen(it->text)); + evas_bidi_shape_string(it->text, &it->bidi_props, + eina_unicode_strlen(it->text)); # endif + } tw = th = 0; if (fmt->font.font) c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, it->text, &it->bidi_props, &tw, &th); @@ -4037,6 +4039,7 @@ to->format_node = from->format_node; } + _evas_textblock_cursors_set_node(o, from, to); o->text_nodes = _NODE_TEXT(eina_inlist_remove( EINA_INLIST_GET(o->text_nodes), EINA_INLIST_GET(from))); _evas_textblock_node_text_free(from); @@ -4062,7 +4065,7 @@ o = (Evas_Object_Textblock *)(cur->obj->object_data); nnode = _NODE_TEXT(EINA_INLIST_GET(cur->node)->next); _evas_textblock_nodes_merge(o, cur->node, nnode); - _evas_textblock_cursors_update(o->cursor, nnode, 0, len); + _evas_textblock_cursors_update_offset(o->cursor, nnode, 0, len); if (nnode == o->cursor->node) { o->cursor->node = cur->node; @@ -5327,15 +5330,46 @@ /** * @internal - * Update all the cursors after cur. + * Set the node and offset of all the curs after cur. * * @param cur the cursor. * @param n the current textblock node. + * @param new_node the new node to set. + */ +static void +_evas_textblock_cursors_set_node(Evas_Object_Textblock *o, + const Evas_Object_Textblock_Node_Text *n, + Evas_Object_Textblock_Node_Text *new_node) +{ + Eina_List *l; + Evas_Textblock_Cursor *data; + + if (n == o->cursor->node) + { + o->cursor->pos = 0; + o->cursor->node = new_node; + } + EINA_LIST_FOREACH(o->cursors, l, data) + { + if (n == data->node) + { + data->pos = 0; + data->node = new_node; + } + } +} + +/** + * @internal + * Update the offset of all the cursors after cur. + * + * @param cur the cursor. + * @param n the current textblock node. * @param start the starting pos. * @param offset how much to adjust (can be negative). */ static void -_evas_textblock_cursors_update(const Evas_Textblock_Cursor *cur, +_evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, int start, int offset) { @@ -5411,7 +5445,7 @@ text = evas_common_encoding_utf8_to_unicode((const unsigned char *) _text, &len); o = (Evas_Object_Textblock *)(cur->obj->object_data); /* Update all the cursors after our position. */ - _evas_textblock_cursors_update(cur, cur->node, cur->pos, eina_unicode_strlen(text)); + _evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, eina_unicode_strlen(text)); n = cur->node; if (n) @@ -5629,7 +5663,7 @@ EVAS_TEXTBLOCK_REPLACEMENT_CHAR, cur->pos); /* Advance all the cursors after our cursor */ - _evas_textblock_cursors_update(cur, cur->node, cur->pos, 1); + _evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, 1); } if (_IS_PARAGRAPH_SEPARATOR(format)) @@ -5746,7 +5780,7 @@ } } - _evas_textblock_cursors_update(cur, n, ppos, -(index - ppos)); + _evas_textblock_cursors_update_offset(cur, n, ppos, -(index - ppos)); _evas_textblock_changed(o, cur->obj); } @@ -5807,7 +5841,7 @@ { fnode->offset -= cur2->pos - cur1->pos; } - _evas_textblock_cursors_update(cur1, cur1->node, cur1->pos, - (cur2->pos - cur1->pos)); + _evas_textblock_cursors_update_offset(cur1, cur1->node, cur1->pos, - (cur2->pos - cur1->pos)); } else { @@ -5833,8 +5867,8 @@ } /* Merge the nodes because we removed the PS */ _evas_textblock_nodes_merge(o, n1, n2); - _evas_textblock_cursors_update(cur1, cur1->node, cur1->pos, - cur1->pos); - _evas_textblock_cursors_update(cur2, cur2->node, 0, - cur2->pos); + _evas_textblock_cursors_update_offset(cur1, cur1->node, cur1->pos, - cur1->pos); + _evas_textblock_cursors_update_offset(cur2, cur2->node, 0, - cur2->pos); } evas_textblock_cursor_copy(cur1, cur2); _evas_textblock_changed(o, cur1->obj); @@ -5878,7 +5912,12 @@ cur2 = alloca(sizeof(Evas_Textblock_Cursor)); cur2->obj = _cur2->obj; evas_textblock_cursor_copy(_cur2, cur2); - cur2->pos++; /* We want to also copy the pointed to char */ + if (cur2->pos < eina_ustrbuf_length_get(cur2->node->unicode)) + { + /* We want to also copy the pointed to char, only if it's not + * the terminating null. */ + cur2->pos++; + } /* Parse the text between the cursors. */ for (tnode = cur1->node ; tnode ; tnode = _NODE_TEXT(EINA_INLIST_GET(tnode)->next)) |
From: Enlightenment S. <no-...@en...> - 2010-08-12 15:04:57
|
Log: Evas: Textblock fixed formating. Author: tasn Date: 2010-08-12 08:04:47 -0700 (Thu, 12 Aug 2010) New Revision: 51045 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 14:59:42 UTC (rev 51044) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 15:04:47 UTC (rev 51045) @@ -390,7 +390,8 @@ static void _evas_textblock_node_format_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Format *n); static void _evas_textblock_node_format_free(Evas_Object_Textblock_Node_Format *n); static void _evas_textblock_node_text_free(Evas_Object_Textblock_Node_Text *n); -static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj);static void _evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, int start, int offset); +static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj); +static void _evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, int start, int offset); static void _evas_textblock_cursors_set_node(Evas_Object_Textblock *o, const Evas_Object_Textblock_Node_Text *n, Evas_Object_Textblock_Node_Text *new_node); /* styles */ |
From: Enlightenment S. <no-...@en...> - 2010-08-12 15:49:53
|
Log: Evas textblock: Fixed cursor sizes in rare situations, for example the text from expedite textblock_basic test and point the 'c' in COLOR you would get a badly shaped cursor. Author: tasn Date: 2010-08-12 08:49:43 -0700 (Thu, 12 Aug 2010) New Revision: 51050 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 15:29:00 UTC (rev 51049) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-12 15:49:43 UTC (rev 51050) @@ -3132,10 +3132,9 @@ itn = (Evas_Object_Textblock_Item *)(((Eina_Inlist *)it)->next); p = (int)(it->source_pos + eina_unicode_strlen(it->text)); - /*FIXME: Bad, this sholud be > pos */ - if ((p >= pos) || + if ((p > pos) || ((p == pos) && (!lnn) && - ((!itn) | + ((!itn) || ((itn) && (itn->source_node != n))))) { *lnr = ln; @@ -4786,8 +4785,7 @@ cur->node = it->source_node; index = eina_unicode_strlen(it->text) - 1; if (index < 0) index = 0; - if ((index >= 0) && (it->text[0] != 0)) - GET_NEXT(it->text, index); + if (index >= 0) GET_NEXT(it->text, index); if (index >= 0) cur->pos += index; } else if (fi) |
From: Enlightenment S. <no-...@en...> - 2010-08-15 08:17:28
|
Log: Evas textblock: Free paragraphs as well as lines. Fixes a small memory leak. Author: tasn Date: 2010-08-15 01:17:21 -0700 (Sun, 15 Aug 2010) New Revision: 51126 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-15 07:06:15 UTC (rev 51125) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-15 08:17:21 UTC (rev 51126) @@ -1768,6 +1768,8 @@ static void _paragraphs_clear(const Evas_Object *obj, Evas_Object_Textblock_Paragraph *pars) { + Evas_Object_Textblock *o; + o = (Evas_Object_Textblock *)(obj->object_data); while (pars) { Evas_Object_Textblock_Paragraph *par; @@ -3062,12 +3064,13 @@ o->style_pad.t = style_pad_t; o->style_pad.b = style_pad_b; _layout(obj, calc_only, w, h, w_ret, h_ret); - _lines_clear(obj, lines); + _paragraphs_clear(obj, c->paragraphs); return; } if (!calc_only) { o->lines = c->par->lines; + o->paragraphs = c->paragraphs; return; } if (c->paragraphs) _paragraphs_clear(obj, c->paragraphs); @@ -3080,10 +3083,11 @@ _relayout(const Evas_Object *obj) { Evas_Object_Textblock *o; - Evas_Object_Textblock_Line *lines; + Evas_Object_Textblock_Paragraph *paragraphs; o = (Evas_Object_Textblock *)(obj->object_data); - lines = o->lines; + paragraphs = o->paragraphs; + o->paragraphs = NULL; o->lines = NULL; o->formatted.valid = 0; o->native.valid = 0; @@ -3092,7 +3096,7 @@ obj->cur.geometry.w, obj->cur.geometry.h, &o->formatted.w, &o->formatted.h); o->formatted.valid = 1; - if (lines) _lines_clear(obj, lines); + if (paragraphs) _paragraphs_clear(obj, paragraphs); o->last_w = obj->cur.geometry.w; o->changed = 0; o->redraw = 1; @@ -6555,10 +6559,10 @@ cur->pos = 0; } - /* FIXME: free the paragraphs as well */ - if (o->lines) + if (o->paragraphs) { - _lines_clear(obj, o->lines); + _paragraphs_clear(obj, o->paragraphs); + o->paragraphs = NULL; o->lines = NULL; } _evas_textblock_changed(o, obj); @@ -7131,9 +7135,10 @@ if ((o->changed) || (o->last_w != obj->cur.geometry.w)) { - Evas_Object_Textblock_Line *lines; + Evas_Object_Textblock_Paragraph *paragraphs; - lines = o->lines; + paragraphs = o->paragraphs; + o->paragraphs = NULL; o->lines = NULL; o->formatted.valid = 0; o->native.valid = 0; @@ -7142,7 +7147,10 @@ obj->cur.geometry.w, obj->cur.geometry.h, &o->formatted.w, &o->formatted.h); o->formatted.valid = 1; - if (lines) _lines_clear(obj, lines); + if (paragraphs) + { + _paragraphs_clear(obj, paragraphs); + } o->last_w = obj->cur.geometry.w; o->redraw = 0; evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); |
From: Enlightenment S. <no-...@en...> - 2010-08-15 08:59:46
|
Log: Evas textblock: Remove an unused function. Author: tasn Date: 2010-08-15 01:59:39 -0700 (Sun, 15 Aug 2010) New Revision: 51127 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-15 08:17:21 UTC (rev 51126) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-15 08:59:39 UTC (rev 51127) @@ -554,26 +554,6 @@ if (ln) free(ln); } -/** - * @internal - * Free all the lines - * @param obj The evas object, must not be NULL. - * @param lines the layout lines inlist to be freed. - * @see _line_free() - */ -static void -_lines_clear(const Evas_Object *obj, Evas_Object_Textblock_Line *lines) -{ - while (lines) - { - Evas_Object_Textblock_Line *ln; - - ln = (Evas_Object_Textblock_Line *)lines; - lines = (Evas_Object_Textblock_Line *)eina_inlist_remove(EINA_INLIST_GET(lines), EINA_INLIST_GET(ln)); - _line_free(obj, ln); - } -} - /* table of html escapes (that i can find) this should be ordered with the * most common first as it's a linear search to match - no hash for this. * |
From: Enlightenment S. <no-...@en...> - 2010-08-15 09:10:22
|
Log: Evas: Removed deprecated 'lines' from Evas_Object_Textblock. Author: tasn Date: 2010-08-15 02:10:15 -0700 (Sun, 15 Aug 2010) New Revision: 51129 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-15 09:01:16 UTC (rev 51128) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-15 09:10:15 UTC (rev 51129) @@ -299,7 +299,6 @@ Evas_Object_Textblock_Node_Text *text_nodes; Evas_Object_Textblock_Node_Format *format_nodes; Evas_Object_Textblock_Paragraph *paragraphs; - Evas_Object_Textblock_Line *lines; int last_w; struct { int l, r, t, b; @@ -3049,7 +3048,6 @@ } if (!calc_only) { - o->lines = c->par->lines; o->paragraphs = c->paragraphs; return; } @@ -3068,7 +3066,6 @@ o = (Evas_Object_Textblock *)(obj->object_data); paragraphs = o->paragraphs; o->paragraphs = NULL; - o->lines = NULL; o->formatted.valid = 0; o->native.valid = 0; _layout(obj, @@ -3101,7 +3098,7 @@ o = (Evas_Object_Textblock *)(obj->object_data); if (!o->formatted.valid) _relayout(obj); - EINA_INLIST_FOREACH(o->lines, ln) + EINA_INLIST_FOREACH(o->paragraphs->lines, ln) { Evas_Object_Textblock_Item *it; Evas_Object_Textblock_Line *lnn; @@ -3148,7 +3145,7 @@ o = (Evas_Object_Textblock *)(obj->object_data); if (!o->formatted.valid) _relayout(obj); - EINA_INLIST_FOREACH(o->lines, ln) + EINA_INLIST_FOREACH(o->paragraphs->lines, ln) { Evas_Object_Textblock_Format_Item *fi; @@ -3179,7 +3176,7 @@ Evas_Object_Textblock *o; o = (Evas_Object_Textblock *)(obj->object_data); - EINA_INLIST_FOREACH(o->lines, ln) + EINA_INLIST_FOREACH(o->paragraphs->lines, ln) { if (ln->line_no == line) return ln; } @@ -6099,7 +6096,8 @@ { if (!o->text_nodes) { - ln = o->lines; + if (!o->paragraphs) return -1; + ln = o->paragraphs->lines; if (!ln) return -1; if (cx) *cx = ln->x; if (cy) *cy = ln->y; @@ -6198,7 +6196,7 @@ if (!o->formatted.valid) _relayout(cur->obj); if (!cur->node) { - ln = o->lines; + ln = o->paragraphs->lines; } else { @@ -6247,7 +6245,7 @@ if (!o->formatted.valid) _relayout(cur->obj); x += o->style_pad.l; y += o->style_pad.t; - EINA_INLIST_FOREACH(o->lines, ln) + EINA_INLIST_FOREACH(o->paragraphs->lines, ln) { if (ln->y > y) break; if ((ln->y <= y) && ((ln->y + ln->h) > y)) @@ -6320,7 +6318,7 @@ o = (Evas_Object_Textblock *)(cur->obj->object_data); if (!o->formatted.valid) _relayout(cur->obj); y += o->style_pad.t; - EINA_INLIST_FOREACH(o->lines, ln) + EINA_INLIST_FOREACH(o->paragraphs->lines, ln) { if (ln->y > y) break; if ((ln->y <= y) && ((ln->y + ln->h) > y)) @@ -6543,7 +6541,6 @@ { _paragraphs_clear(obj, o->paragraphs); o->paragraphs = NULL; - o->lines = NULL; } _evas_textblock_changed(o, obj); } @@ -6703,7 +6700,7 @@ context); clip = ENFN->context_clip_get(output, context, &cx, &cy, &cw, &ch); #define ITEM_WALK() \ - EINA_INLIST_FOREACH(o->lines, ln) \ + EINA_INLIST_FOREACH(o->paragraphs->lines, ln) \ { \ Evas_Object_Textblock_Item *it; \ \ @@ -7119,7 +7116,6 @@ paragraphs = o->paragraphs; o->paragraphs = NULL; - o->lines = NULL; o->formatted.valid = 0; o->native.valid = 0; _layout(obj, @@ -7296,7 +7292,7 @@ Evas_Object_Textblock_Line *ln; o = (Evas_Object_Textblock *)(obj->object_data); - EINA_INLIST_FOREACH(o->lines, ln) + EINA_INLIST_FOREACH(o->paragraphs->lines, ln) { Evas_Object_Textblock_Item *it; |
From: Enlightenment S. <no-...@en...> - 2010-08-16 08:22:25
|
Log: Evas textblock: Updated usage documentation. Author: tasn Date: 2010-08-16 01:22:18 -0700 (Mon, 16 Aug 2010) New Revision: 51166 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 08:17:24 UTC (rev 51165) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 08:22:18 UTC (rev 51166) @@ -5,12 +5,72 @@ */ /** + * @section Evas_Object_Textblock_Tutorial Textblock Object Tutorial + * + * This part explains about the textblock object's API and proper usage. + * If you want to develop textblock, you should also refer to @ref Evas_Object_Textblock_Internal. + * The main user of the textblock object is the edje entry object in Edje, so + * that's a good place to learn from, but I think this document is more than + * enough, if it's not, please request for me info and I'll update it. + * + * @subsection textblock_intro Introduction + * The textblock objects is, as implied, an object that can show big chunks of + * text. Textblock supports many features including: Text formatting, automatic + * and manual text alignment, embedding items (for example icons) and more. + * Textblock has three important parts, the text paragraphs, the format nodes + * and the cursors. + * + * @subsection textblock_cursors Textblock Object Cursors + * A textblock Cursor @ref Evas_Textblock_Cursor is data type that represents + * a position in a textblock. Each cursor contains information about the + * paragraph it points to, the position in that paragraph and the object itself. + * Cursors register to textblock objects upon creation, this means that once + * you created a cursor, it belongs to a specific obj and you can't for example + * copy a cursor "into" a cursor of a different object. Registered cursors + * also have the added benefit of updating automatically upon textblock changes, + * this means that if you have a cursor pointing to a specific character, it'll + * still point to it even after you change the whole object completely (as long + * as the char was not deleted), this is not possible without updating, beacuse + * as mentioned, each cursor holds a character position. There are many + * functions that handle cursors, just check out the evas_textblock_cursor* + * functions. For creation and deletion of cursors check out: + * @see evas_object_textblock_cursor_new() + * @see evas_textblock_cursor_free() + * @note Cursors are generally the correct way to handle text in the textblock object, and there are enough functions to do everything you need with them (no need to get big chunks of text and processing them yourself). + * + * @subsection textblock_paragraphs Textblock Object Paragraphs + * The textblock object is made out of text splitted to paragraphs (delimited + * by the paragraph separation character). Each paragraph has many (or none) + * format nodes associated with it which are responsible for the formatting + * of that paragraph. + * + * @subsection textblock_format_nodes Textblock Object Format Nodes + * As explained in @ref textblock_paragraphs each one of the format nodes + * is associated with a paragraph. + * There are two types of format nodes, visible and invisible: + * Visible: formats that a cursor can point to, i.e formats that + * occupy space, for example: newlines, tabs, items and etc. + * Invisible: formats that don't occupy space, for example: bold and underline. + * Being able to access format nodes is very important for some uses. For + * example, edje uses the "<a>" format to create links in the text (and pop + * popups above them when clicked). For the textblock object a is just a + * formatting instruction (how to color the text), but edje utilizes the access + * to the format nodes to make it do more. + * For more information, take a look at all the evas_textblock_node_format_* + * functions. + * + * @subsection textblock_special_formats Special Formats + * @todo Write @textblock_special_formats + */ + +/** * @internal * @section Evas_Object_Textblock_Internal Internal Textblock Object Tutorial * - * This explains the internal design of the Evas Textblock Object. + * This explains the internal design of the Evas Textblock Object, it's assumed + * that the reader of this section has already read @ref Evas_Object_Textblock_Tutorial "Textblock's usage docs.". * - * @subsection textblock_intro Introduction + * @subsection textblock_internal_intro Introduction * There are two main parts to the textblock object, the first being the node * system, and the second being the layout system. The former is just an * internal representation of the markup text, while the latter is the internal @@ -26,7 +86,7 @@ * Each text node is essentially a paragraph, it includes an @ref Eina_UStrbuf * that stores the actual paragraph text, a utf8 string to store the paragraph * text in utf8 (which is not used internally at all), A pointer to it's - * main @ref textblock_nodes_format "Format Node" and the paragraph's + * main @ref textblock_nodes_format_internal "Format Node" and the paragraph's * @ref evas_bidi_props "BiDi properties". The pointer to the format node may be * NULL if there's no format node anywhere before the end of the text node, * not even in previous text nodes. If not NULL, it points to the first format @@ -37,7 +97,7 @@ * happens because text nodes are paragraphs and paragraphs are delimited by * paragraph separators. * - * @subsection textblock_nodes_format Format Nodes + * @subsection textblock_nodes_format_internal Format Nodes - Internal * Each format node stores a group of format information, for example the * markup: \<font=Vera,Kochi font_size=10 align=left\> will all be inserted * inside the same format node, altohugh it consists of different formatting @@ -4251,7 +4311,7 @@ * to the start of the textblock. Association to the object means the cursor * will be updated when the object will change. * - * @note if you need speed and you know what you are doing, it's slightly faster to just allocate the cursor yourself and not associate it. + * @note if you need speed and you know what you are doing, it's slightly faster to just allocate the cursor yourself and not associate it. (only people developing the actual object, and not users of the object). * * @param obj the object to associate to. * @return the new cursor. |
From: Enlightenment S. <no-...@en...> - 2010-08-16 08:36:15
|
Log: Evas textblock: Use the unicode object replacement char, not the regular replacement char. Drop the object replacement char if passed as text. Author: tasn Date: 2010-08-16 01:36:08 -0700 (Mon, 16 Aug 2010) New Revision: 51168 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 08:36:06 UTC (rev 51167) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 08:36:08 UTC (rev 51168) @@ -115,8 +115,8 @@ * There are two types of format nodes, visible and invisible. They are the same * in every way, except for the representation in the text node. While invisible * format nodes have no representation in the text node, the visible ones do. - * The Uniceode replacement character (0xFFFD) is inserted to every place a - * visible format node points to. This makes it very easy to treat visible + * The Uniceode object replacement character (0xFFFC) is inserted to every place + * a visible format node points to. This makes it very easy to treat visible * formats as items in the text, both for BiDi purposes and cursor handling * purposes. * Here are a few example visible an invisible formats: @@ -137,7 +137,7 @@ static const char o_type[] = "textblock"; /* The char to be inserted instead of visible formats */ -#define EVAS_TEXTBLOCK_REPLACEMENT_CHAR 0xFFFD +#define EVAS_TEXTBLOCK_REPLACEMENT_CHAR 0xFFFC /* private struct for textblock object internal data */ /** @@ -3712,7 +3712,7 @@ /** * Sets the tetxblock's text to the markup text. * - * @note assumes text does not include the unicode replacement char (0xFFFD) + * @note assumes text does not include the unicode object replacement char (0xFFFC) * * @param obj the textblock object. * @param text the markup text to use. @@ -3753,7 +3753,7 @@ /** * Prepends markup to the cursor cur. * - * @note assumes text does not include the unicode replacement char (0xFFFD) + * @note assumes text does not include the unicode object replacement char (0xFFFC) * * @param cur the cursor to prepend to. * @param text the markup text to prepend. @@ -3883,6 +3883,16 @@ s = p + 1; } } + /* Unicode object replcament char */ + else if (!strncmp("\xEF\xBF\xBC", p, 3)) + { + /*FIXME: currently just remove them, maybe do something + * fancier in the future, atm it breaks if this char + * is inside <> */ + _prepend_text_run(o, s, p); + p += 2; /* it's also advanced later in this loop */ + s = NULL; + } p++; } } |
From: Enlightenment S. <no-...@en...> - 2010-08-16 08:52:25
|
Log: Evas textblock: Fixed a bug with getting text in range. Author: tasn Date: 2010-08-16 01:52:18 -0700 (Mon, 16 Aug 2010) New Revision: 51170 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 08:41:15 UTC (rev 51169) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 08:52:18 UTC (rev 51170) @@ -5075,7 +5075,7 @@ Evas_Object_Textblock_Node_Format *itr; int use_end = 1; itr = n->format_node; - if (end < 0) end = 0; + if (end < 0) use_end = 0; while (itr && (itr->text_node == n)) { start -= itr->offset; @@ -5981,7 +5981,16 @@ text_base = text = eina_unicode_strdup(eina_ustrbuf_string_get(n1->unicode)); - fnode = _evas_textblock_node_text_get_first_format_between(o, n1, cur1->pos, cur2->pos); + if (tnode == cur2->node) + { + fnode = _evas_textblock_node_text_get_first_format_between(o, n1, + cur1->pos, cur2->pos); + } + else + { + fnode = _evas_textblock_node_text_get_first_format_between(o, n1, + cur1->pos, -1); + } /* Init the offset so the first one will count starting from cur1->pos * and not the previous format node */ if ((tnode == cur1->node) && fnode) |
From: Enlightenment S. <no-...@en...> - 2010-08-16 09:08:09
|
Log: Evas textblock: Another fix to 'range_get' fixes the text getting and not just the mishandling of formats. Author: tasn Date: 2010-08-16 02:08:01 -0700 (Mon, 16 Aug 2010) New Revision: 51176 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:06:19 UTC (rev 51175) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:08:01 UTC (rev 51176) @@ -5980,7 +5980,7 @@ int off; text_base = text = - eina_unicode_strdup(eina_ustrbuf_string_get(n1->unicode)); + eina_unicode_strdup(eina_ustrbuf_string_get(tnode->unicode)); if (tnode == cur2->node) { fnode = _evas_textblock_node_text_get_first_format_between(o, n1, |
From: Enlightenment S. <no-...@en...> - 2010-08-16 09:18:20
|
Log: Evas textblock: removed two unwanted fixmes. Author: tasn Date: 2010-08-16 02:18:09 -0700 (Mon, 16 Aug 2010) New Revision: 51178 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:08:49 UTC (rev 51177) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:18:09 UTC (rev 51178) @@ -1780,8 +1780,6 @@ /** * @internal * Free the layout paragraph and all of it's lines. - * - * FIXME: should get the context */ static void _paragraph_free(const Evas_Object *obj, Evas_Object_Textblock_Paragraph *par) @@ -6562,7 +6560,7 @@ Eina_Bool ret = EINA_FALSE; Evas_Textblock_Cursor cur2; if (!cur) return EINA_FALSE; - /* FIXME: optimize a bit */ + evas_textblock_cursor_copy(cur, &cur2); evas_textblock_cursor_line_char_last(&cur2); if (cur2.pos == cur->pos) |
From: Enlightenment S. <no-...@en...> - 2010-08-16 09:40:08
|
Log: Evas textblock: Fixed evas_textblock_cursor_paragraph_text_get to return markup. Author: tasn Date: 2010-08-16 02:40:01 -0700 (Mon, 16 Aug 2010) New Revision: 51181 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:34:38 UTC (rev 51180) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:40:01 UTC (rev 51181) @@ -6053,7 +6053,7 @@ } /** - * Return the text of the paragraph cur points to. + * Return the text of the paragraph cur points to - returns the text in markup.. * * @param cur the cursor pointing to the paragraph. * @return the text on success, NULL otherwise. @@ -6061,15 +6061,20 @@ EAPI const char * evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur) { + Evas_Textblock_Cursor cur1, cur2; if (!cur) return NULL; if (!cur->node) return NULL; - /*FIXME-tom: strip replace chars */ if (cur->node->utf8) { free(cur->node->utf8); } - cur->node->utf8 = evas_common_encoding_unicode_to_utf8( - eina_ustrbuf_string_get(cur->node->unicode), NULL); + cur1.obj = cur2.obj = cur->obj; + cur1.node = cur2.node = cur->node; + evas_textblock_cursor_paragraph_char_first(&cur1); + evas_textblock_cursor_paragraph_char_last(&cur2); + + cur->node->utf8 = evas_textblock_cursor_range_text_get(&cur1, &cur2, + EVAS_TEXTBLOCK_TEXT_MARKUP); return cur->node->utf8; } |
From: Enlightenment S. <no-...@en...> - 2010-08-16 09:44:58
|
Log: Evas textblock: Fix the inefficent ways used to get string length. No need to get length twice and strbuf has a very fast function to getting length, no need to get the string and the calc it's length. Author: tasn Date: 2010-08-16 02:44:50 -0700 (Mon, 16 Aug 2010) New Revision: 51182 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:40:01 UTC (rev 51181) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 09:44:50 UTC (rev 51182) @@ -2420,7 +2420,7 @@ Eina_Unicode *ptr; Eina_Unicode urepch; - len = eina_unicode_strlen(eina_ustrbuf_string_get(n->unicode)); + len = eina_ustrbuf_length_get(n->unicode); str = alloca((len + 1) * sizeof(Eina_Unicode)); tbase = str; ind = 0; @@ -4721,7 +4721,7 @@ if (!cur) return; if (!cur->node) return; - index = eina_unicode_strlen(eina_ustrbuf_string_get(cur->node->unicode)) - 1; + index = eina_ustrbuf_length_get(cur->node->unicode) - 1; if (index < 0) cur->pos = 0; cur->pos = index; @@ -5496,7 +5496,7 @@ text = evas_common_encoding_utf8_to_unicode((const unsigned char *) _text, &len); o = (Evas_Object_Textblock *)(cur->obj->object_data); /* Update all the cursors after our position. */ - _evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, eina_unicode_strlen(text)); + _evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, len); n = cur->node; if (n) |