oh this one was a doosey to find. objects still having map applied BUT
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 21 Oct 2011 17:14:03 +0000 (17:14 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 21 Oct 2011 17:14:03 +0000 (17:14 +0000)
map is the same as a normal display (no mapping at all) are not
considered opaque. fix!

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@64264 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_object_image.c
src/lib/canvas/evas_render.c

index 50b6bb4..fefc177 100644 (file)
@@ -3342,6 +3342,9 @@ evas_object_image_render_pre(Evas_Object *obj)
                                  r.h = ((rr->h + 2) * h) / o->cur.image.h;
                                  r.x += obj->cur.geometry.x + x;
                                  r.y += obj->cur.geometry.y + 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);
                                  idy += h;
                               }
@@ -3377,10 +3380,10 @@ evas_object_image_render_pre(Evas_Object *obj)
        evas_object_is_opaque(obj))
      {
          e->engine.func->output_redraws_rect_del(e->engine.data.output,
-                                                               obj->cur.cache.clip.x,
-                                                               obj->cur.cache.clip.y,
-                                                               obj->cur.cache.clip.w,
-                                                               obj->cur.cache.clip.h);
+                                                 obj->cur.cache.clip.x,
+                                                 obj->cur.cache.clip.y,
+                                                 obj->cur.cache.clip.w,
+                                                 obj->cur.cache.clip.h);
      }
    done:
    evas_object_render_pre_effect_updates(&e->clip_changes, obj, is_v, was_v);
@@ -3442,30 +3445,66 @@ evas_object_image_is_opaque(Evas_Object *obj)
    /* this returns 1 if the internal object data implies that the object is */
    /* currently fully opaque over the entire rectangle it occupies */
    o = (Evas_Object_Image *)(obj->object_data);
+/*  disable caching due tyo maps screwing with this
+   o->cur.opaque_valid = 0;
    if (o->cur.opaque_valid)
      {
         if (!o->cur.opaque) return 0;
      }
    else
+*/
      {
         o->cur.opaque = 0;
-        o->cur.opaque_valid = 1;
+/* disable caching */
+/*        o->cur.opaque_valid = 1; */
         if ((o->cur.fill.w < 1) || (o->cur.fill.h < 1))
-           return 0;
+           return o->cur.opaque;
         if (((o->cur.border.l != 0) ||
              (o->cur.border.r != 0) ||
              (o->cur.border.t != 0) ||
              (o->cur.border.b != 0)) &&
-            (!o->cur.border.fill)) return 0;
-        if (!o->engine_data) return 0;
+            (!o->cur.border.fill)) return o->cur.opaque;
+        if (!o->engine_data) return o->cur.opaque;
         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;
-   if (o->cur.has_alpha) return 0;
-   return 1;
+   if (o->cur.source)
+     {
+        o->cur.opaque = evas_object_is_opaque(o->cur.source);
+        return o->cur.opaque; /* FIXME: Should go poke at the object */
+     }
+   if (o->cur.has_alpha)
+     {
+        o->cur.opaque = 0;
+        return o->cur.opaque;
+     }
+   if ((obj->cur.map) && (obj->cur.usemap))
+     {
+        Evas_Map *m = obj->cur.map;
+        
+        if ((m->points[0].a == 255) &&
+            (m->points[1].a == 255) &&
+            (m->points[2].a == 255) &&
+            (m->points[3].a == 255))
+          {
+             if (
+                 ((m->points[0].x == m->points[3].x) &&
+                     (m->points[1].x == m->points[2].x) &&
+                     (m->points[0].y == m->points[1].y) &&
+                     (m->points[2].y == m->points[3].y))
+                 ||
+                 ((m->points[0].x == m->points[1].x) &&
+                     (m->points[2].x == m->points[3].x) &&
+                     (m->points[0].y == m->points[3].y) &&
+                     (m->points[1].y == m->points[2].y))
+                )
+               return o->cur.opaque;
+          }
+        o->cur.opaque = 0;
+        return o->cur.opaque;
+     }
+   if (obj->cur.render_op == EVAS_RENDER_COPY) return o->cur.opaque;
+   return o->cur.opaque;
 }
 
 static int
index 037f1d6..0e435f5 100644 (file)
@@ -151,8 +151,9 @@ _evas_render_phase1_direct(Evas *e,
    unsigned int i;
    Eina_List *l;
    Evas_Object *proxy;
+   int tdbg = 1;
 
-//   printf("--------------------\n");
+   if (tdbg) printf("--------------------\n");
    RD("  [--- PHASE 1 DIRECT\n");
    for (i = 0; i < active_objects->count; i++)
      {
@@ -175,7 +176,11 @@ _evas_render_phase1_direct(Evas *e,
         Evas_Object *obj;
 
         obj = eina_array_data_get(render_objects, i);
-//        printf("R: %p %s - %i %i %ix%i D:%i\n", obj, obj->type, obj->cur.geometry.x, obj->cur.geometry.y, obj->cur.geometry.w, obj->cur.geometry.h, obj->rect_del);
+        if (tdbg)
+          {
+             printf("R: %p %s - %i %i %ix%i\n", obj, obj->type, obj->cur.geometry.x, obj->cur.geometry.y, obj->cur.geometry.w, obj->cur.geometry.h);
+             printf("  ch=%i rdel=%i\n", obj->changed, obj->rect_del);
+          }
         RD("    OBJ [%p] changed %i\n", obj, obj->changed);
         if (obj->changed)
           {
@@ -230,8 +235,10 @@ _evas_render_phase1_direct(Evas *e,
                   _evas_render_cur_clip_cache_del(e, obj);
                }
           }
+        if (tdbg) printf("       -next-\n");
      }
    RD("  ---]\n");
+   if (tdbg) printf(".....................\n");
 }
 
 static Eina_Bool