From a7f2974e1305b39465c234154045937b56de9e4d Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 26 Jun 2009 13:26:52 +0000 Subject: [PATCH] * evas: break engine API !!! Improvements: Now evas rendering loop is the one responsible to initialize the surface to 0 correctly (taking into account surface alpha and object opacity). This will reduce the number of memset we do. Note: Current software_x11 (xlib and xcb) are buggy. They are copying too much data when the surface use a mask. That's why two memset are left in their code. They could be removed, but we should fix the surface we copy on change (look at mxob user and evas_software_xlib_x_output_buffer_paste). SVN revision: 41206 --- legacy/evas/src/lib/canvas/evas_render.c | 55 ++++++++++++++++++- legacy/evas/src/lib/include/evas_private.h | 1 + .../src/modules/engines/buffer/evas_engine.c | 12 ++++ .../src/modules/engines/buffer/evas_outbuf.c | 16 ------ .../modules/engines/cairo_x11/evas_engine.c | 8 +++ .../modules/engines/directfb/evas_engine.c | 10 +++- .../evas/src/modules/engines/fb/evas_engine.c | 10 ++++ .../evas/src/modules/engines/fb/evas_outbuf.c | 4 -- .../modules/engines/software_16/evas_engine.c | 6 ++ .../engines/software_16_ddraw/evas_engine.c | 6 ++ .../engines/software_16_sdl/evas_engine.c | 9 ++- .../engines/software_16_wince/evas_engine.c | 6 ++ .../engines/software_16_x11/evas_engine.c | 6 ++ .../engines/software_ddraw/evas_engine.c | 6 ++ .../engines/software_gdi/evas_engine.c | 6 ++ .../engines/software_generic/evas_engine.c | 6 ++ .../engines/software_qtopia/evas_engine.c | 7 +++ .../engines/software_sdl/evas_engine.c | 2 - .../engines/software_x11/evas_engine.c | 12 ++++ .../engines/software_x11/evas_xcb_outbuf.c | 17 ++---- .../engines/software_x11/evas_xcb_outbuf.h | 3 + .../engines/software_x11/evas_xlib_outbuf.c | 23 ++++---- .../engines/software_x11/evas_xlib_outbuf.h | 2 + .../modules/engines/xrender_x11/evas_engine.c | 20 ++++--- 24 files changed, 194 insertions(+), 59 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_render.c b/legacy/evas/src/lib/canvas/evas_render.c index 4f3a4b121d..51711592ec 100644 --- a/legacy/evas/src/lib/canvas/evas_render.c +++ b/legacy/evas/src/lib/canvas/evas_render.c @@ -315,6 +315,7 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char Eina_List *ll; void *surface; Eina_Bool clean_them = EINA_FALSE; + Eina_Bool alpha; Eina_Rectangle *r; int ux, uy, uw, uh; int cx, cy, cw, ch; @@ -412,6 +413,8 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char { unsigned int offset = 0; + alpha = e->engine.func->canvas_alpha_get(e->engine.data.output, e->engine.data.context); + while ((surface = e->engine.func->output_redraws_next_update_get(e->engine.data.output, &ux, &uy, &uw, &uh, @@ -436,8 +439,58 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char obj = (Evas_Object *) eina_array_data_get(&e->obscuring_objects, i); if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh)) - eina_array_push(&e->temporary_objects, obj); + { + eina_array_push(&e->temporary_objects, obj); + + /* reset the background of the area if needed (using cutout and engine alpha flag to help) */ + if (alpha) + { + if (evas_object_is_opaque(obj)) + e->engine.func->context_cutout_add(e->engine.data.output, + e->engine.data.context, + obj->cur.cache.clip.x + off_x, + obj->cur.cache.clip.y + off_y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + else + { + if (obj->func->get_opaque_rect) + { + Evas_Coord obx, oby, obw, obh; + + obj->func->get_opaque_rect(obj, &obx, &oby, &obw, &obh); + if ((obw > 0) && (obh > 0)) + { + obx += off_x; + oby += off_y; + RECTS_CLIP_TO_RECT(obx, oby, obw, obh, + obj->cur.cache.clip.x + off_x, + obj->cur.cache.clip.y + off_y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + e->engine.func->context_cutout_add(e->engine.data.output, + e->engine.data.context, + obx, oby, + obw, obh); + } + } + } + } + } } + if (alpha) + { + e->engine.func->context_color_set(e->engine.data.output, e->engine.data.context, 0, 0, 0, 0); + e->engine.func->context_multiplier_unset(e->engine.data.output, e->engine.data.context); + e->engine.func->context_render_op_set(e->engine.data.output, e->engine.data.context, EVAS_RENDER_COPY); + e->engine.func->rectangle_draw(e->engine.data.output, + e->engine.data.context, + surface, + cx, cy, cw, ch); + e->engine.func->context_cutout_clear(e->engine.data.output, + e->engine.data.context); + } + /* render all object that intersect with rect */ for (i = 0; i < e->active_objects.count; ++i) { diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index d2bd650389..0916b44981 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -542,6 +542,7 @@ struct _Evas_Func void (*output_idle_flush) (void *data); void *(*context_new) (void *data); + Eina_Bool (*canvas_alpha_get) (void *data, void *context); void (*context_free) (void *data, void *context); void (*context_clip_set) (void *data, void *context, int x, int y, int w, int h); void (*context_clip_clip) (void *data, void *context, int x, int y, int w, int h); diff --git a/legacy/evas/src/modules/engines/buffer/evas_engine.c b/legacy/evas/src/modules/engines/buffer/evas_engine.c index 5343f1cfed..866c231606 100644 --- a/legacy/evas/src/modules/engines/buffer/evas_engine.c +++ b/legacy/evas/src/modules/engines/buffer/evas_engine.c @@ -322,6 +322,17 @@ eng_output_idle_flush(void *data) re = (Render_Engine *)data; } +static Eina_Bool +eng_canvas_alpha_get(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->ob->priv.back_buf) + return re->ob->priv.back_buf->cache_entry.flags.alpha; + return EINA_TRUE; +} + /* module advertising code */ static int module_open(Evas_Module *em) @@ -336,6 +347,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/buffer/evas_outbuf.c b/legacy/evas/src/modules/engines/buffer/evas_outbuf.c index 93f8db499d..25bc120bd2 100644 --- a/legacy/evas/src/modules/engines/buffer/evas_outbuf.c +++ b/legacy/evas/src/modules/engines/buffer/evas_outbuf.c @@ -81,18 +81,6 @@ evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, i if (buf->priv.back_buf) { *cx = x; *cy = y; *cw = w; *ch = h; - if (buf->priv.back_buf->cache_entry.flags.alpha) - { - int ww = w; - ptr = buf->priv.back_buf->image.data + (y * buf->priv.back_buf->cache_entry.w) + x; - while (h--) - { - while (w--) - *ptr++ = 0; - w = ww; - ptr += (buf->priv.back_buf->cache_entry.w - w); - } - } return buf->priv.back_buf; } else @@ -106,10 +94,6 @@ evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, i { im->cache_entry.flags.alpha = 1; im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h); - if (im) - { - memset(im->image.data, 0, w * h * sizeof(DATA32)); - } } } } diff --git a/legacy/evas/src/modules/engines/cairo_x11/evas_engine.c b/legacy/evas/src/modules/engines/cairo_x11/evas_engine.c index 768cffb9e8..89c1b3e3fd 100644 --- a/legacy/evas/src/modules/engines/cairo_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/cairo_x11/evas_engine.c @@ -23,6 +23,7 @@ static void eng_output_redraws_next_update_push(void *data, void *surface, int x static void eng_output_flush(void *data); static void *eng_context_new(void *data); +static Eina_Bool eng_canvas_alpha_get(void *data, void *context); static void eng_context_free(void *data, void *context); static void eng_context_clip_set(void *data, void *context, int x, int y, int w, int h); static void eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h); @@ -144,6 +145,7 @@ static Evas_Func eng_func = eng_output_flush, /* draw context virtual methods */ eng_context_new, + eng_canvas_alpha_get, eng_context_free, eng_context_clip_set, eng_context_clip_clip, @@ -1478,6 +1480,12 @@ eng_font_hinting_can_hint(void *data, int hinting) re = (Render_Engine *)data; } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} + static int module_open(Evas_Module *em) { diff --git a/legacy/evas/src/modules/engines/directfb/evas_engine.c b/legacy/evas/src/modules/engines/directfb/evas_engine.c index 1d75c4bf78..0b1b58b3ba 100644 --- a/legacy/evas/src/modules/engines/directfb/evas_engine.c +++ b/legacy/evas/src/modules/engines/directfb/evas_engine.c @@ -941,8 +941,6 @@ evas_engine_dfb_output_redraws_next_update_get(void *data, int *x, int *y, int * re->end = 1; } - _image_clear(re->screen_image, *x, *y, *w, *h ); - return re->screen_image->surface; } @@ -1602,6 +1600,14 @@ evas_engine_dfb_image_scale_hint_get(void *data __UNUSED__, void *image) return EVAS_IMAGE_SCALE_HINT_NONE; } +static Eina_Bool +evas_engine_dfb_canvas_alpha_get(void *data, void *context) +{ + Render_Engine *re = data; + + return re->screen_image->cache_entry.src->flags.alpha +} + static int module_open(Evas_Module *em) { diff --git a/legacy/evas/src/modules/engines/fb/evas_engine.c b/legacy/evas/src/modules/engines/fb/evas_engine.c index 58d684b4c2..17e5c011c9 100644 --- a/legacy/evas/src/modules/engines/fb/evas_engine.c +++ b/legacy/evas/src/modules/engines/fb/evas_engine.c @@ -247,6 +247,15 @@ eng_output_idle_flush(void *data) re = (Render_Engine *)data; } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return (re->ob->priv.fb.fb->fb_var.transp.length > 0); +} + /* module advertising code */ static int module_open(Evas_Module *em) @@ -261,6 +270,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/fb/evas_outbuf.c b/legacy/evas/src/modules/engines/fb/evas_outbuf.c index 4a85b94c37..322502495e 100644 --- a/legacy/evas/src/modules/engines/fb/evas_outbuf.c +++ b/legacy/evas/src/modules/engines/fb/evas_outbuf.c @@ -220,10 +220,6 @@ evas_fb_outbuf_fb_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, im->cache_entry.flags.alpha = 1; im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h); - /* handle framebuffers with alpha channel */ - if (buf->priv.fb.fb->fb_var.transp.length > 0) { - memset(im->image.data, 0, w * h * sizeof(DATA32)); - } return im; } return NULL; diff --git a/legacy/evas/src/modules/engines/software_16/evas_engine.c b/legacy/evas/src/modules/engines/software_16/evas_engine.c index 19f1dd3b62..25c8867314 100644 --- a/legacy/evas/src/modules/engines/software_16/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_16/evas_engine.c @@ -824,6 +824,11 @@ eng_font_hinting_can_hint(void *data __UNUSED__, int hinting) return evas_common_hinting_available(hinting); } +static Eina_Bool +eng_canvas_alpha_get(void *data __UNUSED__, void *context __UNUSED__) +{ + return EINA_TRUE; +} /* ***** @@ -850,6 +855,7 @@ static Evas_Func func = NULL, /* draw context virtual methods */ eng_context_new, + eng_canvas_alpha_get, eng_context_free, eng_context_clip_set, eng_context_clip_clip, diff --git a/legacy/evas/src/modules/engines/software_16_ddraw/evas_engine.c b/legacy/evas/src/modules/engines/software_16_ddraw/evas_engine.c index 61776d13b1..1e9a1b9ae4 100644 --- a/legacy/evas/src/modules/engines/software_16_ddraw/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_16_ddraw/evas_engine.c @@ -562,6 +562,11 @@ eng_output_idle_flush(void *data) } } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} /* module advertising code */ static int @@ -577,6 +582,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_16_sdl/evas_engine.c b/legacy/evas/src/modules/engines/software_16_sdl/evas_engine.c index 1f57ce5808..6828f6a106 100644 --- a/legacy/evas/src/modules/engines/software_16_sdl/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_16_sdl/evas_engine.c @@ -368,8 +368,6 @@ evas_engine_sdl16_output_redraws_next_update_get(void *data, rect.w = *w; rect.h = *h; - SDL_FillRect(re->soft16_engine_image->surface, &rect, 0); - /* Return the "fake" surface so it is passed to the drawing routines. */ return re->soft16_engine_image; } @@ -1018,6 +1016,12 @@ evas_engine_sdl16_image_stride_get(void *data __UNUSED__, void *image, int *stri if (stride) *stride = ((Soft16_Image*) eim->cache_entry.src)->stride; } +static Eina_Bool +evas_engine_sdl16_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} + /* module advertising code */ static int module_open(Evas_Module *em) @@ -1032,6 +1036,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c index 4e5a01eedb..8e78aea6f0 100644 --- a/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_16_wince/evas_engine.c @@ -703,6 +703,11 @@ eng_output_idle_flush(void *data) } } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} /* module advertising code */ static int @@ -718,6 +723,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_16_x11/evas_engine.c b/legacy/evas/src/modules/engines/software_16_x11/evas_engine.c index d4906e97ad..6028b80e8a 100644 --- a/legacy/evas/src/modules/engines/software_16_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_16_x11/evas_engine.c @@ -542,6 +542,11 @@ eng_output_idle_flush(void *data) } } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} /* module advertising code */ static int @@ -557,6 +562,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_ddraw/evas_engine.c b/legacy/evas/src/modules/engines/software_ddraw/evas_engine.c index 0cf7a2f4b8..c9340c9338 100644 --- a/legacy/evas/src/modules/engines/software_ddraw/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_ddraw/evas_engine.c @@ -309,6 +309,11 @@ eng_output_idle_flush(void *data) evas_software_ddraw_outbuf_idle_flush(re->ob); } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} /* module advertising code */ static int @@ -324,6 +329,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_gdi/evas_engine.c b/legacy/evas/src/modules/engines/software_gdi/evas_engine.c index 4c9eb2d9a1..b494634da7 100644 --- a/legacy/evas/src/modules/engines/software_gdi/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_gdi/evas_engine.c @@ -319,6 +319,11 @@ eng_output_idle_flush(void *data) evas_software_gdi_outbuf_idle_flush(re->ob); } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} /* module advertising code */ static int @@ -334,6 +339,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_generic/evas_engine.c b/legacy/evas/src/modules/engines/software_generic/evas_engine.c index 5dc7a0302b..2816dfb5cd 100644 --- a/legacy/evas/src/modules/engines/software_generic/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_generic/evas_engine.c @@ -961,6 +961,11 @@ eng_font_hinting_can_hint(void *data __UNUSED__, int hinting) return evas_common_hinting_available(hinting); } +static Eina_Bool +eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__) +{ + return EINA_TRUE; +} /* ***** @@ -987,6 +992,7 @@ static Evas_Func func = NULL, /* draw context virtual methods */ eng_context_new, + eng_canvas_alpha_get, eng_context_free, eng_context_clip_set, eng_context_clip_clip, diff --git a/legacy/evas/src/modules/engines/software_qtopia/evas_engine.c b/legacy/evas/src/modules/engines/software_qtopia/evas_engine.c index 83eadfbeba..7b57ea2ded 100644 --- a/legacy/evas/src/modules/engines/software_qtopia/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_qtopia/evas_engine.c @@ -262,6 +262,12 @@ eng_output_idle_flush(void *data) re = (Render_Engine *)data; } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + return EINA_FALSE; +} + /* module advertising code */ static int module_open(Evas_Module *em) @@ -276,6 +282,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_sdl/evas_engine.c b/legacy/evas/src/modules/engines/software_sdl/evas_engine.c index 5d542ba40c..dd3974d363 100644 --- a/legacy/evas/src/modules/engines/software_sdl/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_sdl/evas_engine.c @@ -255,8 +255,6 @@ evas_engine_sdl_output_redraws_next_update_get (void *data, rect.w = *w; rect.h = *h; - SDL_FillRect(re->rgba_engine_image->surface, &rect, 0); - /* Return the "fake" surface so it is passed to the drawing routines. */ return re->rgba_engine_image; } diff --git a/legacy/evas/src/modules/engines/software_x11/evas_engine.c b/legacy/evas/src/modules/engines/software_x11/evas_engine.c index 03d5d66934..5b4531b1a6 100644 --- a/legacy/evas/src/modules/engines/software_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_x11/evas_engine.c @@ -34,6 +34,7 @@ struct _Render_Engine void (*outbuf_free_region_for_update)(Outbuf *ob, RGBA_Image *update); void (*outbuf_flush)(Outbuf *ob); void (*outbuf_idle_flush)(Outbuf *ob); + Eina_Bool (*outbuf_alpha_get)(Outbuf *ob); }; /* prototypes we will use here */ @@ -380,6 +381,7 @@ eng_setup(Evas *e, void *in) re->outbuf_free_region_for_update = evas_software_xlib_outbuf_free_region_for_update; re->outbuf_flush = evas_software_xlib_outbuf_flush; re->outbuf_idle_flush = evas_software_xlib_outbuf_idle_flush; + re->outbuf_alpha_get = evas_software_xlib_outbuf_alpha_get; } #ifdef BUILD_ENGINE_SOFTWARE_XCB @@ -409,6 +411,7 @@ eng_setup(Evas *e, void *in) re->outbuf_free_region_for_update = evas_software_xcb_outbuf_free_region_for_update; re->outbuf_flush = evas_software_xcb_outbuf_flush; re->outbuf_idle_flush = evas_software_xcb_outbuf_idle_flush; + re->outbuf_alpha_get = evas_software_xcb_outbuf_alpha_get; } #endif @@ -611,6 +614,14 @@ eng_output_idle_flush(void *data) re->outbuf_idle_flush(re->ob); } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return (re->ob->priv.destination_alpha) || (re->outbuf_alpha_get(re->ob)); +} /* module advertising code */ static int @@ -626,6 +637,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); diff --git a/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c b/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c index 1b6dc140c3..ad70b39698 100644 --- a/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c +++ b/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c @@ -414,17 +414,6 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL)); buf->priv.synced = 1; } - if ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)) - { - int yy; - - im = buf->priv.onebuf; - for (yy = y; yy < (y + h); yy++) - { - memset(im->image.data + (im->cache_entry.w * yy) + x, - 0, w * sizeof(DATA32)); - } - } return buf->priv.onebuf; } obr = calloc(1, sizeof(Outbuf_Region)); @@ -1049,3 +1038,9 @@ evas_software_xcb_outbuf_debug_show(Outbuf *buf, free(xcb_get_input_focus_reply(buf->priv.x11.xcb.conn, xcb_get_input_focus_unchecked(buf->priv.x11.xcb.conn), NULL)); } } + +Eina_Bool +evas_software_xcb_outbuf_alpha_get (Outbuf *buf) +{ + return buf->priv.x11.xcb.mask; +} diff --git a/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h b/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h index 76b505b740..7a4f087b56 100644 --- a/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h +++ b/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h @@ -83,4 +83,7 @@ void evas_software_xcb_outbuf_debug_show (Outbuf *buf, int w, int h); +Eina_Bool evas_software_xcb_outbuf_alpha_get (Outbuf *buf); + + #endif diff --git a/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c b/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c index 79fecb80d5..6e4201e843 100644 --- a/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c +++ b/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c @@ -28,7 +28,7 @@ static int shmcountlimit = 32; static X_Output_Buffer * _find_xob(Display *d, Visual *v, int depth, int w, int h, int shm, void *data) { - Eina_List *l, *xl; + Eina_List *l, *xl = NULL; X_Output_Buffer *xob = NULL; X_Output_Buffer *xob2; int fitness = 0x7fffffff; @@ -363,17 +363,6 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w XSync(buf->priv.x11.xlib.disp, False); buf->priv.synced = 1; } - if ((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha)) - { - int yy; - - im = buf->priv.onebuf; - for (yy = y; yy < (y + h); yy++) - { - memset(im->image.data + (im->cache_entry.w * yy) + x, - 0, w * sizeof(DATA32)); - } - } return buf->priv.onebuf; } obr = calloc(1, sizeof(Outbuf_Region)); @@ -450,6 +439,8 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w NULL); } } + /* FIXME: We should be able to remove this memset, but somewhere in the process + we copy too much to the destination surface and some area are not cleaned before copy. */ if (alpha) /* FIXME: faster memset! */ memset(im->image.data, 0, w * h * sizeof(DATA32)); @@ -581,6 +572,8 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w NULL); */ } + /* FIXME: We should be able to remove this memset, but somewhere in the process + we copy too much to the destination surface and some area are not cleaned before copy. */ if ((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha)) /* FIXME: faster memset! */ memset(im->image.data, 0, w * h * sizeof(DATA32)); @@ -1037,3 +1030,9 @@ evas_software_xlib_outbuf_debug_show(Outbuf * buf, Drawable draw, int x, int y, XSync(buf->priv.x11.xlib.disp, False); } } + +Eina_Bool +evas_software_xlib_outbuf_alpha_get(Outbuf *buf) +{ + return buf->priv.x11.xlib.mask; +} diff --git a/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h b/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h index 2a3983a236..8745a1abfd 100644 --- a/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h +++ b/legacy/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h @@ -82,4 +82,6 @@ void evas_software_xlib_outbuf_debug_show (Outbuf *buf, int w, int h); +Eina_Bool evas_software_xlib_outbuf_alpha_get (Outbuf *buf); + #endif diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c index 2d17ff3ac0..5d5109949f 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c @@ -369,7 +369,7 @@ eng_info_free(Evas *e __UNUSED__, void *info) static void eng_setup(Evas *e, void *in) { - Render_Engine *re; + Render_Engine *re = NULL; Evas_Engine_Info_XRender_X11 *info; int resize = 1; @@ -559,14 +559,6 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i *x = ux; *y = uy; *w = uw; *h = uh; *cx = 0; *cy = 0; *cw = uw; *ch = uh; - if ((re->destination_alpha) || (re->x11.mask)) - { - Xrender_Surface *surface; - - surface = re->render_surface_new(re->xinf, uw, uh, re->xinf->x11.fmt32, 1); - re->render_surface_solid_rectangle_set(surface, 0, 0, 0, 0, 0, 0, uw, uh); - return surface; - } // use target format to avoid conversion to depth when copying to screen // return _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmtdef, 0); // use 24/32bpp for tmp buf for better quality. rendering in 24/32bpp @@ -1397,6 +1389,15 @@ eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y evas_cache_image_drop(&im->cache_entry); } +static Eina_Bool +eng_canvas_alpha_get(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return (re->destination_alpha) || (re->x11.mask); +} + /* module advertising code */ static int module_open(Evas_Module *em) @@ -1412,6 +1413,7 @@ module_open(Evas_Module *em) ORD(info); ORD(info_free); ORD(setup); + ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set);