evas_textblock: optimize calculate main format once in layout setup stage

Summary:
This change based on discussion on D9533 , where @smohanty example shows that unnecessary calculation happened on textblock related to lay-outing

Where now _layout_setup will not calculate main format using (_format_fill) unless style has been changed.

expedite commit:
https://git.enlightenment.org/tools/expedite.git/commit/?id=dc6c931dc2e6c240d3e240f24578980c689ab7fc
src/bin/textblock_text_fill_format.c

Test Plan:
```
#define EFL_EO_API_SUPPORT 1
#define EFL_BETA_API_SUPPORT 1
#include <Eina.h>
#include <Efl.h>
#include <Elementary.h>

EAPI_MAIN int
elm_main(int argc, char **argv)
{
   Evas_Object *win, *textblock;

   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);

   win = elm_win_util_standard_add("Main", "App");
   elm_win_autodel_set(win, EINA_TRUE);

   int l, r, t, b;
   textblock = evas_object_textblock_add(evas_object_evas_get(win));

   Evas_Textblock_Style *st = evas_textblock_style_new();
   evas_textblock_style_set (st, "DEFAULT='font=Sans font_size=10 color=#000000 wrap=word align=left outline_color=#000 shadow_color=#fff8 shadow_color=#0002 glow2_color=#fe87 glow_color=#f214 underline_color=#00f linesize=40'");
   evas_object_textblock_style_set(textblock, st);
   int sizes[] = {600, 700};
   evas_object_textblock_text_markup_set(textblock, "This test resize text block and keep style (style parsed only once)");
   clock_t start, end;
   start = clock();
   for (int i = 0; i < 10000; i++)
   {
      evas_object_resize(textblock, sizes[i % 2], sizes[i % 2]);
      evas_object_textblock_style_insets_get(textblock, &l, &r, &t, &b);
   }
   end = clock();
   double total_Time1 = ((double)(end - start)) / CLOCKS_PER_SEC;
   printf("total time = %f\n", total_Time1);

   evas_object_size_hint_weight_set(textblock, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(textblock, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(textblock);

   evas_object_move(textblock, 0, 0);
   evas_object_resize(textblock, 640, 800);
   evas_object_resize(win, 640, 800);

   evas_object_show(win);
   elm_run();

   return 0;
}
ELM_MAIN()

```

**Old  Code output : total time = 0.096900
New Code output : total time = 0.045580**

Reviewers: smohanty, woohyun, Hermet, bowonryu, cedric, bu5hm4n, zmike

Reviewed By: zmike

Subscribers: zmike, segfaultxavi, bu5hm4n, smohanty, cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D9536
This commit is contained in:
Ali Alzyod 2020-05-04 15:25:07 -04:00 committed by Mike Blumenkrantz
parent 3c619b96fc
commit 3dff471826
2 changed files with 42 additions and 3 deletions

View File

