diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2015-07-01 18:19:25 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2015-07-01 20:57:58 +0900 |
commit | 2fa2b702f34f2e6ddd67ea74c92123d49e0e63b8 (patch) | |
tree | 9b187e551b127682fa3dd477154b50c92c93b3f1 | |
parent | 29d0e1f5dabc9323470fca62aaccde36e6d10577 (diff) | |
download | efl-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.c | 53 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_render.c | 2 |
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) || |