diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2020-05-09 14:02:04 +0100 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2020-05-09 14:02:04 +0100 |
commit | ddcc7ab82514b73f9c3a8b1cc933761ca04ff5d0 (patch) | |
tree | 68e8221aab942f17792f4fd6130e751cd08462a7 | |
parent | 27630114ef034ca15711d8565e4777a1519a7cd6 (diff) | |
download | efl-ddcc7ab82514b73f9c3a8b1cc933761ca04ff5d0.tar.gz |
evas + gl - fix callback-to-app-changes-state issue with pixel data
so if we call a callback that has e do something like set new pixel
data in a pixel data provider and we do it from the is pixel inside
call ebcause pixels were marked as dirty - pixels may no longer exist
after that, so re-get to make sure and handle properly.
this was found with tiling + e + shaped windows + moving them around
in tiling. it's a valid efl bug though.
@fix
-rw-r--r-- | src/lib/evas/canvas/evas_image_legacy.c | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_object_image.c | 3 |
2 files changed, 4 insertions, 2 deletions
diff --git a/src/lib/evas/canvas/evas_image_legacy.c b/src/lib/evas/canvas/evas_image_legacy.c index d1dcf933ee..4901c3aeb5 100644 --- a/src/lib/evas/canvas/evas_image_legacy.c +++ b/src/lib/evas/canvas/evas_image_legacy.c @@ -673,6 +673,7 @@ evas_object_image_data_set(Eo *eo_obj, void *data) if (o->engine_data) { ENFN->image_free(ENC, o->engine_data); + o->engine_data = NULL; o->changed = EINA_TRUE; evas_object_change(eo_obj, obj); } @@ -687,8 +688,6 @@ evas_object_image_data_set(Eo *eo_obj, void *data) state_write->image.stride = 0; } EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); - - o->engine_data = NULL; } /* FIXME - in engine call above if (o->engine_data) diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 8d714035a6..cad6291286 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -3514,6 +3514,9 @@ evas_object_image_is_inside(Evas_Object *eo_obj, o->pixels->func.get_pixels(o->pixels->func.get_pixels_data, eo_obj); if (ENFN->gl_get_pixels_post) ENFN->gl_get_pixels_post(ENC, output); + pixels = _evas_image_pixels_get(eo_obj, obj, ENC, output, NULL, NULL, 0, 0, + &imagew, &imageh, &uvw, &uvh, EINA_TRUE, EINA_FALSE); + if (!pixels) return is_inside; } } |