@ -500,6 +500,7 @@ struct _Evas_Object_Textblock
} default_format;
double valign;
Eina_Stringshare *markup_text;
Evas_Object_Textblock_Format *main_fmt;
char *utf8;
void *engine_data;
const char *repch;
@ -7631,6 +7632,7 @@ _layout_setup(Ctxt *c, const Eo *eo_obj, Evas_Coord w, Evas_Coord h)
/* Start of logical layout creation */
/* setup default base style */
if (!o->main_fmt) /* no main format */
{
Eina_List *itr;
User_Style_Entry *use;
@ -7662,6 +7664,11 @@ _layout_setup(Ctxt *c, const Eo *eo_obj, Evas_Coord w, Evas_Coord h)
if (finalize)
_format_finalize(c->obj, c->fmt);
o->main_fmt = _format_dup(c->obj, c->fmt);
}
else
{
c->fmt = _layout_format_push(c, o->main_fmt, NULL);
}
if (!c->fmt)
{
@ -7948,7 +7955,17 @@ evas_textblock_style_free(Evas_Textblock_Style *ts)
}
static void
_evas_textblock_update_format_nodes_from_style_tag(Efl_Canvas_Textblock_Data *o)
_evas_clear_main_format(Evas_Object *eo_obj, Efl_Canvas_Textblock_Data *o)
{
if (o->main_fmt)
{
_format_unref_free(efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS), o->main_fmt);
o->main_fmt = NULL;
}
}
static void
_evas_textblock_update_format_nodes_from_style_tag(Evas_Object *eo_obj, Efl_Canvas_Textblock_Data *o)
{
if (!o)
{
@ -7956,6 +7973,8 @@ _evas_textblock_update_format_nodes_from_style_tag(Efl_Canvas_Textblock_Data *o)
return;
}
_evas_clear_main_format(eo_obj, o);
Evas_Object_Textblock_Node_Format *fnode = o->format_nodes;
while (fnode)
@ -8110,7 +8129,7 @@ evas_textblock_style_set(Evas_Textblock_Style *ts, const char *text)
EINA_LIST_FOREACH(ts->objects, l, eo_obj)
{
Efl_Canvas_Textblock_Data *o = efl_data_scope_get(eo_obj, MY_CLASS);
_evas_textblock_update_format_nodes_from_style_tag(o);
_evas_textblock_update_format_nodes_from_style_tag(eo_obj, o);
_evas_textblock_invalidate_all(o);
_evas_textblock_changed(o, eo_obj);
}
@ -8167,6 +8186,8 @@ _textblock_style_generic_set(Evas_Object *eo_obj, Evas_Textblock_Style *ts,
Eina_List *itr;
Evas_Textblock_Style *old_ts = NULL;
_evas_clear_main_format(eo_obj, o);
if (!key)
{
old_ts = o->style;
@ -8234,7 +8255,7 @@ _textblock_style_generic_set(Evas_Object *eo_obj, Evas_Textblock_Style *ts,
ts->objects = eina_list_append(ts->objects, eo_obj);
}
_evas_textblock_update_format_nodes_from_style_tag(o);
_evas_textblock_update_format_nodes_from_style_tag(eo_obj, o);
o->format_changed = EINA_TRUE;
_evas_textblock_invalidate_all(o);
@ -8273,6 +8294,7 @@ _efl_canvas_textblock_style_apply(Eo *eo_obj, Efl_Canvas_Textblock_Data *o, cons
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
evas_object_async_block(obj);
_evas_clear_main_format(eo_obj, o);
_format_fill(eo_obj, &(o->default_format.format), style, EINA_TRUE);
}
@ -11645,6 +11667,10 @@ _evas_textblock_changed(Efl_Canvas_Textblock_Data *o, Evas_Object *eo_obj)
o->markup_text = NULL;
}
}
else
{
_evas_clear_main_format(eo_obj, o);
}
// FIXME: emit ONCE after this following checks
_cursor_emit_if_changed(o->cursor);
@ -14616,6 +14642,8 @@ evas_object_textblock_free(Evas_Object *eo_obj)
o->fit_content_config.p_size_array = NULL;
}
_evas_clear_main_format(eo_obj, o);
#ifdef HAVE_HYPHEN
/* Hyphenation */
if (o->hyphenating)
@ -16393,6 +16421,7 @@ static void
_canvas_text_format_changed(Eo *eo_obj, Efl_Canvas_Textblock_Data *o)
{
o->format_changed = EINA_TRUE;
_evas_clear_main_format(eo_obj, o);
_evas_textblock_invalidate_all(o);
_evas_textblock_changed(o, eo_obj);
efl_event_callback_call(eo_obj, EFL_CANVAS_TEXTBLOCK_EVENT_CHANGED, NULL);

View File

@ -4925,6 +4925,7 @@ EFL_START_TEST(efl_canvas_textblock_style)
START_EFL_CANVAS_TEXTBLOCK_TEST();
unsigned char r, g, b, a;
const char *style;
Eina_Size2D size1, size2;
efl_text_password_set(txt, EINA_FALSE);
efl_text_underline_type_set(txt, EFL_TEXT_STYLE_UNDERLINE_TYPE_DOUBLE);
@ -4995,6 +4996,15 @@ EFL_START_TEST(efl_canvas_textblock_style)
ck_assert_int_eq(b, 0x6C);
ck_assert_int_eq(a, 0xFF);
// Style Apply taking
efl_text_set(txt,"A");
efl_canvas_textblock_style_apply(txt,"font_size=2");
size1 = efl_canvas_textblock_size_native_get(txt);
efl_canvas_textblock_style_apply(txt,"font_size=20");
size2 = efl_canvas_textblock_size_native_get(txt);
ck_assert(size1.w < size2.w);
ck_assert(size1.h < size2.h);
END_EFL_CANVAS_TEXTBLOCK_TEST();
}
EFL_END_TEST