summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2015-07-13 15:38:09 +0100
committerMarco Cecchetti <marco.cecchetti@collabora.com>2015-08-31 19:31:16 +0200
commit45997fea99a77063ba25f00d44b8ceefc71305e2 (patch)
tree6238c6b43be998fcb5136d05a37c3a55b3b518d8
parent6da38c34d5a720f5ab801273b0b801f83ae3edb0 (diff)
Change-Id: Ic75801d7ad941ba802ffe418d5c666b1e7b0e94f
-rw-r--r--vcl/qa/cppunit/BitmapTest.cxx56
1 files changed, 56 insertions, 0 deletions
diff --git a/vcl/qa/cppunit/BitmapTest.cxx b/vcl/qa/cppunit/BitmapTest.cxx
index 306b0dfdbc2d..b5c121ac8f34 100644
--- a/vcl/qa/cppunit/BitmapTest.cxx
+++ b/vcl/qa/cppunit/BitmapTest.cxx
@@ -12,9 +12,13 @@
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
+#include <unordered_map>
+
#include <vcl/bitmap.hxx>
#include <vcl/bmpacc.hxx>
+#include <vcl/virdev.hxx>
+#include <rtl/strbuf.hxx>
#include <tools/stream.hxx>
#include <vcl/graphicfilter.hxx>
@@ -27,10 +31,12 @@ class BitmapTest : public CppUnit::TestFixture
{
void testConvert();
void testScale();
+ void testCRC();
CPPUNIT_TEST_SUITE(BitmapTest);
CPPUNIT_TEST(testConvert);
CPPUNIT_TEST(testScale);
+ CPPUNIT_TEST(testCRC);
CPPUNIT_TEST_SUITE_END();
};
@@ -129,6 +135,56 @@ void BitmapTest::testScale()
}
}
+typedef std::unordered_map<sal_uInt64, const char *> CRCHash;
+
+void checkAndInsert(CRCHash &rHash, sal_uInt64 nCRC, const char *pLocation)
+{
+ auto it = rHash.find(nCRC);
+ if (it != rHash.end()) {
+ OStringBuffer aBuf("CRC collision between ");
+ aBuf.append(pLocation);
+ aBuf.append(" and ");
+ aBuf.append(it->second);
+ aBuf.append(" hash is 0x");
+ aBuf.append((sal_Int64)nCRC, 16);
+ CPPUNIT_FAIL(aBuf.toString().getStr());
+ }
+ rHash[nCRC] = pLocation;
+}
+
+void checkAndInsert(CRCHash &rHash, Bitmap rBmp, const char *pLocation)
+{
+ checkAndInsert(rHash, rBmp.GetChecksum(), pLocation);
+}
+
+Bitmap getAsBitmap(VclPtr<OutputDevice> pOut)
+{
+ return pOut->GetBitmap(Point(), pOut->GetOutputSizePixel());
+}
+
+void BitmapTest::testCRC()
+{
+ CRCHash aCRCs;
+
+ Bitmap aBitmap(Size(1023,759), 24, 0);
+ aBitmap.Erase(COL_BLACK);
+ checkAndInsert(aCRCs, aBitmap, "black bitmap");
+ aBitmap.Invert();
+ checkAndInsert(aCRCs, aBitmap, "white bitmap");
+
+ ScopedVclPtrInstance<VirtualDevice> aVDev;
+ aVDev->SetOutputSizePixel(Size(1023, 759));
+ Bitmap aWhiteCheck = getAsBitmap(aVDev);
+ CPPUNIT_ASSERT(aCRCs.find(aWhiteCheck.GetChecksum()) != aCRCs.end());
+
+ // a 1x1 black & white checkerboard
+ aVDev->DrawCheckered(Point(), aVDev->GetOutputSizePixel(), 1, 1);
+ Bitmap aChecker = getAsBitmap(aVDev);
+ checkAndInsert(aCRCs, aChecker, "checkerboard");
+ aChecker.Invert();
+ checkAndInsert(aCRCs, aChecker, "inverted checkerboard");
+}
+
} // namespace
CPPUNIT_TEST_SUITE_REGISTRATION(BitmapTest);