Merge branch 'assert' of https://github.com/CendioOssman/tigervnc
diff --git a/common/rfb/PixelFormat.cxx b/common/rfb/PixelFormat.cxx
index 9ec6b46..76051dc 100644
--- a/common/rfb/PixelFormat.cxx
+++ b/common/rfb/PixelFormat.cxx
@@ -260,7 +260,7 @@
     }
   } else {
     // Generic code
-    int dstPad = (stride - w) * 4;
+    int dstPad = (stride - w) * bpp/8;
     while (h--) {
       int w_ = w;
       while (w_--) {
diff --git a/tests/conv.cxx b/tests/conv.cxx
index 22c86c4..2ee523a 100644
--- a/tests/conv.cxx
+++ b/tests/conv.cxx
@@ -26,6 +26,12 @@
 static const rdr::U8 pixelGreen = 0xc3;
 static const rdr::U8 pixelBlue = 0x97;
 
+static const int fbWidth = 40;
+static const int fbHeight = 30;
+static const int fbArea = fbWidth * fbHeight;
+// Maximum bpp, plus some room for unaligned fudging
+static const int fbMalloc = (fbArea * 4) + 4;
+
 typedef bool (*testfn) (const rfb::PixelFormat&, const rfb::PixelFormat&);
 
 struct TestEntry {
@@ -116,30 +122,46 @@
 static bool testBuffer(const rfb::PixelFormat &dstpf,
                        const rfb::PixelFormat &srcpf)
 {
-  int i, unaligned;
-  rdr::U8 bufIn[1024 + 1], bufOut[1024 + 1];
+  int i, x, y, unaligned;
+  rdr::U8 bufIn[fbMalloc], bufOut[fbMalloc];
 
   // Once aligned, and once unaligned
   for (unaligned = 0;unaligned < 2;unaligned++) {
-    for (i = 0;i < 1024/4;i++)
+    for (i = 0;i < fbArea;i++)
       makePixel(srcpf, bufIn + unaligned + i*srcpf.bpp/8);
 
     memset(bufOut, 0, sizeof(bufOut));
     dstpf.bufferFromBuffer(bufOut + unaligned, srcpf,
-                           bufIn + unaligned, 1024/4);
+                           bufIn + unaligned, fbArea);
 
-    for (i = 0;i < 1024/4;i++) {
+    for (i = 0;i < fbArea;i++) {
       if (!verifyPixel(dstpf, srcpf, bufOut + unaligned + i*dstpf.bpp/8))
         return false;
     }
 
+    memset(bufIn, 0, sizeof(bufIn));
+    for (y = 0;y < fbHeight;y++) {
+      for (x = 0;x < fbWidth/2;x++)
+        makePixel(srcpf, bufIn + unaligned + (x + y*fbWidth)*srcpf.bpp/8);
+    }
+
     memset(bufOut, 0, sizeof(bufOut));
     dstpf.bufferFromBuffer(bufOut + unaligned, srcpf, bufIn + unaligned,
-                           1024/4/10, 10, 1024/4/10, 1024/4/10);
+                           fbWidth/2, fbHeight, fbWidth, fbWidth);
 
-    for (i = 0;i < 1024/4/10*10;i++) {
-      if (!verifyPixel(dstpf, srcpf, bufOut + unaligned + i*dstpf.bpp/8))
-        return false;
+    for (y = 0;y < fbHeight;y++) {
+      for (x = 0;x < fbWidth;x++) {
+        if (x < fbWidth/2) {
+          if (!verifyPixel(dstpf, srcpf,
+                           bufOut + unaligned + (x + y*fbWidth)*dstpf.bpp/8))
+            return false;
+        } else {
+          const rdr::U8 zero[4] = { 0, 0, 0, 0 };
+          if (memcmp(bufOut + unaligned + (x + y*fbWidth)*dstpf.bpp/8, zero,
+                     dstpf.bpp/8) != 0)
+            return false;
+        }
+      }
     }
   }
 
@@ -149,36 +171,52 @@
 static bool testRGB(const rfb::PixelFormat &dstpf,
                     const rfb::PixelFormat &srcpf)
 {
-  int i, unaligned;
-  rdr::U8 bufIn[1024 + 1], bufRGB[1024 + 1], bufOut[1024 + 1];
+  int i, x, y, unaligned;
+  rdr::U8 bufIn[fbMalloc], bufRGB[fbMalloc], bufOut[fbMalloc];
 
   // Once aligned, and once unaligned
   for (unaligned = 0;unaligned < 2;unaligned++) {
-    for (i = 0;i < 1024/4;i++)
+    for (i = 0;i < fbArea;i++)
       makePixel(srcpf, bufIn + unaligned + i*srcpf.bpp/8);
 
     memset(bufRGB, 0, sizeof(bufRGB));
-    srcpf.rgbFromBuffer(bufRGB + unaligned, bufIn + unaligned, 1024/4);
+    srcpf.rgbFromBuffer(bufRGB + unaligned, bufIn + unaligned, fbArea);
 
     memset(bufOut, 0, sizeof(bufOut));
-    dstpf.bufferFromRGB(bufOut + unaligned, bufRGB + unaligned, 1024/4);
+    dstpf.bufferFromRGB(bufOut + unaligned, bufRGB + unaligned, fbArea);
 
-    for (i = 0;i < 1024/4;i++) {
+    for (i = 0;i < fbArea;i++) {
       if (!verifyPixel(dstpf, srcpf, bufOut + unaligned + i*dstpf.bpp/8))
         return false;
     }
 
+    memset(bufIn, 0, sizeof(bufIn));
+    for (y = 0;y < fbHeight;y++) {
+      for (x = 0;x < fbWidth/2;x++)
+        makePixel(srcpf, bufIn + unaligned + (x + y*fbWidth)*srcpf.bpp/8);
+    }
+
     memset(bufRGB, 0, sizeof(bufRGB));
     srcpf.rgbFromBuffer(bufRGB + unaligned, bufIn + unaligned,
-                        1024/4/10, 1024/4/10, 10);
+                        fbWidth/2, fbWidth, fbHeight);
 
     memset(bufOut, 0, sizeof(bufOut));
     dstpf.bufferFromRGB(bufOut + unaligned, bufRGB + unaligned,
-                        1024/4/10, 1024/4/10, 10);
+                        fbWidth/2, fbWidth, fbHeight);
 
-    for (i = 0;i < 1024/4/10*10;i++) {
-      if (!verifyPixel(dstpf, srcpf, bufOut + unaligned + i*dstpf.bpp/8))
-        return false;
+    for (y = 0;y < fbHeight;y++) {
+      for (x = 0;x < fbWidth;x++) {
+        if (x < fbWidth/2) {
+          if (!verifyPixel(dstpf, srcpf,
+                           bufOut + unaligned + (x + y*fbWidth)*dstpf.bpp/8))
+            return false;
+        } else {
+          const rdr::U8 zero[4] = { 0, 0, 0, 0 };
+          if (memcmp(bufOut + unaligned + (x + y*fbWidth)*dstpf.bpp/8, zero,
+                     dstpf.bpp/8) != 0)
+            return false;
+        }
+      }
     }
   }