Evas textblock: Split _layout to _layout and _layout_pre.

This cleans the code a bit and will soon let us do smarter native size
calculation.

SVN revision: 59845
This commit is contained in:
Tom Hacohen 2011-05-31 12:55:57 +00:00
parent 7cdf099d5c
commit 87d196e4bb
1 changed files with 78 additions and 66 deletions

View File

@ -1750,6 +1750,7 @@ struct _Ctxt
Evas_Object_Textblock_Line *ln;
Eina_List *format_stack;
Evas_Object_Textblock_Format *fmt;
int x, y;
int w, h;
@ -3768,70 +3769,23 @@ _format_changes_invalidate_text_nodes(Ctxt *c)
}
}
/**
* @internal
* Create the layout from the nodes.
*
* @param obj the evas object - NOT NULL.
* @param calc_only true if should only calc sizes false if should also create the layout.. It assumes native size is being calculated, doesn't support formatted size atm.
* @param w the object's w, -1 means no wrapping (i.e infinite size)
* @param h the object's h, -1 means inifinte size.
* @param w_ret the object's calculated w.
* @param h_ret the object's calculated h.
*/
/** FIXME: Document */
static void
_layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
_layout_pre(Ctxt *c, int *style_pad_l, int *style_pad_r, int *style_pad_t,
int *style_pad_b)
{
Evas_Object_Textblock *o;
Ctxt ctxt, *c;
Evas_Object_Textblock_Node_Text *n;
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 = (Evas_Object *)obj;
c->o = o;
c->paragraphs = c->par = NULL;
c->format_stack = NULL;
c->x = c->y = 0;
c->w = w;
c->h = h;
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;
c->align_auto = EINA_TRUE;
c->ln = NULL;
c->width_changed = (obj->cur.geometry.w != o->last_w);
Evas_Object *obj = c->obj;
Evas_Object_Textblock *o = c->o;
/* Mark text nodes as dirty if format have changed. */
if (c->o->format_changed)
{
_format_changes_invalidate_text_nodes(c);
}
/* Start of logical layout creation */
/* setup default base style */
if ((c->o->style) && (c->o->style->default_tag))
{
fmt = _layout_format_push(c, NULL);
_format_fill(c->obj, fmt, c->o->style->default_tag);
}
if (!fmt)
{
if (w_ret) *w_ret = 0;
if (h_ret) *h_ret = 0;
return;
}
if (o->content_changed)
{
Evas_Object_Textblock_Node_Text *n;
c->par = c->paragraphs = o->paragraphs;
/* Go through all the text nodes to create the logical layout */
EINA_INLIST_FOREACH(c->o->text_nodes, n)
@ -3884,9 +3838,9 @@ _layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
{
/* Only do this if this actually changes format */
if (fnode->format_change)
_layout_do_format(obj, c, &fmt, fnode,
&style_pad_l, &style_pad_r,
&style_pad_t, &style_pad_b, EINA_FALSE);
_layout_do_format(obj, c, &c->fmt, fnode,
style_pad_l, style_pad_r,
style_pad_t, style_pad_b, EINA_FALSE);
fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next);
}
continue;
@ -3914,13 +3868,13 @@ _layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
{
off += fnode->offset;
/* No need to skip on the first run, or a non-visible one */
_layout_text_append(c, fmt, n, start, off, o->repch);
_layout_do_format(obj, c, &fmt, fnode, &style_pad_l,
&style_pad_r, &style_pad_t, &style_pad_b, EINA_TRUE);
_layout_text_append(c, c->fmt, n, start, off, o->repch);
_layout_do_format(obj, c, &c->fmt, fnode, style_pad_l,
style_pad_r, style_pad_t, style_pad_b, EINA_TRUE);
if ((c->have_underline2) || (c->have_underline))
{
if (style_pad_b < c->underline_extend)
style_pad_b = c->underline_extend;
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;
@ -3938,7 +3892,7 @@ _layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
fnode->new = EINA_FALSE;
fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next);
}
_layout_text_append(c, fmt, n, start, -1, o->repch);
_layout_text_append(c, c->fmt, n, start, -1, o->repch);
c->par = (Evas_Object_Textblock_Paragraph *)
EINA_INLIST_GET(c->par)->next;
}
@ -3961,6 +3915,64 @@ _layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
c->par = NULL;
}
}
/**
* @internal
* Create the layout from the nodes.
*
* @param obj the evas object - NOT NULL.
* @param calc_only true if should only calc sizes false if should also create the layout.. It assumes native size is being calculated, doesn't support formatted size atm.
* @param w the object's w, -1 means no wrapping (i.e infinite size)
* @param h the object's h, -1 means inifinte size.
* @param w_ret the object's calculated w.
* @param h_ret the object's calculated h.
*/
static void
_layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
{
Evas_Object_Textblock *o;
Ctxt ctxt, *c;
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 = (Evas_Object *)obj;
c->o = o;
c->paragraphs = c->par = NULL;
c->format_stack = NULL;
c->fmt = NULL;
c->x = c->y = 0;
c->w = w;
c->h = h;
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;
c->align_auto = EINA_TRUE;
c->ln = NULL;
c->width_changed = (obj->cur.geometry.w != o->last_w);
/* Start of logical layout creation */
/* setup default base style */
if ((c->o->style) && (c->o->style->default_tag))
{
c->fmt = _layout_format_push(c, NULL);
_format_fill(c->obj, c->fmt, c->o->style->default_tag);
}
if (!c->fmt)
{
if (w_ret) *w_ret = 0;
if (h_ret) *h_ret = 0;
return;
}
_layout_pre(c, &style_pad_l, &style_pad_r, &style_pad_t, &style_pad_b);
c->paragraphs = o->paragraphs;
/* If there are no paragraphs, create the minimum needed,
@ -3974,7 +3986,7 @@ _layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
EINA_INLIST_GET(c->paragraphs)->last;
if (!c->par->logical_items)
{
_layout_text_append(c, fmt, NULL, 0, 0, NULL);
_layout_text_append(c, c->fmt, NULL, 0, 0, NULL);
}
/* End of logical layout creation */
@ -4020,9 +4032,9 @@ _layout(const Evas_Object *obj, int w, int h, int *w_ret, int *h_ret)
/* Clean the rest of the format stack */
while (c->format_stack)
{
fmt = c->format_stack->data;
c->fmt = c->format_stack->data;
c->format_stack = eina_list_remove_list(c->format_stack, c->format_stack);
_format_unref_free(c->obj, fmt);
_format_unref_free(c->obj, c->fmt);
}
if (w_ret) *w_ret = c->wmax;