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)
commit55b5209f9e50a1dbe3a25aafe1194879057d7247
treed99075ef4c8bd8c0e67ed606e300da778d240901
parentb2e5d9d467f6532ac31c9f5f7d05e14818e8f4a5
evas_image: fix pixels_dirty_set(False) makes wrong object-change-list.

    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