Compare scaled images approximately in the unit tests.

Comparing them exactly results in tests failures when using compiler version
different from the one that was used to generate the test fails, see
http://thread.gmane.org/gmane.comp.lib.wxwidgets.devel/151149/focus=151154
and other messages in the same thread.
This commit is contained in:
Vadim Zeitlin 2015-04-12 22:56:24 +02:00
parent ca0c422964
commit 10a727bf1d

View File

@ -1340,6 +1340,39 @@ void ImageTestCase::BMPFlippingAndRLECompression()
}
static bool
CompareApprox(const wxImage& i1, const wxImage& i2)
{
if ( i1.GetWidth() != i2.GetWidth() )
return false;
if ( i1.GetHeight() != i2.GetHeight() )
return false;
const unsigned char* p1 = i1.GetData();
const unsigned char* p2 = i2.GetData();
const int numBytes = i1.GetWidth()*i1.GetHeight()*3;
for ( int n = 0; n < numBytes; n++, p1++, p2++ )
{
switch ( *p1 - *p2 )
{
case -1:
case 0:
case +1:
// Accept up to one pixel difference, this happens because of
// different rounding behaviours in different compiler versions
// even under the same architecture, see the example in
// http://thread.gmane.org/gmane.comp.lib.wxwidgets.devel/151149/focus=151154
break;
default:
return false;
}
}
return true;
}
// The 0 below can be replaced with 1 to generate, instead of comparing with,
// the test files.
#define ASSERT_IMAGE_EQUAL_TO_FILE(image, file) \
@ -1351,7 +1384,11 @@ void ImageTestCase::BMPFlippingAndRLECompression()
{ \
wxImage imageFromFile(file); \
CPPUNIT_ASSERT_MESSAGE( "Failed to load " file, imageFromFile.IsOk() ); \
CPPUNIT_ASSERT_EQUAL( imageFromFile, image ); \
CPPUNIT_ASSERT_MESSAGE \
( \
"Wrong scaled " + CppUnit::assertion_traits<wxImage>::toString(image), \
CompareApprox(imageFromFile, image) \
); \
}
void ImageTestCase::ScaleCompare()