evas_image: fix pixels_dirty_set(False) makes wrong object-change-list. 85/198785/2
authorJiyoun Park <jy0703.park@samsung.com>
Tue, 29 Jan 2019 12:05:40 +0000 (21:05 +0900)
committerHermet Park <chuneon.park@samsung.com>
Thu, 14 Feb 2019 04:10:40 +0000 (04:10 +0000)
    Summary:
    evas_object_image_pixels_dirty_set(img B, False) means
    1. app want to mark image object's data is not dirty anymore
    2. app don't want to be called get_pixels callback.

    that does not mean image need to be redraw.

    evas_object_image_pixels_dirty_set(img B, True) means
    1. image object's data is dirty, so image object need to be redraw.
    2. app want to be called get_pixels callback.

    but pixels_dirty_set(img B, FALSE) function also set o->changed to true,
    it cause problem related with rendering

    Below case is the example of problem.

    1. Smart object A
    2. Child image object B
    3. app call pixels_dirty_set(FALSE) inside pixels_get_callback
       pixels_get_callback is called inside the image object B's rendering.

    enlightenment's e_comp_object_render do upper job.

    After adding preload fetch,
    evas_object_image_render_post can call evas_object_change.

    https://phab.enlightenment.org/D7157

    evas_render_updates_internal

    0. enlightenment call evas_object_image_pixels_dirty_set(img B, TRUE)
       o->changed = 1;
       evas_object_change(img B)
    1. smart obj A is in render_objects
    2. evas_object_image_render_pre B, o->change=0
    3. evas_render_mapped (Smart A)
         3-1. evas_render_mapped (img B)
             : enlightenment call evas_object_image_pixels_dirty_set(img B, False)
             : o->changed=1

         3-2. evas_object_change_reset(img B)
    4. pending_change(img B)
         4-1. evas_object_image_render_post(img B)
              o->changed=1 (3-1 step) evas_object_change(img B)->evas_object_change(Smart A)

    5. render_post_reset
       smart A is chaged(4-1 step), so, called   evas_object_change_reset(Smart A)
       ###smart A is reset(5 step), img B is changed(4-1 step). after this case,
        img B never get change to be redraw.

    Reviewers: Hermet, cedric

    Subscribers: #reviewers, #committers

    Tags: #efl

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

   commit 7beadd49e50a495bd30d34362050513ae132298c
   Author: Jiyoun Park <jy0703.park@samsung.com>
   Date:   Tue Jan 29 20:51:08 2019 +0900

Change-Id: I2da052e327473fd26e60e9d293b3736960b60108

src/lib/evas/canvas/evas_image_legacy.c

index 23cdaad..0788dc6 100755 (executable)
@@ -577,9 +577,13 @@ evas_object_image_pixels_dirty_set(Eo *eo_obj, Eina_Bool dirty)
    Evas_Image_Data *o = efl_data_scope_get(eo_obj, EFL_CANVAS_IMAGE_INTERNAL_CLASS);
 
    evas_object_async_block(obj);
-   if (dirty) o->dirty_pixels = EINA_TRUE;
+   if (dirty)
+     {
+        o->dirty_pixels = EINA_TRUE;
+        o->changed = EINA_TRUE;
+     }
    else o->dirty_pixels = EINA_FALSE;
-   o->changed = EINA_TRUE;
+
    evas_object_change(eo_obj, obj);
 }