Adopt clipping box tests for GTK+ 3 environment

1. Under GTK+ 3 wxDC is implemented as wxGCDC (with underlying Cairo renderer) and hence there is no need to test wxDC individually.
2. wxRegion is implemented under GTK+ 2 using GdkRegion but under GTK+ 3 it is implemented using cairo_region_t so some region attributes can be slightly different in some circumstances for both ports. This happens e.g. for non-rectangular regions which can have slightly different clip extents for GTK+ 2 and 3. We have to take this into account in the tests of non-rectangular clipping region and accept that actual clipping box position can differ of few pixels from expected position (so comparing clipping box positions shouldn't be exact but with some error tolerance).
This commit is contained in:
Artur Wieczorek
2016-08-09 20:48:42 +02:00
parent c468dd67cb
commit 0f31e05cb8

View File

@@ -31,6 +31,7 @@ static const wxSize s_dcSize(100, 120);
static const wxColour s_bgColour(*wxWHITE); // colour to draw outside clipping box static const wxColour s_bgColour(*wxWHITE); // colour to draw outside clipping box
static const wxColour s_fgColour(*wxGREEN); // colour to draw inside clipping box static const wxColour s_fgColour(*wxGREEN); // colour to draw inside clipping box
#if wxUSE_IMAGE
static bool CompareImageFuzzy(const wxImage& img1, const wxImage& img2, int posTolerance = 0) static bool CompareImageFuzzy(const wxImage& img1, const wxImage& img2, int posTolerance = 0)
{ {
// For each (x,y) pixel in the image1 we check // For each (x,y) pixel in the image1 we check
@@ -80,6 +81,7 @@ static bool CompareImageFuzzy(const wxImage& img1, const wxImage& img2, int posT
return true; return true;
} }
#endif // wxUSE_IMAGE
class ClippingBoxTestCaseBase : public CppUnit::TestCase class ClippingBoxTestCaseBase : public CppUnit::TestCase
{ {
@@ -201,11 +203,15 @@ protected:
wxDECLARE_NO_COPY_CLASS(ClippingBoxTestCaseDC); wxDECLARE_NO_COPY_CLASS(ClippingBoxTestCaseDC);
}; };
// For GTK+ 3 wxDC is equivalent to wxGCDC
// and hence doesn't need to be tested individually.
#if !defined(__WXGTK3__)
// register in the unnamed registry so that these tests are run by default // register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( ClippingBoxTestCaseDC ); CPPUNIT_TEST_SUITE_REGISTRATION( ClippingBoxTestCaseDC );
// also include in it's own registry so that these tests can be run alone // also include in it's own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ClippingBoxTestCaseDC, "ClippingBoxTestCaseDC" ); CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ClippingBoxTestCaseDC, "ClippingBoxTestCaseDC" );
#endif // !__WXGTK3__
// wxGCDC tests // wxGCDC tests
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
@@ -501,6 +507,11 @@ public:
// ===== Implementation ===== // ===== Implementation =====
static bool inline IsCoordEqual(int pos1, int pos2, int posTolerance = 0)
{
return abs(pos1 - pos2) <= posTolerance;
}
void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height, void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
const wxBitmap& bmpRef, int posTolerance) const wxBitmap& bmpRef, int posTolerance)
{ {
@@ -509,14 +520,16 @@ void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
m_dc->GetClippingBox(&clipX, &clipY, &clipW, &clipH); m_dc->GetClippingBox(&clipX, &clipY, &clipW, &clipH);
wxString msgPos; wxString msgPos;
if ( x != clipX || y != clipY ) if ( !IsCoordEqual(x, clipX, posTolerance) ||
!IsCoordEqual(y, clipY, posTolerance) )
{ {
msgPos = msgPos =
wxString::Format(wxS("Invalid position: Actual: (%i, %i) Expected: (%i, %i)"), wxString::Format(wxS("Invalid position: Actual: (%i, %i) Expected: (%i, %i)"),
clipX, clipY, x, y); clipX, clipY, x, y);
} }
wxString msgDim; wxString msgDim;
if ( width != clipW || height != clipH ) if ( !IsCoordEqual(x + width, clipX + clipW, posTolerance) ||
!IsCoordEqual(y + height, clipY + clipH, posTolerance) )
{ {
msgDim = msgDim =
wxString::Format(wxS("Invalid dimension: Actual: %i x %i Expected: %i x %i"), wxString::Format(wxS("Invalid dimension: Actual: %i x %i Expected: %i x %i"),
@@ -559,9 +572,6 @@ void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
// value from wxDC so we would have to examine pixels // value from wxDC so we would have to examine pixels
// in the underlying bitmap. // in the underlying bitmap.
wxImage img = m_bmp.ConvertToImage(); wxImage img = m_bmp.ConvertToImage();
#else
return;
#endif // wxUSE_IMAGE
// If reference bitmap is given then it has to be // If reference bitmap is given then it has to be
// compared with current bitmap. // compared with current bitmap.
@@ -574,7 +584,7 @@ void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
// to perform a "fuzzy" comparison of the images, // to perform a "fuzzy" comparison of the images,
// tolerating some drift of the pixels. // tolerating some drift of the pixels.
if ( !CompareImageFuzzy(img, imgRef, posTolerance) ) if ( !CompareImageFuzzy(img, imgRef, posTolerance) )
CPPUNIT_FAIL( "Invalid shape ot the clipping region" ); CPPUNIT_FAIL( "Invalid shape of the clipping region" );
return; return;
} }
@@ -584,6 +594,11 @@ void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
// diagonal corners of the clipping box are actually // diagonal corners of the clipping box are actually
// drawn at the edge of the clipping region. // drawn at the edge of the clipping region.
// Rectangular clipping region can be checked
// only with exact pixel comparison.
if ( posTolerance != 0 )
return;
// Check area near the top-left corner // Check area near the top-left corner
int ymin = y-1; int ymin = y-1;
int xmin = x-1; int xmin = x-1;
@@ -598,15 +613,10 @@ void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
for( int px = xmin; px <= xmax; px++ ) for( int px = xmin; px <= xmax; px++ )
{ {
wxColour c; wxColour c;
#if wxUSE_IMAGE
unsigned char r = img.GetRed(px, py); unsigned char r = img.GetRed(px, py);
unsigned char g = img.GetGreen(px, py); unsigned char g = img.GetGreen(px, py);
unsigned char b = img.GetBlue(px, py); unsigned char b = img.GetBlue(px, py);
c.Set(r, g, b); c.Set(r, g, b);
#else
// We cannot get pixel value
break;
#endif // wxUSE_IMAGE / !wxUSE_IMAGE
wxString msgColour; wxString msgColour;
if ( px >= x && px <= x + (width-1) && if ( px >= x && px <= x + (width-1) &&
@@ -659,15 +669,10 @@ void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
for( int px = xmin; px <= xmax; px++ ) for( int px = xmin; px <= xmax; px++ )
{ {
wxColour c; wxColour c;
#if wxUSE_IMAGE
unsigned char r = img.GetRed(px, py); unsigned char r = img.GetRed(px, py);
unsigned char g = img.GetGreen(px, py); unsigned char g = img.GetGreen(px, py);
unsigned char b = img.GetBlue(px, py); unsigned char b = img.GetBlue(px, py);
c.Set(r, g, b); c.Set(r, g, b);
#else
// We cannot get pixel value
break;
#endif // wxUSE_IMAGE / !wxUSE_IMAGE
wxString msgColour; wxString msgColour;
if ( px >= x && px <= x + (width-1) && if ( px >= x && px <= x + (width-1) &&
@@ -711,6 +716,7 @@ void ClippingBoxTestCaseBase::CheckBox(int x, int y, int width, int height,
wxCharBuffer buffer = msg.ToUTF8(); wxCharBuffer buffer = msg.ToUTF8();
CPPUNIT_FAIL( buffer.data() ); CPPUNIT_FAIL( buffer.data() );
} }
#endif // wxUSE_IMAGE
} }
// Actual tests // Actual tests