From: Vadim Zeitlin Date: Sun, 30 Aug 2009 21:43:11 +0000 (+0000) Subject: Correct wxImage::Size() again; add unit tests for it. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2e51fb3041e78ef15506ed746ed5898536be5955 Correct wxImage::Size() again; add unit tests for it. wxImage::Size() didn't handle the paste position correctly. Closes #7874. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61792 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 98749bb661..ad36dd94bb 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -373,6 +373,7 @@ All: * SetThreadActiveTarget() allows to set up thread-specific log targets. - Fix output buffer overflow in wxBase64Decode() (Eric W. Savage). - Added bilinear image resizing algorithm to wxImage (bishop). +- Fix bug with position argument in wxImage::Size() (Byron Sorgdrager). All (GUI): diff --git a/src/common/image.cpp b/src/common/image.cpp index 1c527ca0d7..ce383eff93 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -1279,21 +1279,30 @@ wxImage wxImage::Size( const wxSize& size, const wxPoint& pos, image.SetRGB(wxRect(), r, g, b); - wxRect subRect(pos.x, pos.y, width, height); - wxRect finalRect(0, 0, size.GetWidth(), size.GetHeight()); - if (pos.x < 0) - finalRect.width -= pos.x; - if (pos.y < 0) - finalRect.height -= pos.y; + // we have two coordinate systems: + // source: starting at 0,0 of source image + // destination starting at 0,0 of destination image + // Documentation says: + // "The image is pasted into a new image [...] at the position pos relative + // to the upper left of the new image." this means the transition rule is: + // "dest coord" = "source coord" + pos; - subRect.Intersect(finalRect); + // calculate the intersection using source coordinates: + wxRect srcRect(0, 0, width, height); + wxRect dstRect(-pos, size); - if (!subRect.IsEmpty()) + srcRect.Intersect(dstRect); + + if (!srcRect.IsEmpty()) { - if ((subRect.GetWidth() == width) && (subRect.GetHeight() == height)) - image.Paste(*this, pos.x, pos.y); + // insertion point is needed in destination coordinates. + // NB: it is not always "pos"! + wxPoint ptInsert = srcRect.GetTopLeft() + pos; + + if ((srcRect.GetWidth() == width) && (srcRect.GetHeight() == height)) + image.Paste(*this, ptInsert.x, ptInsert.y); else - image.Paste(GetSubImage(subRect), pos.x, pos.y); + image.Paste(GetSubImage(srcRect), ptInsert.x, ptInsert.y); } return image; diff --git a/tests/image/image.cpp b/tests/image/image.cpp index f05707927c..6ad9c6f7fd 100644 --- a/tests/image/image.cpp +++ b/tests/image/image.cpp @@ -63,11 +63,13 @@ private: CPPUNIT_TEST( LoadFromSocketStream ); CPPUNIT_TEST( LoadFromZipStream ); CPPUNIT_TEST( LoadFromFile ); + CPPUNIT_TEST( SizeImage ); CPPUNIT_TEST_SUITE_END(); void LoadFromSocketStream(); void LoadFromZipStream(); void LoadFromFile(); + void SizeImage(); DECLARE_NO_COPY_CLASS(ImageTestCase) }; @@ -190,6 +192,624 @@ void ImageTestCase::LoadFromZipStream() } } +void ImageTestCase::SizeImage() +{ + // Test the wxImage::Size() function which takes a rectangle from source and + // places it in a new image at a given position. This test checks, if the + // correct areas are chosen, and clipping is done correctly. + + // our test image: + static const char * xpm_orig[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .....", + " ++++@@@@.", + " +... @.", + " +.@@++ @.", + " +.@ .+ @.", + ".@ +. @.+ ", + ".@ ++@@.+ ", + ".@ ...+ ", + ".@@@@++++ ", + "..... " + }; + // the expected results for all tests: + static const char * xpm_l_t[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "... @.BB", + ".@@++ @.BB", + ".@ .+ @.BB", + " +. @.+ BB", + " ++@@.+ BB", + " ...+ BB", + "@@@++++ BB", + "... BB", + "BBBBBBBBBB", + "BBBBBBBBBB" + }; + static const char * xpm_t[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " +... @.", + " +.@@++ @.", + " +.@ .+ @.", + ".@ +. @.+ ", + ".@ ++@@.+ ", + ".@ ...+ ", + ".@@@@++++ ", + "..... ", + "BBBBBBBBBB", + "BBBBBBBBBB" + }; + static const char * xpm_r_t[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BB +... ", + "BB +.@@++ ", + "BB +.@ .+ ", + "BB.@ +. @.", + "BB.@ ++@@.", + "BB.@ ...", + "BB.@@@@+++", + "BB..... ", + "BBBBBBBBBB", + "BBBBBBBBBB" + }; + static const char * xpm_l[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .....BB", + "+++@@@@.BB", + "... @.BB", + ".@@++ @.BB", + ".@ .+ @.BB", + " +. @.+ BB", + " ++@@.+ BB", + " ...+ BB", + "@@@++++ BB", + "... BB" + }; + static const char * xpm_r[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BB ...", + "BB ++++@@@", + "BB +... ", + "BB +.@@++ ", + "BB +.@ .+ ", + "BB.@ +. @.", + "BB.@ ++@@.", + "BB.@ ...", + "BB.@@@@+++", + "BB..... " + }; + static const char * xpm_l_b[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBB", + "BBBBBBBBBB", + " .....BB", + "+++@@@@.BB", + "... @.BB", + ".@@++ @.BB", + ".@ .+ @.BB", + " +. @.+ BB", + " ++@@.+ BB", + " ...+ BB" + }; + static const char * xpm_b[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBB", + "BBBBBBBBBB", + " .....", + " ++++@@@@.", + " +... @.", + " +.@@++ @.", + " +.@ .+ @.", + ".@ +. @.+ ", + ".@ ++@@.+ ", + ".@ ...+ " + }; + static const char * xpm_r_b[] = { + "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBB", + "BBBBBBBBBB", + "BB ...", + "BB ++++@@@", + "BB +... ", + "BB +.@@++ ", + "BB +.@ .+ ", + "BB.@ +. @.", + "BB.@ ++@@.", + "BB.@ ..." + }; + static const char * xpm_sm[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .....", + " ++++@@@", + " +... ", + " +.@@++ ", + " +.@ .+ ", + ".@ +. @.", + ".@ ++@@.", + ".@ ..." + }; + static const char * xpm_gt[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .....BB", + " ++++@@@@.BB", + " +... @.BB", + " +.@@++ @.BB", + " +.@ .+ @.BB", + ".@ +. @.+ BB", + ".@ ++@@.+ BB", + ".@ ...+ BB", + ".@@@@++++ BB", + "..... BB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_l_t[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "... @.BBBB", + ".@@++ @.BBBB", + ".@ .+ @.BBBB", + " +. @.+ BBBB", + " ++@@.+ BBBB", + " ...+ BBBB", + "@@@++++ BBBB", + "... BBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_l[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .....BBBB", + "+++@@@@.BBBB", + "... @.BBBB", + ".@@++ @.BBBB", + ".@ .+ @.BBBB", + " +. @.+ BBBB", + " ++@@.+ BBBB", + " ...+ BBBB", + "@@@++++ BBBB", + "... BBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_l_b[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + " .....BBBB", + "+++@@@@.BBBB", + "... @.BBBB", + ".@@++ @.BBBB", + ".@ .+ @.BBBB", + " +. @.+ BBBB", + " ++@@.+ BBBB", + " ...+ BBBB", + "@@@++++ BBBB", + "... BBBB" + }; + static const char * xpm_gt_l_bb[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + " .....BBBB", + "+++@@@@.BBBB", + "... @.BBBB", + ".@@++ @.BBBB", + ".@ .+ @.BBBB", + " +. @.+ BBBB", + " ++@@.+ BBBB", + " ...+ BBBB" + }; + static const char * xpm_gt_t[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " +... @.BB", + " +.@@++ @.BB", + " +.@ .+ @.BB", + ".@ +. @.+ BB", + ".@ ++@@.+ BB", + ".@ ...+ BB", + ".@@@@++++ BB", + "..... BB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_b[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + " .....BB", + " ++++@@@@.BB", + " +... @.BB", + " +.@@++ @.BB", + " +.@ .+ @.BB", + ".@ +. @.+ BB", + ".@ ++@@.+ BB", + ".@ ...+ BB", + ".@@@@++++ BB", + "..... BB" + }; + static const char * xpm_gt_bb[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + " .....BB", + " ++++@@@@.BB", + " +... @.BB", + " +.@@++ @.BB", + " +.@ .+ @.BB", + ".@ +. @.+ BB", + ".@ ++@@.+ BB", + ".@ ...+ BB" + }; + static const char * xpm_gt_r_t[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BB +... @.", + "BB +.@@++ @.", + "BB +.@ .+ @.", + "BB.@ +. @.+ ", + "BB.@ ++@@.+ ", + "BB.@ ...+ ", + "BB.@@@@++++ ", + "BB..... ", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_r[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BB .....", + "BB ++++@@@@.", + "BB +... @.", + "BB +.@@++ @.", + "BB +.@ .+ @.", + "BB.@ +. @.+ ", + "BB.@ ++@@.+ ", + "BB.@ ...+ ", + "BB.@@@@++++ ", + "BB..... ", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_r_b[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BB .....", + "BB ++++@@@@.", + "BB +... @.", + "BB +.@@++ @.", + "BB +.@ .+ @.", + "BB.@ +. @.+ ", + "BB.@ ++@@.+ ", + "BB.@ ...+ ", + "BB.@@@@++++ ", + "BB..... " + }; + static const char * xpm_gt_r_bb[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BB .....", + "BB ++++@@@@.", + "BB +... @.", + "BB +.@@++ @.", + "BB +.@ .+ @.", + "BB.@ +. @.+ ", + "BB.@ ++@@.+ ", + "BB.@ ...+ " + }; + static const char * xpm_gt_rr_t[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBB +... ", + "BBBB +.@@++ ", + "BBBB +.@ .+ ", + "BBBB.@ +. @.", + "BBBB.@ ++@@.", + "BBBB.@ ...", + "BBBB.@@@@+++", + "BBBB..... ", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_rr[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBB ...", + "BBBB ++++@@@", + "BBBB +... ", + "BBBB +.@@++ ", + "BBBB +.@ .+ ", + "BBBB.@ +. @.", + "BBBB.@ ++@@.", + "BBBB.@ ...", + "BBBB.@@@@+++", + "BBBB..... ", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB" + }; + static const char * xpm_gt_rr_b[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBB ...", + "BBBB ++++@@@", + "BBBB +... ", + "BBBB +.@@++ ", + "BBBB +.@ .+ ", + "BBBB.@ +. @.", + "BBBB.@ ++@@.", + "BBBB.@ ...", + "BBBB.@@@@+++", + "BBBB..... " + }; + static const char * xpm_gt_rr_bb[] = { + "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBBBBBBBBBB", + "BBBB ...", + "BBBB ++++@@@", + "BBBB +... ", + "BBBB +.@@++ ", + "BBBB +.@ .+ ", + "BBBB.@ +. @.", + "BBBB.@ ++@@.", + "BBBB.@ ..." + }; + static const char * xpm_sm_ll_tt[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .+ @.BB", + ". @.+ BB", + "+@@.+ BB", + " ...+ BB", + "@++++ BB", + ". BB", + "BBBBBBBB", + "BBBBBBBB" + }; + static const char * xpm_sm_ll_t[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + ". @.BB", + "@++ @.BB", + " .+ @.BB", + ". @.+ BB", + "+@@.+ BB", + " ...+ BB", + "@++++ BB", + ". BB" + }; + static const char * xpm_sm_ll[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .....BB", + "+@@@@.BB", + ". @.BB", + "@++ @.BB", + " .+ @.BB", + ". @.+ BB", + "+@@.+ BB", + " ...+ BB" + }; + static const char * xpm_sm_ll_b[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBB", + "BBBBBBBB", + " .....BB", + "+@@@@.BB", + ". @.BB", + "@++ @.BB", + " .+ @.BB", + ". @.+ BB" + }; + static const char * xpm_sm_l_tt[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + ".@ .+ @.", + " +. @.+ ", + " ++@@.+ ", + " ...+ ", + "@@@++++ ", + "... ", + "BBBBBBBB", + "BBBBBBBB" + }; + static const char * xpm_sm_l_t[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "... @.", + ".@@++ @.", + ".@ .+ @.", + " +. @.+ ", + " ++@@.+ ", + " ...+ ", + "@@@++++ ", + "... " + }; + static const char * xpm_sm_l[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " .....", + "+++@@@@.", + "... @.", + ".@@++ @.", + ".@ .+ @.", + " +. @.+ ", + " ++@@.+ ", + " ...+ " + }; + static const char * xpm_sm_l_b[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBB", + "BBBBBBBB", + " .....", + "+++@@@@.", + "... @.", + ".@@++ @.", + ".@ .+ @.", + " +. @.+ " + }; + static const char * xpm_sm_tt[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " +.@ .+ ", + ".@ +. @.", + ".@ ++@@.", + ".@ ...", + ".@@@@+++", + "..... ", + "BBBBBBBB", + "BBBBBBBB" + }; + static const char * xpm_sm_t[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + " +... ", + " +.@@++ ", + " +.@ .+ ", + ".@ +. @.", + ".@ ++@@.", + ".@ ...", + ".@@@@+++", + "..... " + }; + static const char * xpm_sm_b[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBB", + "BBBBBBBB", + " ...", + " ++++@@@", + " +... ", + " +.@@++ ", + " +.@ .+ ", + ".@ +. @." + }; + static const char * xpm_sm_r_tt[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BB +.@ .", + "BB.@ +. ", + "BB.@ ++@", + "BB.@ .", + "BB.@@@@+", + "BB..... ", + "BBBBBBBB", + "BBBBBBBB" + }; + static const char * xpm_sm_r_t[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BB +... ", + "BB +.@@+", + "BB +.@ .", + "BB.@ +. ", + "BB.@ ++@", + "BB.@ .", + "BB.@@@@+", + "BB..... " + }; + static const char * xpm_sm_r[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BB .", + "BB ++++@", + "BB +... ", + "BB +.@@+", + "BB +.@ .", + "BB.@ +. ", + "BB.@ ++@", + "BB.@ ." + }; + static const char * xpm_sm_r_b[] = { + "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000", + "BBBBBBBB", + "BBBBBBBB", + "BB .", + "BB ++++@", + "BB +... ", + "BB +.@@+", + "BB +.@ .", + "BB.@ +. " + }; + + // this table defines all tests + struct SizeTestData + { + int w, h, dx, dy; // first parameters for Size() + const char **ref_xpm; // expected result + } sizeTestData[] = + { + { 10, 10, 0, 0, xpm_orig}, // same size, same position + { 12, 12, 0, 0, xpm_gt}, // target larger, same position + { 8, 8, 0, 0, xpm_sm}, // target smaller, same position + { 10, 10, -2, -2, xpm_l_t}, // same size, move left up + { 10, 10, -2, 0, xpm_l}, // same size, move left + { 10, 10, -2, 2, xpm_l_b}, // same size, move left down + { 10, 10, 0, -2, xpm_t}, // same size, move up + { 10, 10, 0, 2, xpm_b}, // same size, move down + { 10, 10, 2, -2, xpm_r_t}, // same size, move right up + { 10, 10, 2, 0, xpm_r}, // same size, move right + { 10, 10, 2, 2, xpm_r_b}, // same size, move right down + { 12, 12, -2, -2, xpm_gt_l_t}, // target larger, move left up + { 12, 12, -2, 0, xpm_gt_l}, // target larger, move left + { 12, 12, -2, 2, xpm_gt_l_b}, // target larger, move left down + { 12, 12, -2, 4, xpm_gt_l_bb}, // target larger, move left down + { 12, 12, 0, -2, xpm_gt_t}, // target larger, move up + { 12, 12, 0, 2, xpm_gt_b}, // target larger, move down + { 12, 12, 0, 4, xpm_gt_bb}, // target larger, move down + { 12, 12, 2, -2, xpm_gt_r_t}, // target larger, move right up + { 12, 12, 2, 0, xpm_gt_r}, // target larger, move right + { 12, 12, 2, 2, xpm_gt_r_b}, // target larger, move right down + { 12, 12, 2, 4, xpm_gt_r_bb}, // target larger, move right down + { 12, 12, 4, -2, xpm_gt_rr_t}, // target larger, move right up + { 12, 12, 4, 0, xpm_gt_rr}, // target larger, move right + { 12, 12, 4, 2, xpm_gt_rr_b}, // target larger, move right down + { 12, 12, 4, 4, xpm_gt_rr_bb}, // target larger, move right down + { 8, 8, -4, -4, xpm_sm_ll_tt}, // target smaller, move left up + { 8, 8, -4, -2, xpm_sm_ll_t}, // target smaller, move left up + { 8, 8, -4, 0, xpm_sm_ll}, // target smaller, move left + { 8, 8, -4, 2, xpm_sm_ll_b}, // target smaller, move left down + { 8, 8, -2, -4, xpm_sm_l_tt}, // target smaller, move left up + { 8, 8, -2, -2, xpm_sm_l_t}, // target smaller, move left up + { 8, 8, -2, 0, xpm_sm_l}, // target smaller, move left + { 8, 8, -2, 2, xpm_sm_l_b}, // target smaller, move left down + { 8, 8, 0, -4, xpm_sm_tt}, // target smaller, move up + { 8, 8, 0, -2, xpm_sm_t}, // target smaller, move up + { 8, 8, 0, 2, xpm_sm_b}, // target smaller, move down + { 8, 8, 2, -4, xpm_sm_r_tt}, // target smaller, move right up + { 8, 8, 2, -2, xpm_sm_r_t}, // target smaller, move right up + { 8, 8, 2, 0, xpm_sm_r}, // target smaller, move right + { 8, 8, 2, 2, xpm_sm_r_b}, // target smaller, move right down + }; + + const wxImage src_img(xpm_orig); + for ( unsigned i = 0; i < WXSIZEOF(sizeTestData); i++ ) + { + SizeTestData& st = sizeTestData[i]; + wxImage + actual(src_img.Size(wxSize(st.w, st.h), wxPoint(st.dx, st.dy), 0, 0, 0)), + expected(st.ref_xpm); + + // to check results with an image viewer uncomment this: + //actual.SaveFile(wxString::Format("imagetest-%02d-actual.png", i), wxBITMAP_TYPE_PNG); + //expected.SaveFile(wxString::Format("imagetest-%02d-exp.png", i), wxBITMAP_TYPE_PNG); + + CPPUNIT_ASSERT_EQUAL( actual.GetSize().x, expected.GetSize().x ); + CPPUNIT_ASSERT_EQUAL( actual.GetSize().y, expected.GetSize().y ); + + const unsigned data_len = 3 * expected.GetHeight() * expected.GetWidth(); + + WX_ASSERT_MESSAGE + ( + ("Resize test #%u: (%d, %d), (%d, %d)", i, st.w, st.h, st.dx, st.dy), + memcmp(actual.GetData(), expected.GetData(), data_len) == 0 + ); + } +} + + /* TODO: add lots of more tests to wxImage functions */