diff --git a/tests/graphics/imagelist.cpp b/tests/graphics/imagelist.cpp index e58770b335..b4856878c5 100644 --- a/tests/graphics/imagelist.cpp +++ b/tests/graphics/imagelist.cpp @@ -750,3 +750,225 @@ TEST_CASE("ImageList:NegativeTests", "[imagelist][negative]") CHECK(il.GetImageCount() == 1); } } + +TEST_CASE("ImageList:HiDPI", "[imagelist][hidpi]") +{ +#if defined(__WXMSW__) || ( defined(__WXGTK20__) && !defined(__WXGTK3__) ) + + WARN("Skipping HiDPI image tests known not to work in wxMSW and wxGTK2."); +#else + wxImage img(16, 8); + img.SetRGB(wxRect(0, 0, 16, 8), 255, 128, 64); + REQUIRE(img.IsOk()); + + wxBitmap bmp1x(img, -1, 1.0); + REQUIRE(bmp1x.IsOk()); + CHECK(bmp1x.GetWidth() == 16); + CHECK(bmp1x.GetHeight() == 8); + CHECK(bmp1x.GetScaledWidth() == 16); + CHECK(bmp1x.GetScaledHeight() == 8); + CHECK_FALSE(bmp1x.HasAlpha()); + CHECK(bmp1x.GetMask() == NULL); + + wxBitmap bmp2x(img, -1, 2.0); + REQUIRE(bmp2x.IsOk()); + CHECK(bmp2x.GetWidth() == 16); + CHECK(bmp2x.GetHeight() == 8); + CHECK(bmp2x.GetScaledWidth() == 8); + CHECK(bmp2x.GetScaledHeight() == 4); + CHECK_FALSE(bmp2x.HasAlpha()); + CHECK(bmp2x.GetMask() == NULL); + + SECTION("Add images 2x to the list 2x") + { + // Logical image size + wxImageList il(8, 4, false); + + int idx = il.Add(bmp2x); + CHECK(idx == 0); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp1x); + CHECK(idx == -1); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp2x); + CHECK(idx == 1); + CHECK(il.GetImageCount() == 2); + + idx = il.Add(bmp1x); + CHECK(idx == -1); + CHECK(il.GetImageCount() == 2); + + wxBitmap bmp = il.GetBitmap(1); + CHECK(bmp.IsOk() == true); + CHECK(bmp.GetScaleFactor() == 2.0); + CHECK(bmp.GetScaledWidth() == 8); + CHECK(bmp.GetScaledHeight() == 4); + CHECK(bmp.GetWidth() == 16); + CHECK(bmp.GetHeight() == 8); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); + } + + SECTION("Add images 2x to the list 1x") + { + // Logical image size + wxImageList il(16, 8, false); + + int idx = il.Add(bmp1x); + CHECK(idx == 0); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp2x); + CHECK(idx == -1); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp1x); + CHECK(idx == 1); + CHECK(il.GetImageCount() == 2); + + idx = il.Add(bmp2x); + CHECK(idx == -1); + CHECK(il.GetImageCount() == 2); + + wxBitmap bmp = il.GetBitmap(1); + CHECK(bmp.IsOk() == true); + CHECK(bmp.GetScaleFactor() == 1.0); + CHECK(bmp.GetScaledWidth() == 16); + CHECK(bmp.GetScaledHeight() == 8); + CHECK(bmp.GetWidth() == 16); + CHECK(bmp.GetHeight() == 8); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); + } + + SECTION("Replaces images in the list 2x") + { + // Logical image size + wxImageList il(8, 4, false); + + int idx = il.Add(bmp2x); + CHECK(idx == 0); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp2x); + CHECK(idx == 1); + CHECK(il.GetImageCount() == 2); + + bool ok = il.Replace(1, bmp1x); + CHECK_FALSE(ok); + CHECK(il.GetImageCount() == 2); + + ok = il.Replace(0, bmp2x); + CHECK(ok == true); + CHECK(il.GetImageCount() == 2); + + wxBitmap bmp = il.GetBitmap(0); + CHECK(bmp.IsOk() == true); + CHECK(bmp.GetScaleFactor() == 2.0); + CHECK(bmp.GetScaledWidth() == 8); + CHECK(bmp.GetScaledHeight() == 4); + CHECK(bmp.GetWidth() == 16); + CHECK(bmp.GetHeight() == 8); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); + } + + SECTION("Replaces images in the list 1x") + { + // Logical image size + wxImageList il(16, 8, false); + + int idx = il.Add(bmp1x); + CHECK(idx == 0); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp1x); + CHECK(idx == 1); + CHECK(il.GetImageCount() == 2); + + bool ok = il.Replace(1, bmp2x); + CHECK_FALSE(ok); + CHECK(il.GetImageCount() == 2); + + ok = il.Replace(0, bmp1x); + CHECK(ok == true); + CHECK(il.GetImageCount() == 2); + + wxBitmap bmp = il.GetBitmap(0); + CHECK(bmp.GetScaleFactor() == 1.0); + CHECK(bmp.GetScaledWidth() == 16); + CHECK(bmp.GetScaledHeight() == 8); + CHECK(bmp.GetWidth() == 16); + CHECK(bmp.GetHeight() == 8); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); + } + + SECTION("Changes list 1x to 2x") + { + wxImage img2(32, 16); + img2.SetRGB(wxRect(0, 0, 32, 16), 255, 128, 64); + REQUIRE(img2.IsOk()); + + wxBitmap bmp2x2(img2, -1, 2.0); + REQUIRE(bmp2x2.IsOk()); + CHECK(bmp2x2.GetWidth() == 32); + CHECK(bmp2x2.GetHeight() == 16); + CHECK(bmp2x2.GetScaledWidth() == 16); + CHECK(bmp2x2.GetScaledHeight() == 8); + CHECK(bmp2x2.HasAlpha() == false); + CHECK(bmp2x2.GetMask() == NULL); + + // Logical image size + wxImageList il(16, 8, false); + + // Now it should be the list with 1x images + int idx = il.Add(bmp1x); + CHECK(idx == 0); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp1x); + CHECK(idx == 1); + CHECK(il.GetImageCount() == 2); + + idx = il.Add(bmp2x2); + CHECK(idx == -1); + CHECK(il.GetImageCount() == 2); + + wxBitmap bmp = il.GetBitmap(0); + CHECK(bmp.GetScaleFactor() == 1.0); + CHECK(bmp.GetScaledWidth() == 16); + CHECK(bmp.GetScaledHeight() == 8); + CHECK(bmp.GetWidth() == 16); + CHECK(bmp.GetHeight() == 8); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); + + il.RemoveAll(); + + // Now it should be the list with 2x images (the same logical size 16x8) + idx = il.Add(bmp2x2); + CHECK(idx == 0); + CHECK(il.GetImageCount() == 1); + + idx = il.Add(bmp2x2); + CHECK(idx == 1); + CHECK(il.GetImageCount() == 2); + + idx = il.Add(bmp1x); + CHECK(idx == -1); + CHECK(il.GetImageCount() == 2); + + bmp = il.GetBitmap(0); + CHECK(bmp.GetScaleFactor() == 2.0); + CHECK(bmp.GetScaledWidth() == 16); + CHECK(bmp.GetScaledHeight() == 8); + CHECK(bmp.GetWidth() == 32); + CHECK(bmp.GetHeight() == 16); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); + } +#endif // !__WXMSW__ +}