summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2015-05-09 20:02:13 +0200
committerCedric BAIL <cedric@osg.samsung.com>2015-08-05 15:12:33 +0200
commit033658d1caf0624fac71d482be5c8f14622b09b7 (patch)
tree3df916048def3d0b82ce07890daec126e54ec884
parent8b31b7c33a8f7e35e95e9e8b01eb0fc826787fa9 (diff)
evas: implementation of snapshot feature.
This should theorically work, need some test. Design is easy to understand. Render every part of a snapshot object by rendering the content below it, before rendering the stack above it using that object content.
-rw-r--r--src/lib/evas/canvas/evas_main.c4
-rw-r--r--src/lib/evas/canvas/evas_object_image.c41
-rw-r--r--src/lib/evas/canvas/evas_object_main.c2
-rw-r--r--src/lib/evas/canvas/evas_render.c81
-rw-r--r--src/lib/evas/include/evas_inline.x3
-rw-r--r--src/lib/evas/include/evas_private.h2
6 files changed, 118 insertions, 15 deletions
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index e20f748941..5e7e6ee242 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -175,7 +175,7 @@ _evas_canvas_eo_base_constructor(Eo *eo_obj, Evas_Public_Data *e)
175 175
176#define EVAS_ARRAY_SET(E, Array) \ 176#define EVAS_ARRAY_SET(E, Array) \
177 eina_array_step_set(&E->Array, sizeof (E->Array), \ 177 eina_array_step_set(&E->Array, sizeof (E->Array), \
178 ((1024 * sizeof (void*)) - sizeof (E->Array)) / sizeof (void*)); 178 ((1024 * sizeof (void*)) - sizeof (E->Array)) / sizeof (void*));
179 179
180 EVAS_ARRAY_SET(e, delete_objects); 180 EVAS_ARRAY_SET(e, delete_objects);
181 EVAS_ARRAY_SET(e, active_objects); 181 EVAS_ARRAY_SET(e, active_objects);
@@ -184,6 +184,7 @@ _evas_canvas_eo_base_constructor(Eo *eo_obj, Evas_Public_Data *e)
184 EVAS_ARRAY_SET(e, pending_objects); 184 EVAS_ARRAY_SET(e, pending_objects);
185 EVAS_ARRAY_SET(e, obscuring_objects); 185 EVAS_ARRAY_SET(e, obscuring_objects);
186 EVAS_ARRAY_SET(e, temporary_objects); 186 EVAS_ARRAY_SET(e, temporary_objects);
187 EVAS_ARRAY_SET(e, snapshot_objects);
187 EVAS_ARRAY_SET(e, clip_changes); 188 EVAS_ARRAY_SET(e, clip_changes);
188 EVAS_ARRAY_SET(e, scie_unref_queue); 189 EVAS_ARRAY_SET(e, scie_unref_queue);
189 EVAS_ARRAY_SET(e, image_unref_queue); 190 EVAS_ARRAY_SET(e, image_unref_queue);
@@ -300,6 +301,7 @@ _evas_canvas_eo_base_destructor(Eo *eo_e, Evas_Public_Data *e)
300 eina_array_flush(&e->pending_objects); 301 eina_array_flush(&e->pending_objects);
301 eina_array_flush(&e->obscuring_objects); 302 eina_array_flush(&e->obscuring_objects);
302 eina_array_flush(&e->temporary_objects); 303 eina_array_flush(&e->temporary_objects);
304 eina_array_flush(&e->snapshot_objects);
303 eina_array_flush(&e->clip_changes); 305 eina_array_flush(&e->clip_changes);
304 eina_array_flush(&e->scie_unref_queue); 306 eina_array_flush(&e->scie_unref_queue);
305 eina_array_flush(&e->image_unref_queue); 307 eina_array_flush(&e->image_unref_queue);
diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c
index 32191fdabf..2f8561f219 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -69,6 +69,8 @@ struct _Evas_Object_Image_Pixels
69 69
70 Evas_Video_Surface video; 70 Evas_Video_Surface video;
71 unsigned int video_caps; 71 unsigned int video_caps;
72
73 int surface_w, surface_h; /* used by snapshot feature */
72}; 74};
73 75
74struct _Evas_Object_Image_State 76struct _Evas_Object_Image_State
@@ -233,7 +235,7 @@ static const Evas_Object_Image_Load_Opts default_load_opts = {
233}; 235};
234 236
235static const Evas_Object_Image_Pixels default_pixels = { 237static const Evas_Object_Image_Pixels default_pixels = {
236 NULL, { NULL, NULL }, { 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, ~0x0 238 NULL, { NULL, NULL }, { 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, ~0x0, 0, 0
237}; 239};
238 240
239static const Evas_Object_Image_State default_state = { 241static const Evas_Object_Image_State default_state = {
@@ -3301,6 +3303,14 @@ _evas_image_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
3301 uvw = imagew; 3303 uvw = imagew;
3302 uvh = imageh; 3304 uvh = imageh;
3303 } 3305 }
3306 else if (obj->cur->snapshot)
3307 {
3308 pixels = o->engine_data;
3309 imagew = o->pixels->surface_w;
3310 imageh = o->pixels->surface_h;
3311 uvw = imagew;
3312 uvh = imageh;
3313 }
3304 else if (!o->cur->source) 3314 else if (!o->cur->source)
3305 { 3315 {
3306 pixels = evas_process_dirty_pixels(eo_obj, obj, o, output, surface, o->engine_data); 3316 pixels = evas_process_dirty_pixels(eo_obj, obj, o, output, surface, o->engine_data);
@@ -3322,6 +3332,7 @@ _evas_image_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
3322 ((Evas_Image_Data *)eo_data_scope_get(o->cur->source, MY_CLASS))->engine_data) 3332 ((Evas_Image_Data *)eo_data_scope_get(o->cur->source, MY_CLASS))->engine_data)
3323 { 3333 {
3324 Evas_Image_Data *oi; 3334 Evas_Image_Data *oi;
3335
3325 oi = eo_data_scope_get(o->cur->source, MY_CLASS); 3336 oi = eo_data_scope_get(o->cur->source, MY_CLASS);
3326 pixels = oi->engine_data; 3337 pixels = oi->engine_data;
3327 imagew = oi->cur->image.w; 3338 imagew = oi->cur->image.w;
@@ -4758,6 +4769,34 @@ _evas_image_snapshot_get(Eo *eo, Evas_Image_Data *pd EINA_UNUSED)
4758 return obj->cur->snapshot; 4769 return obj->cur->snapshot;
4759} 4770}
4760 4771
4772void *
4773_evas_object_image_surface_get(Evas_Object *eo, Evas_Object_Protected_Data *obj)
4774{
4775 Evas_Image_Data *pd = eo_data_scope_get(eo, EVAS_IMAGE_CLASS);
4776
4777 if (pd->engine_data &&
4778 pd->pixels->surface_w == obj->cur->geometry.w &&
4779 pd->pixels->surface_h == obj->cur->geometry.h)
4780 return pd->engine_data;
4781
4782 if (pd->engine_data)
4783 ENFN->image_free(ENDT, pd->engine_data);
4784
4785 // FIXME: alpha forced to 1 for now, need to figure out Evas alpha here
4786 EINA_COW_PIXEL_WRITE_BEGIN(pd, pixi_write)
4787 {
4788 pd->engine_data = ENFN->image_map_surface_new(ENDT,
4789 obj->cur->geometry.w,
4790 obj->cur->geometry.h,
4791 1);
4792 pixi_write->surface_w = obj->cur->geometry.w;
4793 pixi_write->surface_h = obj->cur->geometry.h;
4794 }
4795 EINA_COW_PIXEL_WRITE_END(pd, pixi_write);
4796
4797 return pd->engine_data;
4798}
4799
4761EAPI void 4800EAPI void
4762evas_object_image_file_set(Eo *obj, const char *file, const char *key) 4801evas_object_image_file_set(Eo *obj, const char *file, const char *key)
4763{ 4802{
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 3de8510d12..91d6761b41 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -30,7 +30,7 @@ static const Evas_Object_Protected_State default_state = {
30 NULL, { 0, 0, 0, 0 }, 30 NULL, { 0, 0, 0, 0 },
31 { { 0, 0, 0, 0, 0, 0, 0, 0, EINA_FALSE, EINA_FALSE } }, 31 { { 0, 0, 0, 0, 0, 0, 0, 0, EINA_FALSE, EINA_FALSE } },
32 { 255, 255, 255, 255 }, 32 { 255, 255, 255, 255 },
33 1.0, 0, EVAS_RENDER_BLEND, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE 33 1.0, 0, EVAS_RENDER_BLEND, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE
34}; 34};
35static const Evas_Object_Filter_Data default_filter = { 35static const Evas_Object_Filter_Data default_filter = {
36 NULL, NULL, NULL, NULL, NULL, NULL, { { "default", 0.0 }, { "default", 0.0 }, 0.0 }, EINA_FALSE, EINA_FALSE 36 NULL, NULL, NULL, NULL, NULL, NULL, { { "default", 0.0 }, { "default", 0.0 }, 0.0 }, EINA_FALSE, EINA_FALSE
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c
index c308cb0b8f..f178ff56f9 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -496,6 +496,7 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
496 Eina_Array *restack_objects, 496 Eina_Array *restack_objects,
497 Eina_Array *delete_objects, 497 Eina_Array *delete_objects,
498 Eina_Array *render_objects, 498 Eina_Array *render_objects,
499 Eina_Array *snapshot_objects,
499 int restack, 500 int restack,
500 int *redraw_all, 501 int *redraw_all,
501 Eina_Bool mapped_parent, 502 Eina_Bool mapped_parent,
@@ -538,6 +539,8 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
538 539
539 if ((!mapped_parent) && ((is_active) || (obj->delete_me != 0))) 540 if ((!mapped_parent) && ((is_active) || (obj->delete_me != 0)))
540 OBJ_ARRAY_PUSH(active_objects, obj); 541 OBJ_ARRAY_PUSH(active_objects, obj);
542 if (is_active && obj->cur->snapshot)
543 OBJ_ARRAY_PUSH(snapshot_objects, obj);
541 544
542#ifdef REND_DBG 545#ifdef REND_DBG
543 if (!is_active) 546 if (!is_active)
@@ -596,6 +599,7 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
596 restack_objects, 599 restack_objects,
597 delete_objects, 600 delete_objects,
598 render_objects, 601 render_objects,
602 snapshot_objects,
599 obj->restack, 603 obj->restack,
600 redraw_all, 604 redraw_all,
601 EINA_TRUE, 605 EINA_TRUE,
@@ -653,6 +657,7 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
653 restack_objects, 657 restack_objects,
654 delete_objects, 658 delete_objects,
655 render_objects, 659 render_objects,
660 snapshot_objects,
656 obj->restack, 661 obj->restack,
657 redraw_all, 662 redraw_all,
658 mapped_parent, 663 mapped_parent,
@@ -731,6 +736,7 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
731 restack_objects, 736 restack_objects,
732 delete_objects, 737 delete_objects,
733 render_objects, 738 render_objects,
739 snapshot_objects,
734 restack, 740 restack,
735 redraw_all, 741 redraw_all,
736 mapped_parent, 742 mapped_parent,
@@ -798,6 +804,7 @@ _evas_render_phase1_process(Evas_Public_Data *e,
798 Eina_Array *restack_objects, 804 Eina_Array *restack_objects,
799 Eina_Array *delete_objects, 805 Eina_Array *delete_objects,
800 Eina_Array *render_objects, 806 Eina_Array *render_objects,
807 Eina_Array *snapshot_objects,
801 int *redraw_all) 808 int *redraw_all)
802{ 809{
803 Evas_Layer *lay; 810 Evas_Layer *lay;
@@ -812,7 +819,8 @@ _evas_render_phase1_process(Evas_Public_Data *e,
812 { 819 {
813 clean_them |= _evas_render_phase1_object_process 820 clean_them |= _evas_render_phase1_object_process
814 (e, obj->object, active_objects, restack_objects, delete_objects, 821 (e, obj->object, active_objects, restack_objects, delete_objects,
815 render_objects, 0, redraw_all, EINA_FALSE, EINA_FALSE, 2); 822 render_objects, snapshot_objects, 0, redraw_all,
823 EINA_FALSE, EINA_FALSE, 2);
816 } 824 }
817 } 825 }
818 RD(0, " ---]\n"); 826 RD(0, " ---]\n");
@@ -891,6 +899,7 @@ clean_stuff:
891 OBJS_ARRAY_CLEAN(&e->render_objects); 899 OBJS_ARRAY_CLEAN(&e->render_objects);
892 OBJS_ARRAY_CLEAN(&e->restack_objects); 900 OBJS_ARRAY_CLEAN(&e->restack_objects);
893 OBJS_ARRAY_CLEAN(&e->delete_objects); 901 OBJS_ARRAY_CLEAN(&e->delete_objects);
902 OBJS_ARRAY_CLEAN(&e->snapshot_objects);
894 e->invalidate = EINA_TRUE; 903 e->invalidate = EINA_TRUE;
895 return; 904 return;
896 } 905 }
@@ -934,7 +943,7 @@ _evas_render_can_use_overlay(Evas_Public_Data *e, Evas_Object *eo_obj)
934 Evas_Object *video_parent = NULL; 943 Evas_Object *video_parent = NULL;
935 Eina_Rectangle zone; 944 Eina_Rectangle zone;
936 Evas_Coord xc1, yc1, xc2, yc2; 945 Evas_Coord xc1, yc1, xc2, yc2;
937 unsigned int i; 946 int i;
938 Eina_Bool nooverlay; 947 Eina_Bool nooverlay;
939 Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS); 948 Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
940 Evas_Object_Protected_Data *tmp = NULL; 949 Evas_Object_Protected_Data *tmp = NULL;
@@ -2124,13 +2133,13 @@ _cb_always_call(Evas *eo_e, Evas_Callback_Type type, void *event_info)
2124static Eina_Bool 2133static Eina_Bool
2125evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *e, 2134evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *e,
2126 void *surface, 2135 void *surface,
2136 Evas_Object_Protected_Data *top,
2127 int ux, int uy, int uw, int uh, 2137 int ux, int uy, int uw, int uh,
2128 int cx, int cy, int cw, int ch, 2138 int cx, int cy, int cw, int ch,
2129 int fx, int fy, 2139 int fx, int fy,
2130 Eina_Bool alpha, 2140 Eina_Bool alpha,
2131 Eina_Bool make_updates, 2141 Eina_Bool make_updates,
2132 Eina_Bool do_async, 2142 Eina_Bool do_async,
2133 Evas_Render_Mode render_mode,
2134 unsigned int *offset) 2143 unsigned int *offset)
2135{ 2144{
2136 Evas_Object *eo_obj; 2145 Evas_Object *eo_obj;
@@ -2210,6 +2219,8 @@ evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *e,
2210 obj = eina_array_data_get(&e->active_objects, i); 2219 obj = eina_array_data_get(&e->active_objects, i);
2211 eo_obj = obj->object; 2220 eo_obj = obj->object;
2212 2221
2222 if (obj == top) break;
2223
2213 /* if it's in our outpout rect and it doesn't clip anything */ 2224 /* if it's in our outpout rect and it doesn't clip anything */
2214 RD(0, " OBJ: [%p", obj); 2225 RD(0, " OBJ: [%p", obj);
2215 IFRD(0, " '%s'", obj->name); 2226 IFRD(0, " '%s'", obj->name);
@@ -2279,6 +2290,9 @@ evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *e,
2279 2290
2280 obj2 = (Evas_Object_Protected_Data *)eina_array_data_get 2291 obj2 = (Evas_Object_Protected_Data *)eina_array_data_get
2281 (&e->temporary_objects, j); 2292 (&e->temporary_objects, j);
2293
2294 if (obj2 == top) break;
2295
2282 _evas_render_cutout_add(e, obj2, off_x + fx, off_y + fy); 2296 _evas_render_cutout_add(e, obj2, off_x + fx, off_y + fy);
2283 } 2297 }
2284#endif 2298#endif
@@ -2302,14 +2316,6 @@ evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *e,
2302 } 2316 }
2303 2317
2304 eina_evlog("-render_objects", eo_e, 0.0, NULL); 2318 eina_evlog("-render_objects", eo_e, 0.0, NULL);
2305
2306 eina_evlog("+render_push", eo_e, 0.0, NULL);
2307 e->engine.func->output_redraws_next_update_push(e->engine.data.output,
2308 surface,
2309 ux, uy, uw, uh,
2310 render_mode);
2311 eina_evlog("-render_push", eo_e, 0.0, NULL);
2312
2313 /* free obscuring objects list */ 2319 /* free obscuring objects list */
2314 OBJS_ARRAY_CLEAN(&e->temporary_objects); 2320 OBJS_ARRAY_CLEAN(&e->temporary_objects);
2315 RD(0, " ---]\n"); 2321 RD(0, " ---]\n");
@@ -2394,6 +2400,7 @@ evas_render_updates_internal(Evas *eo_e,
2394 &e->restack_objects, 2400 &e->restack_objects,
2395 &e->delete_objects, 2401 &e->delete_objects,
2396 &e->render_objects, 2402 &e->render_objects,
2403 &e->snapshot_objects,
2397 &redraw_all); 2404 &redraw_all);
2398 eina_evlog("-render_phase1", eo_e, 0.0, NULL); 2405 eina_evlog("-render_phase1", eo_e, 0.0, NULL);
2399 } 2406 }
@@ -2569,6 +2576,7 @@ evas_render_updates_internal(Evas *eo_e,
2569 unsigned int offset = 0; 2576 unsigned int offset = 0;
2570 int fx = e->framespace.x; 2577 int fx = e->framespace.x;
2571 int fy = e->framespace.y; 2578 int fy = e->framespace.y;
2579 int j;
2572 Eina_Bool haveup = EINA_FALSE; 2580 Eina_Bool haveup = EINA_FALSE;
2573 2581
2574 if (do_async) _evas_render_busy_begin(); 2582 if (do_async) _evas_render_busy_begin();
@@ -2581,13 +2589,59 @@ evas_render_updates_internal(Evas *eo_e,
2581 { 2589 {
2582 haveup = EINA_TRUE; 2590 haveup = EINA_TRUE;
2583 2591
2592 /* phase 6.1 render every snapshot that needs to be updated
2593 for this part of the screen */
2594 for (j = e->snapshot_objects.count - 1; j >= 0; j--)
2595 {
2596 Eina_Rectangle output, cr, ur;
2597
2598 obj = (Evas_Object_Protected_Data *)eina_array_data_get(&e->snapshot_objects, j);
2599
2600 EINA_RECTANGLE_SET(&output,
2601 obj->cur->geometry.x,
2602 obj->cur->geometry.y,
2603 obj->cur->geometry.w,
2604 obj->cur->geometry.h);
2605 EINA_RECTANGLE_SET(&ur, ux, uy, uw, uh);
2606
2607 if (eina_rectangle_intersection(&ur, &output))
2608 {
2609 void *pseudo_canvas;
2610 unsigned int restore_offset = offset;
2611
2612 EINA_RECTANGLE_SET(&cr,
2613 ur.x - output.x, ur.y - output.y,
2614 ur.w, ur.h);
2615
2616 pseudo_canvas = _evas_object_image_surface_get(obj->object, obj);
2617
2618 clean_them |= evas_render_updates_internal_loop(eo_e, e, pseudo_canvas,
2619 obj,
2620 ur.x, ur.y, ur.w, ur.h,
2621 cr.x, cr.y, cr.w, cr.h,
2622 fx, fy, alpha,
2623 make_updates, do_async,
2624 &offset);
2625
2626 offset = restore_offset;
2627 }
2628 }
2629
2630 /* phase 6.2 render all the object on the target surface */
2584 clean_them |= evas_render_updates_internal_loop(eo_e, e, surface, 2631 clean_them |= evas_render_updates_internal_loop(eo_e, e, surface,
2632 NULL,
2585 ux, uy, uw, uh, 2633 ux, uy, uw, uh,
2586 cx, cy, cw, ch, 2634 cx, cy, cw, ch,
2587 fx, fy, alpha, 2635 fx, fy, alpha,
2588 make_updates, do_async, 2636 make_updates, do_async,
2589 render_mode,
2590 &offset); 2637 &offset);
2638
2639 eina_evlog("+render_push", eo_e, 0.0, NULL);
2640 e->engine.func->output_redraws_next_update_push(e->engine.data.output,
2641 surface,
2642 ux, uy, uw, uh,
2643 render_mode);
2644 eina_evlog("-render_push", eo_e, 0.0, NULL);
2591 } 2645 }
2592 2646
2593 eina_evlog("+render_output_flush", eo_e, 0.0, NULL); 2647 eina_evlog("+render_output_flush", eo_e, 0.0, NULL);
@@ -2725,6 +2779,7 @@ evas_render_updates_internal(Evas *eo_e,
2725 OBJS_ARRAY_CLEAN(&e->render_objects); 2779 OBJS_ARRAY_CLEAN(&e->render_objects);
2726 OBJS_ARRAY_CLEAN(&e->restack_objects); 2780 OBJS_ARRAY_CLEAN(&e->restack_objects);
2727 OBJS_ARRAY_CLEAN(&e->temporary_objects); 2781 OBJS_ARRAY_CLEAN(&e->temporary_objects);
2782 OBJS_ARRAY_CLEAN(&e->snapshot_objects);
2728 eina_array_foreach(&e->clip_changes, _evas_clip_changes_free, NULL); 2783 eina_array_foreach(&e->clip_changes, _evas_clip_changes_free, NULL);
2729 eina_array_clean(&e->clip_changes); 2784 eina_array_clean(&e->clip_changes);
2730/* we should flush here and have a mempool system for this 2785/* we should flush here and have a mempool system for this
@@ -3131,6 +3186,8 @@ evas_render_invalidate(Evas *eo_e)
3131 OBJS_ARRAY_FLUSH(&e->restack_objects); 3186 OBJS_ARRAY_FLUSH(&e->restack_objects);
3132 OBJS_ARRAY_FLUSH(&e->delete_objects); 3187 OBJS_ARRAY_FLUSH(&e->delete_objects);
3133 3188
3189 OBJS_ARRAY_FLUSH(&e->snapshot_objects);
3190
3134 e->invalidate = EINA_TRUE; 3191 e->invalidate = EINA_TRUE;
3135} 3192}
3136 3193
diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x
index 4614737911..29cc7d9744 100644
--- a/src/lib/evas/include/evas_inline.x
+++ b/src/lib/evas/include/evas_inline.x
@@ -74,6 +74,9 @@ evas_object_is_opaque(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
74 if ((obj->cur->clipper && obj->cur->clipper->mask->is_mask) || 74 if ((obj->cur->clipper && obj->cur->clipper->mask->is_mask) ||
75 (obj->clip.mask)) 75 (obj->clip.mask))
76 return 0; 76 return 0;
77 /* Non masked snapshot are supposed to be opaque */
78 if (obj->cur->snapshot)
79 return 1;
77 if (obj->func->is_opaque) 80 if (obj->func->is_opaque)
78 return obj->func->is_opaque(eo_obj, obj, obj->private_data); 81 return obj->func->is_opaque(eo_obj, obj, obj->private_data);
79 return 1; 82 return 1;
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index fe838d0f14..f4e019ee7a 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1880,6 +1880,8 @@ void _evas_device_unref(Evas_Device *dev);
1880 1880
1881Eina_Bool evas_vg_loader_svg(Evas_Object *vg, const Eina_File *f, const char *key EINA_UNUSED); 1881Eina_Bool evas_vg_loader_svg(Evas_Object *vg, const Eina_File *f, const char *key EINA_UNUSED);
1882 1882
1883void *_evas_object_image_surface_get(Evas_Object *eo, Evas_Object_Protected_Data *obj);
1884
1883extern Eina_Cow *evas_object_proxy_cow; 1885extern Eina_Cow *evas_object_proxy_cow;
1884extern Eina_Cow *evas_object_map_cow; 1886extern Eina_Cow *evas_object_map_cow;
1885extern Eina_Cow *evas_object_state_cow; 1887extern Eina_Cow *evas_object_state_cow;