evas image: fix a bug in image preloading.
authorHermet Park <hermetpark@gmail.com>
Mon, 3 Sep 2018 06:19:02 +0000 (15:19 +0900)
committersubhransu mohanty <sub.mohanty@samsung.com>
Mon, 10 Sep 2018 04:21:59 +0000 (13:21 +0900)
commita9940e67fb892d1f607093a11d51108b16e6b1d6
tree9bf54f7d4fbfe6e4f8c2b4a3d2f872aab99ffd4e
parent4ea874151a83796c38884e60c079ac5e6217be54
evas image: fix a bug in image preloading.

Summary:
Current preloading is too buggy since it's on thread-based.
This is a fundamental improvement to fix a bug.

The critical issue here is,
When preloading img object suddenly cancel its preloading,
the object possibly cannot render image next then because
renderer doesn't have any idea when async cancelling is
finished. Renderer just tries to render regardless of
image loading status, and this could occur no-texture(in gl case)
image object.

So, here improvement is, adding a notification for async cancelled
so that putting img objects to redraw images properly after their preloading is
cancelled.

The best scenario to reproduce this bug is this one.

Evas_Object *img2 = evas_object_image_filled_add(evas);
evas_object_image_file_set(img2, "test.jpg", NULL);
evas_object_image_preload(img2, EINA_FALSE);
evas_object_resize(img2, 200, 200);
evas_object_show(img2);

Evas_Object *img = evas_object_image_filled_add(evas);
evas_object_image_file_set(img, "test.jpg", NULL);
evas_object_image_preload(img, EINA_FALSE);
evas_object_move(img, 200, 200);
evas_object_resize(img, 200, 200);
evas_object_show(img);

evas_object_image_preload(img2, EINA_TRUE);
If you run this on gl backend, occasionally happens rendering fail.

Yet there other bugs on preloading feature....

@fix

Reviewers: #committers, raster

Subscribers: cedric, #reviewers, #committers, zmike

Tags: #efl

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

Signed-Off-By: Hermet Park <chuneon.park@samsung.com>
Change-Id: I078e68cba2a8c0134ae9c6273c7879b166619427
src/lib/evas/cache/evas_cache.h
src/lib/evas/cache/evas_cache_image.c
src/modules/evas/engines/gl_common/evas_gl_image.c