diff --git a/legacy/evas/src/lib/canvas/evas_object_image.c b/legacy/evas/src/lib/canvas/evas_object_image.c index 50b6bb4b19..fefc17769c 100644 --- a/legacy/evas/src/lib/canvas/evas_object_image.c +++ b/legacy/evas/src/lib/canvas/evas_object_image.c @@ -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 diff --git a/legacy/evas/src/lib/canvas/evas_render.c b/legacy/evas/src/lib/canvas/evas_render.c index 037f1d66dc..0e435f5f60 100644 --- a/legacy/evas/src/lib/canvas/evas_render.c +++ b/legacy/evas/src/lib/canvas/evas_render.c @@ -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