summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2015-07-27 17:20:23 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2015-07-27 17:20:23 +0900
commit93af15c4bf867887300fe2cb604159c1d308e04c (patch)
tree6be23a70a8e8258ff5b50048b9440279b1a132bf
parentc45ae022c8d23a9e7aa7590d9ac7615a5d61882b (diff)
downloadefl-devs/jpeg/filters.tar.gz
Evas filters: Fix invalid rendering in case of async renderdevs/jpeg/filters
Somehow this issue never showed up on my machines, but my demo miserably failed on @hermet's laptop. No idea why it behaves differently (Ubuntu? 32bit? something else?), but I can see why my code was wrong before. @fix
-rw-r--r--src/lib/evas/filters/evas_filter.c42
1 files changed, 5 insertions, 37 deletions
diff --git a/src/lib/evas/filters/evas_filter.c b/src/lib/evas/filters/evas_filter.c
index 16efbbafde..75e36a4504 100644
--- a/src/lib/evas/filters/evas_filter.c
+++ b/src/lib/evas/filters/evas_filter.c
@@ -106,6 +106,8 @@ _backing_free(Evas_Filter_Context *ctx, RGBA_Image *im)
{
if (!ctx->async)
ENFN->image_free(ENDT, im);
+ else
+ evas_unref_queue_image_put(ctx->evas, &im->cache_entry);
}
else
{
@@ -439,20 +441,7 @@ evas_filter_context_buffers_allocate_all(Evas_Filter_Context *ctx)
{
RGBA_Image *im;
im = fb->backing;
- if (im)
- {
- if (ctx->async)
- {
- im->cache_entry.references++;
- evas_unref_queue_image_put(ctx->evas, &im->cache_entry);
- }
- continue;
- }
-
- if (fb->source)
- continue;
-
- if (fb->glimage)
+ if (im || fb->source || fb->glimage)
continue;
if (!fb->w && !fb->h)
@@ -467,8 +456,6 @@ evas_filter_context_buffers_allocate_all(Evas_Filter_Context *ctx)
fb->backing = im;
fb->allocated = (im != NULL);
- if (ctx->async && fb->allocated)
- evas_unref_queue_image_put(ctx->evas, &im->cache_entry);
}
return EINA_TRUE;
@@ -517,8 +504,6 @@ _filter_buffer_data_set(Evas_Filter_Context *ctx, int bufid, void *data,
fb->backing = _rgba_image_alloc(fb, data);
fb->allocated = (!data && (fb->backing != NULL));
- if (ctx->async && fb->allocated)
- evas_unref_queue_image_put(ctx->evas, fb->backing);
return fb->allocated;
}
@@ -644,31 +629,14 @@ evas_filter_buffer_backing_release(Evas_Filter_Context *ctx,
EINA_LIST_FOREACH(ctx->buffers, li, fb)
{
- if (fb->backing == stolen_buffer)
- {
- fb->stolen = EINA_FALSE;
- if (fb->delete_me)
- {
- ctx->buffers = eina_list_remove_list(ctx->buffers, li);
- if (ctx->async)
- {
- if (fb->allocated)
- evas_unref_queue_image_put(ctx->evas, stolen_buffer);
- free(fb);
- }
- else
- _buffer_free(fb);
- return EINA_TRUE;
- }
- return EINA_TRUE;
- }
- else if (fb->glimage == stolen_buffer)
+ if ((fb->backing == stolen_buffer) || (fb->glimage == stolen_buffer))
{
fb->stolen = EINA_FALSE;
if (fb->delete_me)
{
ctx->buffers = eina_list_remove_list(ctx->buffers, li);
_buffer_free(fb);
+ return EINA_TRUE;
}
return EINA_TRUE;
}