evas_image: fix pixels_dirty_set(False) makes wrong object-change-list.

Authored by jypark on Feb 12 2019, 6:16 PM.


evas_image: fix pixels_dirty_set(False) makes wrong object-change-list.

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.



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)
  1. 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, zmike, ManMower

Reviewed By: Hermet

Subscribers: zmike, ManMower, reviewers, committers

Tags: efl

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