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;
+ }
+ }
}
}