raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0e5d9980b23f8fb74c2348ad6e12d6fb1eee1392

commit 0e5d9980b23f8fb74c2348ad6e12d6fb1eee1392
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Wed Jul 20 13:13:41 2016 +0900

    evas image updates - reduce overhead with bordered images not scaled
    
    this fixes over-rendering (where we render the whole image) if it has
    a border set. do proper region updates if the image has a border but
    is not scaled and the fill is at 0 0 and sams size as the object etc.
    etc. so this is simple and doable.
    
    this fixes T4123
---
 src/lib/evas/canvas/evas_object_image.c | 58 +++++++++++++++++++++++++++------
 1 file changed, 48 insertions(+), 10 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_image.c 
b/src/lib/evas/canvas/evas_object_image.c
index c68c866..408d0b2 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -2365,19 +2365,57 @@ evas_object_image_render_pre(Evas_Object *eo_obj,
                }
              else
                {
-                  Eina_Rectangle *r;
-
-                  EINA_COW_PIXEL_WRITE_BEGIN(o, pixi_write)
+                  if ((o->cur->image.w > 0) &&
+                      (o->cur->image.h > 0) &&
+                      (o->cur->image.w == obj->cur->geometry.w) &&
+                      (o->cur->image.h == obj->cur->geometry.h) &&
+                      (o->cur->fill.x == 0) &&
+                      (o->cur->fill.y == 0) &&
+                      (o->cur->fill.w == o->cur->image.w) &&
+                      (o->cur->fill.h == o->cur->image.h) &&
+                      (!((obj->map->cur.map) && (obj->map->cur.usemap))))
                     {
-                       EINA_LIST_FREE(pixi_write->pixel_updates, r)
-                         eina_rectangle_free(r);
+                       Eina_Rectangle *rr;
+
+                       EINA_COW_PIXEL_WRITE_BEGIN(o, pixi_write)
+                         {
+                            EINA_LIST_FREE(pixi_write->pixel_updates, rr)
+                              {
+                                 Eina_Rectangle r;
+
+                                 
e->engine.func->image_dirty_region(e->engine.data.output, o->engine_data, 
rr->x, rr->y, rr->w, rr->h);
+                                 r.x = rr->x;
+                                 r.y = rr->y;
+                                 r.w = rr->w;
+                                 r.h = rr->h;
+                                 r.x += obj->cur->geometry.x;
+                                 r.y += obj->cur->geometry.y;
+                                 RECTS_CLIP_TO_RECT(r.x, r.y, r.w, r.h,
+                                                    obj->cur->cache.clip.x, 
obj->cur->cache.clip.y,
+                                                    obj->cur->cache.clip.w, 
obj->cur->cache.clip.h);
+                                 evas_add_rect(&e->clip_changes, r.x, r.y, 
r.w, r.h);
+                                 eina_rectangle_free(rr);
+                              }
+                         }
+                       EINA_COW_PIXEL_WRITE_END(o, pixi_write);
+                       goto done;
                     }
-                  EINA_COW_PIXEL_WRITE_END(o, pixi_write);
-                  e->engine.func->image_dirty_region(e->engine.data.output, 
o->engine_data, 0, 0, o->cur->image.w, o->cur->image.h);
+                  else
+                    {
+                       Eina_Rectangle *r;
 
-                  evas_object_render_pre_prev_cur_add(&e->clip_changes, eo_obj,
-                                                      obj);
-                  goto done;
+                       EINA_COW_PIXEL_WRITE_BEGIN(o, pixi_write)
+                         {
+                            EINA_LIST_FREE(pixi_write->pixel_updates, r)
+                              eina_rectangle_free(r);
+                         }
+                       EINA_COW_PIXEL_WRITE_END(o, pixi_write);
+                       
e->engine.func->image_dirty_region(e->engine.data.output, o->engine_data, 0, 0, 
o->cur->image.w, o->cur->image.h);
+
+                       evas_object_render_pre_prev_cur_add(&e->clip_changes, 
eo_obj,
+                                                           obj);
+                       goto done;
+                    }
                }
           }
      }

-- 


Reply via email to