Evas textblock: Fixed an issue when there are no available fonts.

The problem was that our rbtree implementation doesn't support chaining
duplicates and with no fonts, all the paragraphs had the same y coord (0).
Changing the paragraph index to work on line_no for sorting fixes it,
as line numbers are also correct when there are no fonts.

Thanks a lot to KaKaRoTo for letting me know about this issue.

SVN revision: 63188
This commit is contained in:
Tom Hacohen 2011-09-05 09:04:43 +00:00
parent 325dbc04ae
commit 8f07a73106
1 changed files with 14 additions and 11 deletions

View File

@ -1831,7 +1831,7 @@ _par_index_node_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right,
rpar = EINA_RBTREE_CONTAINER_GET(right, Evas_Object_Textblock_Paragraph);
/* Because they can't be equal or overlap, we don't need to compare
* anything except for the y position */
return (lpar->y < rpar->y) ? EINA_RBTREE_LEFT : EINA_RBTREE_RIGHT;
return (lpar->line_no < rpar->line_no) ? EINA_RBTREE_LEFT : EINA_RBTREE_RIGHT;
}
static int
@ -2004,6 +2004,7 @@ _paragraph_free(const Evas_Object *obj, Evas_Object_Textblock_Paragraph *par)
/* If we are the active par of the text node, set to NULL */
if (par->text_node && (par->text_node->par == par))
par->text_node->par = NULL;
o->par_index = eina_rbtree_inline_remove(o->par_index,
EINA_RBTREE_GET(par), _par_index_node_cmp, NULL);
@ -2042,6 +2043,7 @@ _paragraphs_free(const Evas_Object *obj, Evas_Object_Textblock_Paragraph *pars)
{
Evas_Object_Textblock *o;
o = (Evas_Object_Textblock *)(obj->object_data);
o->par_index = NULL;
while (pars)
@ -3188,16 +3190,6 @@ _layout_update_par(Ctxt *c)
{
c->par->y = 0;
}
/* Insert it to the index now that we calculated it's y
* We don't need to reinsert even if y (they key) changed, because the
* order remains the same. */
if (!c->par->indexed)
{
c->o->par_index = eina_rbtree_inline_insert(c->o->par_index,
EINA_RBTREE_GET(c->par), _par_index_node_cmp, NULL);
c->par->indexed = EINA_TRUE;
}
}
/* -1 means no wrap */
@ -3547,6 +3539,17 @@ _layout_par(Ctxt *c)
/* Check if we need to skip this paragraph because it's already layouted
* correctly, and mark handled nodes as dirty. */
c->par->line_no = c->line_no;
/* Insert it to the index now that we calculated it's y
* We don't need to reinsert even if y (they key) changed, because the
* order remains the same. */
if (!c->par->indexed)
{
c->o->par_index = eina_rbtree_inline_insert(c->o->par_index,
EINA_RBTREE_GET(c->par), _par_index_node_cmp, NULL);
c->par->indexed = EINA_TRUE;
}
if (c->par->text_node)
{
/* Skip this paragraph if width is the same, there is no ellipsis