jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=223e1258c15636ba7b806f40daa62707fb68baf1

commit 223e1258c15636ba7b806f40daa62707fb68baf1
Author: Jean-Philippe Andre <[email protected]>
Date:   Wed Mar 19 09:40:28 2014 +0900

    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...).
---
 src/lib/evas/canvas/evas_object_image.c | 47 ++++++++++++++++++++++++++++++---
 1 file changed, 43 insertions(+), 4 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_image.c 
b/src/lib/evas/canvas/evas_object_image.c
index a3931d2..be5966a 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -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);

-- 


Reply via email to