diff --git a/graphics/x11drv/dib.c b/graphics/x11drv/dib.c
index 943247d71f5d335ea36e4bd842777456b31ba3c4..e6281b3972c004b57c61177c260dfff9964622a0 100644
--- a/graphics/x11drv/dib.c
+++ b/graphics/x11drv/dib.c
@@ -2701,9 +2701,9 @@ int X11DRV_DIB_GetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr )
             return lines;
         }                                                                           }
 
-    XGetSubImage( display, descr->drawable, descr->xDest, descr->yDest,
-                  descr->width, descr->height, AllPlanes, ZPixmap,
-                  bmpImage, descr->xSrc, descr->ySrc );
+    XGetSubImage( display, descr->drawable, descr->xSrc, descr->ySrc,
+                  descr->width, lines, AllPlanes, ZPixmap,
+                  bmpImage, descr->xDest, descr->yDest );
 
       /* Transfer the pixels */
     switch(descr->infoBpp)
@@ -3013,13 +3013,21 @@ INT X11DRV_DIB_GetDIBits(
   descr.depth     = bmp->bitmap.bmBitsPixel;
   descr.drawable  = (Pixmap)bmp->physBitmap;
   descr.gc        = BITMAP_GC(bmp);
-  descr.xSrc      = 0;
-  descr.ySrc      = startscan;
-  descr.xDest     = 0;
-  descr.yDest     = 0;
   descr.width     = bmp->bitmap.bmWidth;
   descr.height    = bmp->bitmap.bmHeight;
   descr.colorMap  = info->bmiColors;
+  descr.xDest     = 0;
+  descr.yDest     = 0;
+  descr.xSrc      = 0;
+  
+  if (descr.lines > 0)
+  {
+     descr.ySrc = descr.height - startscan - 1;
+  }
+  else
+  {
+     descr.ySrc = startscan;
+  }
 
   if (dib)
     descr.useShm = (dib->shminfo.shmid != -1);