fix proxy sourcing of smart obj that updates.
authorCarsten Haitzler <raster@rasterman.com>
Thu, 19 May 2011 13:01:44 +0000 (13:01 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Thu, 19 May 2011 13:01:44 +0000 (13:01 +0000)
SVN revision: 59536

legacy/evas/src/lib/canvas/evas_object_image.c
legacy/evas/src/lib/canvas/evas_object_main.c
legacy/evas/src/lib/canvas/evas_render.c

index 78777f2199600aeabc0b7503e121c707fd873d02..d905cc5885ddbafd2768ca40c347629be26b832b 100644 (file)
@@ -2849,8 +2849,8 @@ evas_object_image_render_pre(Evas_Object *obj)
 
    if ((o->cur.fill.w < 1) || (o->cur.fill.h < 1))
      {
-       ERR("%p has invalid fill size: %dx%d. Ignored",
-            obj, o->cur.fill.w, o->cur.fill.h);
+        ERR("%p has invalid fill size: %dx%d. Ignored",
+            obj, o->cur.fill.w, o->cur.fill.h);
        return;
      }
 
@@ -2862,13 +2862,12 @@ evas_object_image_render_pre(Evas_Object *obj)
        obj->cur.clipper->func->render_pre(obj->cur.clipper);
      }
    /* Proxy: Do it early */
-   if (o->cur.source && o->cur.source->proxy.redraw)
+   if (o->cur.source && 
+       (o->cur.source->proxy.redraw || o->cur.source->changed))
      {
         /* XXX: Do I need to sort out the map here? */
-        obj->changed = 1;
-        evas_add_rect(&e->clip_changes,
-                      obj->cur.geometry.x, obj->cur.geometry.y,
-                      obj->cur.geometry.w, obj->cur.geometry.h);
+        evas_object_render_pre_prev_cur_add(&e->clip_changes, obj);
+        goto done;
      }
 
    /* now figure what changed and add draw rects */
@@ -3161,6 +3160,7 @@ evas_object_image_is_opaque(Evas_Object *obj)
         if (!o->engine_data) return 0;
         o->cur.opaque = 1;
      }
+   // FIXME: use proxy
    if (o->cur.source) return 0; /* FIXME: Should go poke at the object */
    if ((obj->cur.map) && (obj->cur.usemap)) return 0;
    if (obj->cur.render_op == EVAS_RENDER_COPY) return 1;
@@ -3194,6 +3194,7 @@ evas_object_image_was_opaque(Evas_Object *obj)
         if (!o->engine_data) return 0;
         o->prev.opaque = 1;
      }
+   // FIXME: use proxy
    if (o->prev.source) return 0; /* FIXME: Should go poke at the object */
    if (obj->prev.usemap) return 0;
    if (obj->prev.render_op == EVAS_RENDER_COPY) return 1;
@@ -3222,6 +3223,7 @@ evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
    if ((x < 0) || (y < 0) || (x >= w) || (y >= h)) return 0;
    if (!o->cur.has_alpha) return 1;
 
+   // FIXME: proxy needs to be honored
    if (obj->cur.map)
      {
         x = obj->cur.map->mx;
index c7e555e71f907cfd1f5efa1359154c70dfeedb80..9e803f75e23cafb10ca0ef7533320148a7d95f51 100644 (file)
@@ -98,6 +98,10 @@ evas_object_change(Evas_Object *obj)
      {
         EINA_LIST_FOREACH(obj->clip.clipees, l, obj2) evas_object_change(obj2);
      }
+   EINA_LIST_FOREACH(obj->proxy.proxies, l, obj2)
+     {
+        evas_object_change(obj2);
+     }
    if (obj->smart.parent) evas_object_change(obj->smart.parent);
 }
 
index e20ec12e97bf723588920b4b8571dbbffd0c8654..6a6b38460b8a81acdae28dc6169a1146412255be 100644 (file)
@@ -152,6 +152,22 @@ _evas_render_phase1_direct(Evas *e,
    Evas_Object *proxy;
 
    RD("  [--- PHASE 1 DIRECT\n");
+   for (i = 0; i < active_objects->count; i++)
+     {
+       Evas_Object *obj;
+
+       obj = eina_array_data_get(active_objects, i);
+       if (obj->changed)
+          {
+             /* Flag need redraw on proxy too */
+             evas_object_clip_recalc(obj);
+             if (obj->proxy.proxies)
+               {
+                  EINA_LIST_FOREACH(obj->proxy.proxies, l, proxy)
+                     proxy->proxy.redraw = 1;
+               }
+          }
+     }
    for (i = 0; i < render_objects->count; i++)
      {
        Evas_Object *obj;
@@ -167,7 +183,14 @@ _evas_render_phase1_direct(Evas *e,
                {
                   obj->proxy.redraw = 1;
                   EINA_LIST_FOREACH(obj->proxy.proxies, l, proxy)
-                     proxy->func->render_pre(proxy);
+                    {
+                       proxy->func->render_pre(proxy);
+                       _evas_render_prev_cur_clip_cache_add(e, proxy);
+                    }
+               }
+             else if (obj->proxy.redraw)
+               {
+                  _evas_render_prev_cur_clip_cache_add(e, obj);
                }
              if (obj->pre_render_done)
                {