evas image: apply filter at runtime
authorShinwoo Kim <cinoo.kim@samsung.com>
Thu, 25 Jul 2019 06:02:02 +0000 (15:02 +0900)
committerWooHyun Jung <wh0705.jung@samsung.com>
Mon, 5 Aug 2019 01:47:22 +0000 (10:47 +0900)
Summary:
If you call efl_gfx_filter_program_set in a mouse event callback,
it does not work. Because render_pre removes area uisng evas_render_update_del.

Reviewers: Hermet, jpeg, jsuya, cedric

Reviewed By: Hermet, cedric

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D9301

src/lib/evas/canvas/evas_image_private.h
src/lib/evas/canvas/evas_object_image.c

index 5c95e0b..8d71f7a 100755 (executable)
@@ -157,6 +157,7 @@ struct _Evas_Image_Data
    Eina_Bool         written : 1;
    Eina_Bool         direct_render : 1;
    Eina_Bool         has_filter : 1;
+   Eina_Bool         changed_filter : 1;
    Eina_Bool         buffer_data_set : 1;
    Eina_Bool         native_video : 1; // TIZEN_ONLY(20171121) : support ROI mode (tbm rot, flip, ratio)
    struct
index 56f19cd..90f8226 100755 (executable)
@@ -1979,8 +1979,9 @@ _efl_canvas_image_internal_efl_canvas_filter_internal_filter_dirty(Eo *eo_obj, E
 {
    Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
 
-   o->changed = 1;
+   o->changed = EINA_TRUE;
    evas_object_change(eo_obj, obj);
+   o->changed_filter = EINA_TRUE;
 }
 
 EOLIAN static Eina_Bool
@@ -3148,6 +3149,11 @@ evas_object_image_render_pre(Evas_Object *eo_obj,
      }
    if (o->changed)
      {
+        if (o->changed_filter)
+          {
+             evas_object_render_pre_prev_cur_add(&e->clip_changes, eo_obj, obj);
+             goto done;
+          }
         if (((o->cur->f) && (!o->prev->f)) ||
             ((!o->cur->f) && (o->prev->f)) ||
             ((o->cur->key) && (!o->prev->key)) ||
@@ -3473,6 +3479,7 @@ done:
           }
      }
    o->changed = EINA_FALSE;
+   o->changed_filter = EINA_FALSE;
 }
 
 static void