evas_textblock: remove style padding from native width and formatted height

Summary:
The style padding was included in native width(not in native height)
and formatted height(not in formatted width).
This is so weired. In addition, there is no enough document about
the relation between formatted size, native size and the style padding.
This issue is caused by a confusing code which is about how to handle
the style padding on item's width and height.("x_adjustment"!)

When Evas calculates "c->wmax" in line finalization stage, it explicitly subtract
style padding from line width. So, I assumed the formatted size has not to include
style padding. It is same for the native size.

The style padding will not be included in formatted size and native size by this commit.
@fix

Test Plan:
A test case is included in this commit.

Evas_Object *tb = evas_object_textblock_add(evas);

newst = evas_textblock_style_new();
evas_textblock_style_set(newst, "DEFAULT='font=Sans font_size=50 color=#000 text_class=entry'");
evas_object_textblock_style_set(tb, newst);

evas_object_textblock_text_markup_set(tb, "<style=far_soft_shadow>Test</>");
evas_object_textblock_style_insets_get(tb, &l, &r, &t, &b);
fail_if((l != 0) || (r != 4) || (t != 0) || (b != 4));

/* Size with style padding */
evas_object_textblock_size_formatted_get(tb, &w, &h);
evas_object_textblock_size_native_get(tb, &nw, &nh);

/* It is non-sense if the following condition is true. */
fail_if((w + l + r == nw) && (h == nh + t + b));

Reviewers: raster, ali.alzyod, woohyun, bowonryu

Reviewed By: ali.alzyod

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D12110
This commit is contained in:
Youngbok Shin 2020-09-01 19:39:13 +09:00 committed by WooHyun Jung
parent 1ab71284db
commit 6e02557535
3 changed files with 38 additions and 25 deletions

View File

@ -355,6 +355,10 @@ class Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
size after wrapping text according to the size restrictions of the
object.
The formatted width and height do not include padding size.
To get the total size of text with style, you need to query padding size
from @.style_insets.
For example a text block containing the text:
"You shall not pass!" with no margins or padding and assuming
a monospace font and a size of 7x10 char widths (for simplicity)
@ -378,6 +382,10 @@ class Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
size after wrapping text according to the size restrictions of the
object.
The native width and height do not include padding size.
To get the total size of text with style, you need to query padding size
from @.style_insets.
For example a text block containing the text:
"You shall not pass!" with no margins or padding and assuming
a monospace font and a size of 7x10 char widths (for simplicity)

View File

