elementary textpath: use job for deferred drawing task.
authorHermet Park <hermetpark@gmail.com>
Mon, 28 May 2018 06:37:57 +0000 (15:37 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Fri, 1 Jun 2018 05:17:52 +0000 (14:17 +0900)
textpath performed drawing task multiple times unnecesarily.
It should be performed only one time after all setting up.

src/lib/elementary/efl_ui_textpath.c

index e4315ed..a0bb48b 100644 (file)
@@ -67,6 +67,7 @@ struct _Efl_Ui_Textpath_Data
 
    Eina_Inlist *segments;
    int total_length;
+   Ecore_Job *draw_text_job;
 #ifdef EFL_UI_TEXTPATH_LINE_DEBUG
    Eina_List *lines;
 #endif
@@ -315,8 +316,9 @@ _map_point_calc(Efl_Ui_Textpath_Data *pd)
 }
 
 static void
-_text_draw(Efl_Ui_Textpath_Data *pd)
+_text_draw(void *data)
 {
+   Efl_Ui_Textpath_Data *pd = data;
    Efl_Ui_Textpath_Segment *seg;
    Evas_Map *map;
    int w1, w2;
@@ -383,6 +385,8 @@ _text_draw(Efl_Ui_Textpath_Data *pd)
    evas_object_map_enable_set(pd->text_obj, EINA_TRUE);
    evas_object_map_set(pd->text_obj, map);
    evas_map_free(map);
+
+   pd->draw_text_job = NULL;
 }
 
 static void
@@ -501,7 +505,8 @@ _path_data_get(Eo *obj, Efl_Ui_Textpath_Data *pd, Eina_Bool set_min)
 static void
 _sizing_eval(Efl_Ui_Textpath_Data *pd)
 {
-   _text_draw(pd);
+   ecore_job_del(pd->draw_text_job);
+   pd->draw_text_job = ecore_job_add(_text_draw, pd);
 }
 
 static void
@@ -615,6 +620,7 @@ _efl_ui_textpath_efl_object_destructor(Eo *obj, Efl_Ui_Textpath_Data *pd)
         pd->segments = eina_inlist_remove(pd->segments, EINA_INLIST_GET(seg));
         free(seg);
      }
+   ecore_job_del(pd->draw_text_job);
 
 #ifdef EFL_UI_TEXTPATH_LINE_DEBUG
    Evas_Object *line;
@@ -669,7 +675,7 @@ _efl_ui_textpath_efl_gfx_entity_position_set(Eo *obj, Efl_Ui_Textpath_Data *pd,
 {
    efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos);
    _path_data_get(obj, pd, EINA_FALSE);
-   _text_draw(pd);
+   _sizing_eval(pd);
 }
 
 EOLIAN static void