summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2015-07-01 18:19:25 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2015-07-01 20:57:58 +0900
commit2fa2b702f34f2e6ddd67ea74c92123d49e0e63b8 (patch)
tree9b187e551b127682fa3dd477154b50c92c93b3f1
parent29d0e1f5dabc9323470fca62aaccde36e6d10577 (diff)
downloadefl-2fa2b702f34f2e6ddd67ea74c92123d49e0e63b8.tar.gz
Evas snapshot: Mark object as changed only if objects below did
Also mark whole object as changed if there's a filter. Filters can't really support partial updates.
-rw-r--r--src/lib/evas/canvas/evas_object_image.c53
-rw-r--r--src/lib/evas/canvas/evas_render.c2
2 files changed, 52 insertions, 3 deletions
diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c
index 245e5ef4e4..2ed5e86f79 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -3277,7 +3277,8 @@ _evas_image_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
}
else if (obj->cur->snapshot)
{
- pixels = o->engine_data;
+ //pixels = o->engine_data;
+ pixels = evas_process_dirty_pixels(eo_obj, obj, o, output, surface, o->engine_data);
imagew = o->pixels->surface_w;
imageh = o->pixels->surface_h;
uvw = imagew;
@@ -3641,6 +3642,53 @@ evas_object_image_render_pre(Evas_Object *eo_obj,
}
}
+ /* Snapshot, check all objects below this */
+ if (obj->cur->snapshot)
+ {
+ if (o->dirty_pixels)
+ {
+ evas_object_render_pre_prev_cur_add(&e->clip_changes, eo_obj, obj);
+ if (!o->pixels->pixel_updates) goto done;
+ }
+ else
+ {
+ Evas_Object_Protected_Data *sub;
+ Eina_Rectangle snapr, subr;
+ unsigned k;
+ EINA_RECTANGLE_SET(&snapr,
+ obj->cur->geometry.x,
+ obj->cur->geometry.y,
+ obj->cur->geometry.w,
+ obj->cur->geometry.h);
+ for (k = 0; k < e->render_objects.count; k++)
+ {
+ sub = eina_array_data_get(&e->render_objects, k);
+ if (obj == sub) break;
+ if (sub->changed)
+ {
+ EINA_RECTANGLE_SET(&subr,
+ sub->cur->geometry.x,
+ sub->cur->geometry.y,
+ sub->cur->geometry.w,
+ sub->cur->geometry.h);
+ if (eina_rectangle_intersection(&subr, &snapr))
+ {
+ subr.x -= snapr.x;
+ subr.y -= snapr.y;
+ if (o->has_filter)
+ {
+ /* for filters, need to redraw entire surface */
+ _evas_image_pixels_dirty_set(eo_obj, o, EINA_TRUE);
+ evas_object_render_pre_prev_cur_add(&e->clip_changes, eo_obj, obj);
+ if (!o->pixels->pixel_updates) goto done;
+ }
+ _evas_image_data_update_add(eo_obj, o, subr.x, subr.y, subr.w, subr.h);
+ }
+ }
+ }
+ }
+ }
+
/* now figure what changed and add draw rects */
/* if it just became visible or invisible */
is_v = evas_object_is_visible(eo_obj, obj);
@@ -3761,7 +3809,8 @@ evas_object_image_render_pre(Evas_Object *eo_obj,
(o->cur->border.b == 0) &&
(o->cur->image.w > 0) &&
(o->cur->image.h > 0) &&
- (!((obj->map->cur.map) && (obj->map->cur.usemap))))
+ (!((obj->map->cur.map) && (obj->map->cur.usemap))) &&
+ (!o->has_filter))
{
Eina_Rectangle *rr;
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c
index 98366ef151..9d630859c4 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -444,7 +444,7 @@ _evas_render_phase1_direct(Evas_Public_Data *e,
}
else if (obj->cur->snapshot)
{
- //obj->func->render_pre(eo_obj, obj, obj->private_data);
+ obj->func->render_pre(eo_obj, obj, obj->private_data);
}
else if (evas_object_is_visible(eo_obj, obj) &&
((obj->rect_del) ||