@ -311,7 +311,6 @@ struct _Evas_Object_Textblock_Text_Item
{
Evas_Object_Textblock_Item parent; /**< Textblock item. */
Evas_Text_Props text_props; /**< Props for this item. */
Evas_Coord x_adjustment; /**< Used to indicate by how much we adjusted sizes */
Text_Item_Filter *gfx_filter;
};
@ -4963,7 +4962,7 @@ loop_advance:
/* c->o->style_pad.r is already included in the line width, so it's
* not used in this calculation. . */
c->ln->x = c->marginl + c->o->style_pad.l +
((c->w - c->ln->w - c->o->style_pad.l -
((c->w - c->ln->w - c->o->style_pad.l - c->o->style_pad.r -
c->marginl - c->marginr) * _layout_line_align_get(c));
}
else
@ -4979,8 +4978,7 @@ loop_advance:
/* Calculate new max width */
{
Evas_Coord new_wmax = c->ln->w +
c->marginl + c->marginr - (c->o->style_pad.l + c->o->style_pad.r);
Evas_Coord new_wmax = c->ln->w + c->marginl + c->marginr;
if (new_wmax > c->par->last_fw)
c->par->last_fw = new_wmax;
if (new_wmax > c->wmax)
@ -5199,9 +5197,8 @@ _text_item_update_sizes(Ctxt *c, Evas_Object_Textblock_Text_Item *ti)
{
evas_filter_program_padding_get(pgm, &pad, NULL);
ti->x_adjustment = pad.r + pad.l;
ti->parent.w = tw + ti->x_adjustment; // FIXME: why add l+r here,
ti->parent.h = th; // but not t+b here?
ti->parent.w = tw; // Don't add style pad here
ti->parent.h = th; // Don't add style pad here
ti->parent.adv = advw;
ti->parent.x = 0;
return;
@ -5270,9 +5267,8 @@ _text_item_update_sizes(Ctxt *c, Evas_Object_Textblock_Text_Item *ti)
shx2 += shad_sz;
if (shx1 < minx) minx = shx1;
if (shx2 > maxx) maxx = shx2;
ti->x_adjustment = maxx - minx;
ti->parent.w = tw + ti->x_adjustment;
ti->parent.w = tw;
ti->parent.h = th;
ti->parent.adv = advw;
ti->parent.x = 0;
@ -6275,7 +6271,7 @@ _layout_handle_ellipsis(Ctxt *c, Evas_Object_Textblock_Item *it, Eina_List *i)
save_cx = c->x;
temp_w = c->w;
ellip_w = ellip_ti->parent.w - ellip_ti->x_adjustment;
ellip_w = ellip_ti->parent.w;
#ifdef BIDI_SUPPORT
// XXX: with RTL considerations in mind, we need to take max(adv, w) as the
// line may be reordered in a way that the item placement will cause the
@ -6725,10 +6721,6 @@ _layout_par(Ctxt *c)
/* Check if we need to wrap, i.e the text is bigger than the width,
or we already found a wrap point. */
itw = it->w;
if (it->type == EVAS_TEXTBLOCK_ITEM_TEXT)
{
itw -= _ITEM_TEXT(it)->x_adjustment;
}
if ((c->w >= 0) &&
(obs ||
@ -7571,7 +7563,8 @@ _layout_visual(Ctxt *c)
if (last_vis_par)
{
c->hmax = last_vis_par->y + last_vis_par->h +
_layout_last_line_max_descent_adjust_calc(c, last_vis_par);
_layout_last_line_max_descent_adjust_calc(c, last_vis_par) -
c->style_pad.t - c->style_pad.b;
}
}
@ -7596,7 +7589,7 @@ _layout_done(Ctxt *c, Evas_Coord *w_ret, Evas_Coord *h_ret)
/* Vertically align the textblock */
if ((c->o->valign > 0.0) && (c->h > c->hmax))
{
Evas_Coord adjustment = (c->h - c->hmax) * c->o->valign;
Evas_Coord adjustment = (c->h - c->hmax - c->style_pad.t - c->style_pad.b) * c->o->valign;
Evas_Object_Textblock_Paragraph *par;
EINA_INLIST_FOREACH(c->paragraphs, par)
{
@ -7768,10 +7761,11 @@ _relayout(const Evas_Object *eo_obj)
if ((o->paragraphs) && (!EINA_INLIST_GET(o->paragraphs)->next) &&
(o->paragraphs->lines) && (!EINA_INLIST_GET(o->paragraphs->lines)->next))
{
if (obj->cur->geometry.h < o->formatted.h)
if (obj->cur->geometry.h < o->formatted.h + o->style_pad.t + o->style_pad.b)
{
LYDBG("ZZ: 1 line only... lasth == formatted h (%i)\n", o->formatted.h);
o->formatted.oneline_h = o->formatted.h;
LYDBG("ZZ: 1 line only... lasth == formatted h + style_pad.t + style_pad.b(%i)\n",
o->formatted.h + o->style_pad.t + o->style_pad.b);
o->formatted.oneline_h = o->formatted.h + o->style_pad.t + o->style_pad.b;
}
}
o->changed = 0;
@ -13467,7 +13461,7 @@ _evas_textblock_cursor_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_
if (o->paragraphs)
{
Evas_Object_Textblock_Line *first_line = o->paragraphs->lines;
if (y >= o->paragraphs->y + o->formatted.h)
if (y >= o->paragraphs->y + o->formatted.h + o->style_pad.t + o->style_pad.b)
{
/* If we are after the last paragraph, use the last position in the
* text. */
@ -13541,7 +13535,7 @@ evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y)
}
}
}
else if (o->paragraphs && (y >= o->paragraphs->y + o->formatted.h))
else if (o->paragraphs && (y >= o->paragraphs->y + o->formatted.h + o->style_pad.t + o->style_pad.b))
{
int line_no = 0;
/* If we are after the last paragraph, use the last position in the
@ -17633,9 +17627,9 @@ _text_layout_async_done(void *todo, Ecore_Thread *thread EINA_UNUSED)
if ((c->o->paragraphs) && (!EINA_INLIST_GET(c->o->paragraphs)->next) &&
(c->o->paragraphs->lines) && (!EINA_INLIST_GET(c->o->paragraphs->lines)->next))
{
if (c->evas_o->cur->geometry.h < c->o->formatted.h)
if (c->evas_o->cur->geometry.h < c->o->formatted.h + c->o->style_pad.t + c->o->style_pad.b)
{
c->o->formatted.oneline_h = c->o->formatted.h;
c->o->formatted.oneline_h = c->o->formatted.h + c->o->style_pad.t + c->o->style_pad.b;
}
}
c->o->changed = 0;
@ -17652,7 +17646,9 @@ _text_layout_async_done(void *todo, Ecore_Thread *thread EINA_UNUSED)
evas_object_change(c->obj, c->evas_o);
free(c);
_resolve_async(td, o->formatted.w, o->formatted.h);
_resolve_async(td,
o->formatted.w + o->style_pad.l + o->style_pad.r,
o->formatted.h + o->style_pad.t + o->style_pad.b);
o->layout_th = NULL;
o->layout_jobs--;
@ -17699,7 +17695,9 @@ _efl_canvas_textblock_async_layout(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Textblock_
evas_object_textblock_coords_recalc(eo_obj, obj, obj->private_data);
if (o->formatted.valid)
{
_resolve_async(ctx, o->formatted.w, o->formatted.w);
_resolve_async(ctx,
o->formatted.w + o->style_pad.l + o->style_pad.r,
o->formatted.h + o->style_pad.t + o->style_pad.b);
return f;
}

View File

@ -3736,6 +3736,13 @@ EFL_START_TEST(evas_textblock_style)
evas_object_textblock_style_insets_get(tb, &l, &r, &t, &b);
fail_if((l != 0) || (r != 4) || (t != 0) || (b != 4));
/* Size with style padding */
evas_object_textblock_size_formatted_get(tb, &w, &h);
evas_object_textblock_size_native_get(tb, &nw, &nh);
/* It is non-sense if the following condition is true. */
fail_if((w + l + r == nw) && (h == nh + t + b));
/* Mixed style padding */
evas_object_textblock_text_markup_set(tb,
"<style=far_shadow>Test</><style=far_soft_shadow>Test</>");