forked from enlightenment/efl
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:
parent
3c619b96fc
commit
3dff471826
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue