diff --git a/src/modules/evas/engines/software_x11/evas_xlib_swapbuf.c b/src/modules/evas/engines/software_x11/evas_xlib_swapbuf.c index fbf8b036b1..22c3bb72fd 100644 --- a/src/modules/evas/engines/software_x11/evas_xlib_swapbuf.c +++ b/src/modules/evas/engines/software_x11/evas_xlib_swapbuf.c @@ -226,7 +226,8 @@ evas_software_xlib_swapbuf_new_region_for_update(Outbuf *buf, int x, int y, int im = buf->priv.onebuf; if (!im) { - data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl); + data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl, + &(buf->w), &(buf->h)); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) im = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), @@ -482,8 +483,11 @@ evas_software_xlib_swapbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, } src_data = update->image.data; if (!src_data) return; - dst_data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl); + dst_data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl, + &(buf->w), &(buf->h)); if (!dst_data) return; + RECTS_CLIP_TO_RECT(r.x, r.y, r.w, r.h, 0, 0, buf->w, buf->h); + if ((r.w <= 0) || (r.h <= 0)) return; bpp = d / 8; if (bpp <= 0) return; wid = bpl / bpp; diff --git a/src/modules/evas/engines/software_x11/evas_xlib_swapper.c b/src/modules/evas/engines/software_x11/evas_xlib_swapper.c index c6c6dfc171..581f14097f 100644 --- a/src/modules/evas/engines/software_x11/evas_xlib_swapper.c +++ b/src/modules/evas/engines/software_x11/evas_xlib_swapper.c @@ -227,10 +227,12 @@ evas_xlib_swapper_free(X_Swapper *swp) } void * -evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl) +evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl, int *w, int *h) { swp->mapped = EINA_TRUE; if (bpl) *bpl = swp->buf[swp->buf_cur].bpl; + if (w) *w = swp->w; + if (h) *h = swp->h; return swp->buf[swp->buf_cur].data; } @@ -676,7 +678,7 @@ evas_xlib_swapper_free(X_Swapper *swp) } void * -evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl) +evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl, int *w, int *h) { unsigned int attach = DRI2BufferBackLeft; int num; @@ -766,6 +768,8 @@ evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl) } swp->w = swp->buf_w; swp->h = swp->buf_h; + if (w) *w = swp->w; + if (h) *h = swp->h; return swp->buf_data; } @@ -806,7 +810,7 @@ evas_xlib_swapper_buffer_state_get(X_Swapper *swp) { DRI2BufferFlags *flags; - if (!swp->mapped) evas_xlib_swapper_buffer_map(swp, NULL); + if (!swp->mapped) evas_xlib_swapper_buffer_map(swp, NULL, NULL, NULL); if (!swp->mapped) return MODE_FULL; flags = (DRI2BufferFlags *)(&(swp->buf->flags)); if (flags->data.idx_reuse != swp->last_count) @@ -906,7 +910,7 @@ evas_xlib_swapper_free(X_Swapper *swp EINA_UNUSED) } void * -evas_xlib_swapper_buffer_map(X_Swapper *swp EINA_UNUSED, int *bpl EINA_UNUSED) +evas_xlib_swapper_buffer_map(X_Swapper *swp EINA_UNUSED, int *bpl EINA_UNUSED, int *w EINA_UNUSED, int *h EINA_UNUSED) { return NULL; } diff --git a/src/modules/evas/engines/software_x11/evas_xlib_swapper.h b/src/modules/evas/engines/software_x11/evas_xlib_swapper.h index 5399b80fcb..043ee4167d 100644 --- a/src/modules/evas/engines/software_x11/evas_xlib_swapper.h +++ b/src/modules/evas/engines/software_x11/evas_xlib_swapper.h @@ -5,7 +5,7 @@ typedef struct _X_Swapper X_Swapper; X_Swapper *evas_xlib_swapper_new(Display *disp, Drawable draw, Visual *vis, int depth, int w, int h); void evas_xlib_swapper_free(X_Swapper *swp); -void *evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl); +void *evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl, int *w, int *h); void evas_xlib_swapper_buffer_unmap(X_Swapper *swp); void evas_xlib_swapper_swap(X_Swapper *swp, Eina_Rectangle *rects, int nrects); int evas_xlib_swapper_buffer_state_get(X_Swapper *swp);