From 9062c9050a8e9346bdb56a274b3b1957ee2b1452 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 17 Feb 2009 04:53:03 +0000 Subject: [PATCH] and support obscured rects for clip-out if middle of bordered image set to solid. speedup. SVN revision: 39051 --- .../src/lib/canvas/evas_object_gradient.c | 2 + .../lib/canvas/evas_object_gradient2_linear.c | 2 + .../lib/canvas/evas_object_gradient2_radial.c | 2 + .../evas/src/lib/canvas/evas_object_image.c | 38 ++++++++++++- legacy/evas/src/lib/canvas/evas_object_line.c | 2 + .../evas/src/lib/canvas/evas_object_polygon.c | 2 + .../src/lib/canvas/evas_object_rectangle.c | 2 + .../evas/src/lib/canvas/evas_object_smart.c | 2 + legacy/evas/src/lib/canvas/evas_object_text.c | 4 +- .../src/lib/canvas/evas_object_textblock.c | 4 +- legacy/evas/src/lib/canvas/evas_render.c | 56 +++++++++++-------- legacy/evas/src/lib/include/evas_private.h | 3 + 12 files changed, 94 insertions(+), 25 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_object_gradient.c b/legacy/evas/src/lib/canvas/evas_object_gradient.c index 5c3d38537b..39578591c8 100644 --- a/legacy/evas/src/lib/canvas/evas_object_gradient.c +++ b/legacy/evas/src/lib/canvas/evas_object_gradient.c @@ -75,6 +75,8 @@ static const Evas_Object_Func object_func = evas_object_gradient_was_opaque, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/legacy/evas/src/lib/canvas/evas_object_gradient2_linear.c b/legacy/evas/src/lib/canvas/evas_object_gradient2_linear.c index b2e7a1d38f..72404c719e 100644 --- a/legacy/evas/src/lib/canvas/evas_object_gradient2_linear.c +++ b/legacy/evas/src/lib/canvas/evas_object_gradient2_linear.c @@ -61,6 +61,8 @@ static const Evas_Object_Func object_func = NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/legacy/evas/src/lib/canvas/evas_object_gradient2_radial.c b/legacy/evas/src/lib/canvas/evas_object_gradient2_radial.c index 282e2629ba..6cc236bc0d 100644 --- a/legacy/evas/src/lib/canvas/evas_object_gradient2_radial.c +++ b/legacy/evas/src/lib/canvas/evas_object_gradient2_radial.c @@ -61,6 +61,8 @@ static const Evas_Object_Func rg_object_func = NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/legacy/evas/src/lib/canvas/evas_object_image.c b/legacy/evas/src/lib/canvas/evas_object_image.c index 5ee8a96c47..ae76da119f 100644 --- a/legacy/evas/src/lib/canvas/evas_object_image.c +++ b/legacy/evas/src/lib/canvas/evas_object_image.c @@ -80,6 +80,8 @@ static void *evas_object_image_engine_data_get(Evas_Object *obj); static int evas_object_image_is_opaque(Evas_Object *obj); static int evas_object_image_was_opaque(Evas_Object *obj); static int evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static int evas_object_image_has_opaque_rect(Evas_Object *obj); +static int evas_object_image_get_opaque_rect(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); static void *evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace); static void evas_object_image_filled_resize_listener(void *data, Evas *e, Evas_Object *obj, void *einfo); @@ -104,7 +106,9 @@ static const Evas_Object_Func object_func = evas_object_image_is_inside, NULL, NULL, - NULL + NULL, + evas_object_image_has_opaque_rect, + evas_object_image_get_opaque_rect }; /** @@ -2687,6 +2691,38 @@ evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) return (a != 0); } +static int +evas_object_image_has_opaque_rect(Evas_Object *obj) +{ + Evas_Object_Image *o; + + o = (Evas_Object_Image *)(obj->object_data); + if (((o->cur.border.l | o->cur.border.r | o->cur.border.t | o->cur.border.b) != 0) && + (o->cur.border.fill == EVAS_BORDER_FILL_SOLID) && + (obj->cur.render_op == EVAS_RENDER_BLEND) && + (obj->cur.cache.clip.a == 255) && + (o->cur.fill.x == 0) && + (o->cur.fill.y == 0) && + (o->cur.fill.w == obj->cur.geometry.w) && + (o->cur.fill.h == obj->cur.geometry.h) + ) return 1; + return 0; +} + +static int +evas_object_image_get_opaque_rect(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + Evas_Object_Image *o; + + o = (Evas_Object_Image *)(obj->object_data); + *x = obj->cur.geometry.x + o->cur.border.l; + *y = obj->cur.geometry.y + o->cur.border.t; + *w = obj->cur.geometry.w - (o->cur.border.l + o->cur.border.r); + if (*w < 0) *w = 0; + *h = obj->cur.geometry.h - (o->cur.border.t + o->cur.border.b); + if (*h < 0) *h = 0; +} + static void * evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace) { diff --git a/legacy/evas/src/lib/canvas/evas_object_line.c b/legacy/evas/src/lib/canvas/evas_object_line.c index 360d5cd56f..df40b91f26 100644 --- a/legacy/evas/src/lib/canvas/evas_object_line.c +++ b/legacy/evas/src/lib/canvas/evas_object_line.c @@ -63,6 +63,8 @@ static const Evas_Object_Func object_func = evas_object_line_is_inside, evas_object_line_was_inside, evas_object_line_coords_recalc, + NULL, + NULL, NULL }; diff --git a/legacy/evas/src/lib/canvas/evas_object_polygon.c b/legacy/evas/src/lib/canvas/evas_object_polygon.c index 8b27e81af0..fc0f257a61 100644 --- a/legacy/evas/src/lib/canvas/evas_object_polygon.c +++ b/legacy/evas/src/lib/canvas/evas_object_polygon.c @@ -60,6 +60,8 @@ static const Evas_Object_Func object_func = evas_object_polygon_is_inside, evas_object_polygon_was_inside, NULL, + NULL, + NULL, NULL }; diff --git a/legacy/evas/src/lib/canvas/evas_object_rectangle.c b/legacy/evas/src/lib/canvas/evas_object_rectangle.c index d4454d1f8a..fb352a2579 100644 --- a/legacy/evas/src/lib/canvas/evas_object_rectangle.c +++ b/legacy/evas/src/lib/canvas/evas_object_rectangle.c @@ -57,6 +57,8 @@ static const Evas_Object_Func object_func = NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/legacy/evas/src/lib/canvas/evas_object_smart.c b/legacy/evas/src/lib/canvas/evas_object_smart.c index 96d1b5221a..716b82fc38 100644 --- a/legacy/evas/src/lib/canvas/evas_object_smart.c +++ b/legacy/evas/src/lib/canvas/evas_object_smart.c @@ -57,6 +57,8 @@ static const Evas_Object_Func object_func = NULL, NULL, NULL, + NULL, + NULL, NULL }; diff --git a/legacy/evas/src/lib/canvas/evas_object_text.c b/legacy/evas/src/lib/canvas/evas_object_text.c index 6078ede4aa..7d1eda9fe3 100644 --- a/legacy/evas/src/lib/canvas/evas_object_text.c +++ b/legacy/evas/src/lib/canvas/evas_object_text.c @@ -72,7 +72,9 @@ static const Evas_Object_Func object_func = NULL, NULL, NULL, - evas_object_text_scale_update + evas_object_text_scale_update, + NULL, + NULL }; /* the actual api call to add a rect */ diff --git a/legacy/evas/src/lib/canvas/evas_object_textblock.c b/legacy/evas/src/lib/canvas/evas_object_textblock.c index 2680d0b5eb..09c67c13d0 100644 --- a/legacy/evas/src/lib/canvas/evas_object_textblock.c +++ b/legacy/evas/src/lib/canvas/evas_object_textblock.c @@ -175,7 +175,9 @@ static const Evas_Object_Func object_func = NULL, NULL, evas_object_textblock_coords_recalc, - evas_object_textblock_scale_update + evas_object_textblock_scale_update, + NULL, + NULL }; /* the actual api call to add a textblock */ diff --git a/legacy/evas/src/lib/canvas/evas_render.c b/legacy/evas/src/lib/canvas/evas_render.c index a986cb69fc..aac82b83d6 100644 --- a/legacy/evas/src/lib/canvas/evas_render.c +++ b/legacy/evas/src/lib/canvas/evas_render.c @@ -400,7 +400,9 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char Evas_Object *obj; obj = eina_array_data_get(&e->active_objects, i); - if (UNLIKELY(evas_object_is_opaque(obj) && + if (UNLIKELY((evas_object_is_opaque(obj) || + ((obj->func->has_opaque_rect) && + (obj->func->has_opaque_rect(obj)))) && evas_object_is_visible(obj) && (!obj->clip.clipees) && (obj->cur.visible) && @@ -476,21 +478,6 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char obj->cur.cache.clip.h); if ((w > 0) && (h > 0)) { -/// printf("CLIP: %p | %i %i, %ix%i | %p %i %i %ix%i\n", -/// obj, -/// x, y, w, h, -/// obj->cur.clipper, -/// obj->cur.cache.clip.x + off_x, -/// obj->cur.cache.clip.y + off_y, -/// obj->cur.cache.clip.w, -/// obj->cur.cache.clip.h -/// ); -/// if (((obj->cur.cache.clip.x + off_x) == 0) && -/// ((obj->cur.cache.clip.w) == 960)) -/// { -/// abort(); -/// } - e->engine.func->context_clip_set(e->engine.data.output, e->engine.data.context, x, y, w, h); @@ -500,12 +487,37 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char Evas_Object *obj2; obj2 = (Evas_Object *) eina_array_data_get(&e->temporary_objects, j); - e->engine.func->context_cutout_add(e->engine.data.output, - e->engine.data.context, - obj2->cur.cache.clip.x + off_x, - obj2->cur.cache.clip.y + off_y, - obj2->cur.cache.clip.w, - obj2->cur.cache.clip.h); + if (evas_object_is_opaque(obj2)) + e->engine.func->context_cutout_add(e->engine.data.output, + e->engine.data.context, + obj2->cur.cache.clip.x + off_x, + obj2->cur.cache.clip.y + off_y, + obj2->cur.cache.clip.w, + obj2->cur.cache.clip.h); + else + { + if (obj2->func->get_opaque_rect) + { + Evas_Coord obx, oby, obw, obh; + + obj2->func->get_opaque_rect + (obj2, &obx, &oby, &obw, &obh); + if ((obw > 0) && (obh > 0)) + { + obx += off_x; + oby += off_y; + RECTS_CLIP_TO_RECT(obx, oby, obw, obh, + obj2->cur.cache.clip.x + off_x, + obj2->cur.cache.clip.y + off_y, + obj2->cur.cache.clip.w, + obj2->cur.cache.clip.h); + e->engine.func->context_cutout_add(e->engine.data.output, + e->engine.data.context, + obx, oby, + obw, obh); + } + } + } } #endif obj->func->render(obj, diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index ee63a8b22d..cd871df2da 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -531,6 +531,9 @@ struct _Evas_Object_Func void (*coords_recalc) (Evas_Object *obj); void (*scale_update) (Evas_Object *obj); + + int (*has_opaque_rect) (Evas_Object *obj); + int (*get_opaque_rect) (Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); }; struct _Evas_Func