swapper infra work - handle if buffer sizes dont match... :)
authorCarsten Haitzler <raster@rasterman.com>
Fri, 8 Feb 2013 07:23:31 +0000 (07:23 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Fri, 8 Feb 2013 07:23:31 +0000 (07:23 +0000)
SVN revision: 83764

src/modules/evas/engines/software_x11/evas_xlib_swapbuf.c
src/modules/evas/engines/software_x11/evas_xlib_swapper.c
src/modules/evas/engines/software_x11/evas_xlib_swapper.h

index fbf8b03..22c3bb7 100644 (file)
@@ -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;
index c6c6dfc..581f140 100644 (file)
@@ -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;
 }
index 5399b80..043ee41 100644 (file)
@@ -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);