Evas filters: Quick redraw using output buffer

In Image_Object, reuse the previous output buffer if it is
still valid (image didn't change, etc...).
This commit is contained in:
Jean-Philippe Andre 2014-03-19 09:40:28 +09:00 committed by Jean-Philippe ANDRE
parent 59cf013db9
commit 223e1258c1
1 changed files with 43 additions and 4 deletions

View File

@ -3152,12 +3152,47 @@ evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, v
if (!o->cur->filter.invalid && o->cur->filter.code)
{
Evas_Filter_Program *pgm = o->cur->filter.chain;;
Eina_Bool redraw = o->cur->filter.changed;
Eina_Bool ok;
evas_filter_program_padding_get(pgm, &l, &r, &t, &b);
W = obj->cur->geometry.w + l + r;
H = obj->cur->geometry.h + t + b;
if (!redraw && o->cur->filter.output)
{
if (o->cur->filter.sources && o->cur->filter.sources_count > 0)
{
Evas_Filter_Proxy_Binding *pb;
Evas_Object_Protected_Data *prxsource;
Eina_Iterator *iter;
iter = eina_hash_iterator_data_new(o->cur->filter.sources);
EINA_ITERATOR_FOREACH(iter, pb)
{
prxsource = eo_data_scope_get(pb->eo_source, EVAS_OBJ_CLASS);
if (prxsource->changed)
{
redraw = EINA_TRUE;
break;
}
}
eina_iterator_free(iter);
}
if (!redraw)
{
// Render this image only
obj->layer->evas->engine.func->image_draw(output, context,
surface, o->cur->filter.output,
0, 0, W, H,
offx, offy, W, H,
EINA_TRUE,
do_async);
return;
}
}
if (!pgm)
{
pgm = evas_filter_program_new("Image", EINA_FALSE);
@ -3428,10 +3463,14 @@ state_write:
/* Evas filters wrap-up */
if (filter)
{
//void *outbuf = evas_filter_buffer_backing_steal(filter, EVAS_FILTER_BUFFER_OUTPUT_ID);
//EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
//state_write->filter.output = outbuf;
//EINA_COW_IMAGE_STATE_WRITE_END(o, state_write)
void *outbuf = evas_filter_buffer_backing_steal(filter, EVAS_FILTER_BUFFER_OUTPUT_ID);
if (outbuf != o->cur->filter.output)
{
evas_filter_buffer_backing_release(filter, o->cur->filter.output);
EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write)
state_write->filter.output = outbuf;
EINA_COW_IMAGE_STATE_WRITE_END(o, state_write)
}
evas_filter_image_draw(filter, context, EVAS_FILTER_BUFFER_INPUT_ID, surface, do_async_save);
obj->layer->evas->engine.func->context_free(output, context);