wxWidgets/tests/graphics/imagelist.cpp
Vadim Zeitlin cc02b3cece Revert "Assure that all images in the generic wxImageList have the same scale factor"
This reverts commit b6d305e4f2 because
silently discarding images using a different scale factor is simply too
user-unfriendly: this can silently break the existing code, i.e. it can
still compile perfectly and not give any errors during run-time but not
show any images neither.

Also revert most of dc43d15cf7 (Add tests of storing HiDPI images in
generic wxImageList (wxOSX, wxGTK3), 2021-04-05) as these tests don't
pass any longer because the behaviour was intentionally changed.

See #22189.
2022-03-22 23:01:40 +01:00

809 lines
23 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/graphics/imagelist.cpp
// Purpose: image list unit tests
// Author: Artur Wieczorek
// Created: 2021-01-11
// Copyright: (c) 2021 wxWidgets development team
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#include "wx/bitmap.h"
#include "wx/graphics.h"
#include "wx/icon.h"
#include "wx/imaglist.h"
#include "wx/dcmemory.h"
// ----------------------------------------------------------------------------
// tests
// ----------------------------------------------------------------------------
TEST_CASE("ImageList:WithMask", "[imagelist][withmask]")
{
wxInitAllImageHandlers();
wxBitmap bmpRGB(32, 32, 24);
{
wxMemoryDC mdc(bmpRGB);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
mdc.SetBrush(*wxRED_BRUSH);
mdc.DrawRectangle(4, 4, 24, 24);
}
REQUIRE(bmpRGB.IsOk());
wxBitmap bmpRGBA;
bmpRGBA.LoadFile("image/wx.png", wxBITMAP_TYPE_PNG);
REQUIRE(bmpRGBA.IsOk());
wxBitmap bmpMask(32, 32, 1);
{
wxMemoryDC mdc(bmpMask);
#if wxUSE_GRAPHICS_CONTEXT
wxGraphicsContext* gc = mdc.GetGraphicsContext();
if ( gc )
gc->SetAntialiasMode(wxANTIALIAS_NONE);
#endif //wxUSE_GRAPHICS_CONTEXT
mdc.SetBackground(*wxBLACK_BRUSH);
mdc.Clear();
mdc.SetBrush(*wxWHITE_BRUSH);
mdc.DrawRectangle(0, 0, 16, 32);
}
wxBitmap bmpRGBWithMask(bmpRGB);
bmpRGBWithMask.SetMask(new wxMask(bmpMask));
REQUIRE(bmpRGBWithMask.IsOk());
wxBitmap bmpRGBAWithMask(bmpRGBA);
bmpRGBAWithMask.SetMask(new wxMask(bmpMask));
REQUIRE(bmpRGBAWithMask.IsOk());
wxIcon ico;
ico.LoadFile("image/wx.ico", wxBITMAP_TYPE_ICO);
REQUIRE(ico.IsOk());
REQUIRE(bmpRGB.HasAlpha() == false);
REQUIRE(bmpRGB.GetMask() == NULL);
REQUIRE(bmpRGBWithMask.HasAlpha() == false);
REQUIRE(bmpRGBWithMask.GetMask() != NULL);
REQUIRE(bmpRGBA.HasAlpha() == true);
REQUIRE(bmpRGBA.GetMask() == NULL);
REQUIRE(bmpRGBAWithMask.HasAlpha() == true);
REQUIRE(bmpRGBAWithMask.GetMask() != NULL);
wxImageList il(32, 32, true);
SECTION("Add RGB image to list")
{
il.RemoveAll();
int idx = il.Add(bmpRGB);
CHECK(il.GetImageCount() == 1);
wxBitmap bmp1 = il.GetBitmap(idx);
CHECK(bmp1.HasAlpha() == false);
CHECK(bmp1.GetMask() != NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
idx = il.Add(bmpRGBWithMask);
CHECK(il.GetImageCount() == 2);
wxBitmap bmp2 = il.GetBitmap(idx);
CHECK(bmp2.HasAlpha() == false);
CHECK(bmp2.GetMask() != NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
idx = il.Add(bmpRGB, *wxRED);
CHECK(il.GetImageCount() == 3);
wxBitmap bmp3 = il.GetBitmap(idx);
CHECK(bmp3.HasAlpha() == false);
CHECK(bmp3.GetMask() != NULL);
CHECK(bmp3.GetWidth() == 32);
CHECK(bmp3.GetHeight() == 32);
}
SECTION("Add RGBA image to list")
{
il.RemoveAll();
int idx = il.Add(bmpRGBA);
CHECK(il.GetImageCount() == 1);
wxBitmap bmp1 = il.GetBitmap(idx);
CHECK(bmp1.HasAlpha() == false);
CHECK(bmp1.GetMask() != NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
idx = il.Add(bmpRGBAWithMask);
CHECK(il.GetImageCount() == 2);
wxBitmap bmp2 = il.GetBitmap(idx);
CHECK(bmp2.HasAlpha() == false);
CHECK(bmp2.GetMask() != NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
idx = il.Add(bmpRGBA, *wxRED);
CHECK(il.GetImageCount() == 3);
wxBitmap bmp3 = il.GetBitmap(idx);
CHECK(bmp3.HasAlpha() == false);
CHECK(bmp3.GetMask() != NULL);
CHECK(bmp3.GetWidth() == 32);
CHECK(bmp3.GetHeight() == 32);
}
SECTION("Add icon to list")
{
il.RemoveAll();
int idx = il.Add(ico);
CHECK(il.GetImageCount() == 1);
wxIcon icon1 = il.GetIcon(idx);
CHECK(icon1.GetWidth() == 32);
CHECK(icon1.GetHeight() == 32);
}
SECTION("Replace with RGB image")
{
il.RemoveAll();
int idx1 = il.Add(bmpRGBA);
CHECK(il.GetImageCount() == 1);
int idx2 = il.Add(bmpRGBAWithMask);
CHECK(il.GetImageCount() == 2);
il.Replace(idx1, bmpRGB);
il.Replace(idx2, bmpRGBWithMask);
wxBitmap bmp1 = il.GetBitmap(idx1);
CHECK(bmp1.HasAlpha() == false);
CHECK(bmp1.GetMask() != NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
wxBitmap bmp2 = il.GetBitmap(idx2);
CHECK(bmp2.HasAlpha() == false);
CHECK(bmp2.GetMask() != NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
}
SECTION("Replace with RGBA image")
{
il.RemoveAll();
int idx1 = il.Add(bmpRGB);
CHECK(il.GetImageCount() == 1);
int idx2 = il.Add(bmpRGBWithMask);
CHECK(il.GetImageCount() == 2);
il.Replace(idx1, bmpRGBA);
il.Replace(idx2, bmpRGBAWithMask);
wxBitmap bmp1 = il.GetBitmap(idx1);
CHECK(bmp1.HasAlpha() == false);
CHECK(bmp1.GetMask() != NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
wxBitmap bmp2 = il.GetBitmap(idx2);
CHECK(bmp2.HasAlpha() == false);
CHECK(bmp2.GetMask() != NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
}
SECTION("Add images with incompatible sizes")
{
il.RemoveAll();
wxSize sz = il.GetSize();
wxBitmap bmpSmallerW(sz.GetWidth() / 2, sz.GetHeight(), 24);
{
wxMemoryDC mdc(bmpSmallerW);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpSmallerW.IsOk());
wxBitmap bmpSmallerH(sz.GetWidth(), sz.GetHeight() / 2, 24);
{
wxMemoryDC mdc(bmpSmallerH);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpSmallerH.IsOk());
wxBitmap bmpSmallerWH(sz.GetWidth() / 2, sz.GetHeight() / 2, 24);
{
wxMemoryDC mdc(bmpSmallerWH);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpSmallerWH.IsOk());
wxBitmap bmpBiggerW(sz.GetWidth() * 3 / 2, sz.GetHeight(), 24);
{
wxMemoryDC mdc(bmpBiggerW);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpBiggerW.IsOk());
wxBitmap bmpBiggerW2x(sz.GetWidth() * 2, sz.GetHeight(), 24);
{
wxMemoryDC mdc(bmpBiggerW2x);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpBiggerW2x.IsOk());
wxBitmap bmpBiggerH(sz.GetWidth(), sz.GetHeight() * 3 / 2, 24);
{
wxMemoryDC mdc(bmpBiggerH);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpBiggerH.IsOk());
wxBitmap bmpBiggerH2x(sz.GetWidth(), sz.GetHeight() * 2, 24);
{
wxMemoryDC mdc(bmpBiggerH2x);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpBiggerH2x.IsOk());
wxBitmap bmpBiggerWH(sz.GetWidth() * 3 / 2, sz.GetHeight() * 3 / 2, 24);
{
wxMemoryDC mdc(bmpBiggerWH);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpBiggerWH.IsOk());
wxBitmap bmpBiggerWH2x(sz.GetWidth() * 2, sz.GetHeight() * 2, 24);
{
wxMemoryDC mdc(bmpBiggerWH2x);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
}
REQUIRE(bmpBiggerWH2x.IsOk());
// Adding
int cnt = il.GetImageCount();
int idx = il.Add(bmpSmallerW);
CHECK(idx == -1);
CHECK(il.GetImageCount() == cnt);
cnt = il.GetImageCount();
idx = il.Add(bmpSmallerH);
CHECK(idx >= 0);
CHECK(il.GetImageCount() == cnt + 1);
wxBitmap bmp = il.GetBitmap(idx);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
idx = il.Add(bmpSmallerWH);
CHECK(idx == -1);
CHECK(il.GetImageCount() == cnt);
cnt = il.GetImageCount();
idx = il.Add(bmpBiggerW);
CHECK(idx >= 0);
CHECK(il.GetImageCount() == cnt + 1);
bmp = il.GetBitmap(idx);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
idx = il.Add(bmpBiggerW2x);
CHECK(idx >= 0);
CHECK(il.GetImageCount() == cnt + 2);
bmp = il.GetBitmap(idx);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
idx = il.Add(bmpBiggerH);
CHECK(idx >= 0);
CHECK(il.GetImageCount() == cnt + 1);
bmp = il.GetBitmap(idx);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
idx = il.Add(bmpBiggerH2x);
CHECK(idx >= 0);
CHECK(il.GetImageCount() == cnt + 1);
bmp = il.GetBitmap(idx);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
idx = il.Add(bmpBiggerWH);
CHECK(idx >= 0);
CHECK(il.GetImageCount() == cnt + 1);
bmp = il.GetBitmap(idx);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
idx = il.Add(bmpBiggerWH2x);
CHECK(idx >= 0);
CHECK(il.GetImageCount() == cnt + 2);
bmp = il.GetBitmap(idx);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
// Replacing
il.RemoveAll();
cnt = il.GetImageCount();
bool ok = il.Replace(0, bmpRGBA);
CHECK(ok == false);
CHECK(il.GetImageCount() == cnt);
// List with 1 image
idx = il.Add(bmpRGB);
CHECK(idx >= 0);
cnt = il.GetImageCount();
ok = il.Replace(0, bmpRGBA);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpSmallerW);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpSmallerH);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpSmallerWH);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpBiggerW);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpBiggerW2x);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpBiggerH);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpBiggerH2x);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpBiggerWH);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
cnt = il.GetImageCount();
ok = il.Replace(0, bmpBiggerWH2x);
CHECK(ok == true);
CHECK(il.GetImageCount() == cnt);
bmp = il.GetBitmap(0);
CHECK(bmp.GetWidth() == sz.GetWidth());
CHECK(bmp.GetHeight() == sz.GetHeight());
}
}
TEST_CASE("ImageList:NoMask", "[imagelist][nomask]")
{
wxInitAllImageHandlers();
wxBitmap bmpRGB(32, 32, 24);
{
wxMemoryDC mdc(bmpRGB);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
mdc.SetBrush(*wxRED_BRUSH);
mdc.DrawRectangle(4, 4, 24, 24);
}
REQUIRE(bmpRGB.IsOk());
wxBitmap bmpRGBA;
bmpRGBA.LoadFile("image/wx.png", wxBITMAP_TYPE_PNG);
REQUIRE(bmpRGBA.IsOk());
wxBitmap bmpMask(32, 32, 1);
{
wxMemoryDC mdc(bmpMask);
#if wxUSE_GRAPHICS_CONTEXT
wxGraphicsContext* gc = mdc.GetGraphicsContext();
if ( gc )
gc->SetAntialiasMode(wxANTIALIAS_NONE);
#endif //wxUSE_GRAPHICS_CONTEXT
mdc.SetBackground(*wxBLACK_BRUSH);
mdc.Clear();
mdc.SetBrush(*wxWHITE_BRUSH);
mdc.DrawRectangle(0, 0, 16, 32);
}
wxBitmap bmpRGBWithMask(bmpRGB);
bmpRGBWithMask.SetMask(new wxMask(bmpMask));
REQUIRE(bmpRGBWithMask.IsOk());
wxBitmap bmpRGBAWithMask(bmpRGBA);
bmpRGBAWithMask.SetMask(new wxMask(bmpMask));
REQUIRE(bmpRGBAWithMask.IsOk());
wxIcon ico;
ico.LoadFile("image/wx.ico", wxBITMAP_TYPE_ICO);
REQUIRE(ico.IsOk());
REQUIRE(bmpRGB.HasAlpha() == false);
REQUIRE(bmpRGB.GetMask() == NULL);
REQUIRE(bmpRGBWithMask.HasAlpha() == false);
REQUIRE(bmpRGBWithMask.GetMask() != NULL);
REQUIRE(bmpRGBA.HasAlpha() == true);
REQUIRE(bmpRGBA.GetMask() == NULL);
REQUIRE(bmpRGBAWithMask.HasAlpha() == true);
REQUIRE(bmpRGBAWithMask.GetMask() != NULL);
wxImageList il(32, 32, false);
SECTION("Add RGB image to list")
{
il.RemoveAll();
int idx = il.Add(bmpRGB);
CHECK(il.GetImageCount() == 1);
wxBitmap bmp1 = il.GetBitmap(idx);
CHECK(bmp1.HasAlpha() == false);
CHECK(bmp1.GetMask() == NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
idx = il.Add(bmpRGBWithMask);
CHECK(il.GetImageCount() == 2);
wxBitmap bmp2 = il.GetBitmap(idx);
CHECK(bmp2.HasAlpha() == true);
CHECK(bmp2.GetMask() == NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
idx = il.Add(bmpRGB, *wxRED);
CHECK(il.GetImageCount() == 3);
wxBitmap bmp3 = il.GetBitmap(idx);
CHECK(bmp3.HasAlpha() == true);
CHECK(bmp3.GetMask() == NULL);
CHECK(bmp3.GetWidth() == 32);
CHECK(bmp3.GetHeight() == 32);
}
SECTION("Add RGBA image to list")
{
il.RemoveAll();
int idx = il.Add(bmpRGBA);
CHECK(il.GetImageCount() == 1);
wxBitmap bmp1 = il.GetBitmap(idx);
CHECK(bmp1.HasAlpha() == true);
CHECK(bmp1.GetMask() == NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
idx = il.Add(bmpRGBAWithMask);
CHECK(il.GetImageCount() == 2);
wxBitmap bmp2 = il.GetBitmap(idx);
CHECK(bmp2.HasAlpha() == true);
CHECK(bmp2.GetMask() == NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
idx = il.Add(bmpRGBA, *wxRED);
CHECK(il.GetImageCount() == 3);
wxBitmap bmp3 = il.GetBitmap(idx);
CHECK(bmp3.HasAlpha() == true);
CHECK(bmp3.GetMask() == NULL);
CHECK(bmp3.GetWidth() == 32);
CHECK(bmp3.GetHeight() == 32);
}
SECTION("Add icon to list")
{
il.RemoveAll();
int idx = il.Add(ico);
CHECK(il.GetImageCount() == 1);
wxIcon icon1 = il.GetIcon(idx);
CHECK(icon1.GetWidth() == 32);
CHECK(icon1.GetHeight() == 32);
}
SECTION("Replace with RGB image")
{
il.RemoveAll();
int idx1 = il.Add(bmpRGBA);
CHECK(il.GetImageCount() == 1);
int idx2 = il.Add(bmpRGBAWithMask);
CHECK(il.GetImageCount() == 2);
il.Replace(idx1, bmpRGB);
il.Replace(idx2, bmpRGBWithMask);
wxBitmap bmp1 = il.GetBitmap(idx1);
CHECK(bmp1.HasAlpha() == false);
CHECK(bmp1.GetMask() == NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
wxBitmap bmp2 = il.GetBitmap(idx2);
CHECK(bmp2.HasAlpha() == true);
CHECK(bmp2.GetMask() == NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
}
SECTION("Replace with RGBA image")
{
il.RemoveAll();
int idx1 = il.Add(bmpRGB);
CHECK(il.GetImageCount() == 1);
int idx2 = il.Add(bmpRGBWithMask);
CHECK(il.GetImageCount() == 2);
il.Replace(idx1, bmpRGBA);
il.Replace(idx2, bmpRGBAWithMask);
wxBitmap bmp1 = il.GetBitmap(idx1);
CHECK(bmp1.HasAlpha() == true);
CHECK(bmp1.GetMask() == NULL);
CHECK(bmp1.GetWidth() == 32);
CHECK(bmp1.GetHeight() == 32);
wxBitmap bmp2 = il.GetBitmap(idx2);
CHECK(bmp2.HasAlpha() == true);
CHECK(bmp2.GetMask() == NULL);
CHECK(bmp2.GetWidth() == 32);
CHECK(bmp2.GetHeight() == 32);
}
}
TEST_CASE("ImageList:NegativeTests", "[imagelist][negative]")
{
wxBitmap bmp(32, 32, 24);
{
wxMemoryDC mdc(bmp);
mdc.SetBackground(*wxBLUE_BRUSH);
mdc.Clear();
mdc.SetBrush(*wxRED_BRUSH);
mdc.DrawRectangle(4, 4, 24, 24);
}
REQUIRE(bmp.IsOk());
SECTION("Invalid size (negative)")
{
wxImageList il;
bool ok = il.Create(-1, -1);
CHECK_FALSE(ok);
#ifdef __WXDEBUG__
REQUIRE_THROWS(il.GetImageCount());
#else
CHECK(il.GetImageCount() == 0);
#endif
wxSize sz = il.GetSize();
CHECK(sz.x == 0);
CHECK(sz.y == 0);
int w = -1;
int h = -1;
#ifdef __WXDEBUG__
REQUIRE_THROWS(il.GetSize(0, w, h));
#else
ok = il.GetSize(0, w, h);
CHECK_FALSE(ok);
CHECK(w == 0);
CHECK(h == 0);
#endif
int idx = il.Add(bmp);
CHECK(idx == -1);
#ifdef __WXDEBUG__
REQUIRE_THROWS(il.GetImageCount());
#else
CHECK(il.GetImageCount() == 0);
#endif
}
SECTION("Invalid size (zero)")
{
wxImageList il;
bool ok = il.Create(0, 0);
CHECK_FALSE(ok);
#ifdef __WXDEBUG__
REQUIRE_THROWS(il.GetImageCount());
#else
CHECK(il.GetImageCount() == 0);
#endif
wxSize sz = il.GetSize();
CHECK(sz.x == 0);
CHECK(sz.y == 0);
int w = -1;
int h = -1;
#ifdef __WXDEBUG__
REQUIRE_THROWS(ok = il.GetSize(0, w, h));
#else
ok = il.GetSize(0, w, h);
CHECK_FALSE(ok);
CHECK(w == 0);
CHECK(h == 0);
#endif
int idx = il.Add(bmp);
CHECK(idx == -1);
#ifdef __WXDEBUG__
REQUIRE_THROWS(il.GetImageCount());
#else
CHECK(il.GetImageCount() == 0);
#endif
ok = il.Replace(0, bmp);
CHECK_FALSE(ok);
#ifdef __WXDEBUG__
REQUIRE_THROWS(il.GetImageCount());
#else
CHECK(il.GetImageCount() == 0);
#endif
}
SECTION("Invalid Get/Replace/Remove indices")
{
wxImageList il(32, 32, false);
CHECK(il.GetImageCount() == 0);
wxSize sz = il.GetSize();
CHECK(sz.x == 32);
CHECK(sz.y == 32);
int w = -1;
int h = -1;
bool ok = il.GetSize(0, w, h);
CHECK(ok == true);
CHECK(w == 32);
CHECK(h == 32);
int idx = il.Add(bmp);
CHECK(idx == 0);
CHECK(il.GetImageCount() == 1);
wxBitmap bmp2 = il.GetBitmap(-1);
CHECK_FALSE(bmp2.IsOk());
CHECK(il.GetImageCount() == 1);
wxBitmap bmp3 = il.GetBitmap(5);
CHECK_FALSE(bmp3.IsOk());
CHECK(il.GetImageCount() == 1);
wxIcon icon2 = il.GetIcon(-1);
CHECK_FALSE(icon2.IsOk());
CHECK(il.GetImageCount() == 1);
wxBitmap icon3 = il.GetIcon(5);
CHECK_FALSE(icon3.IsOk());
CHECK(il.GetImageCount() == 1);
ok = il.Replace(-1, bmp);
CHECK_FALSE(ok);
CHECK(il.GetImageCount() == 1);
ok = il.Replace(5, bmp);
CHECK_FALSE(ok);
CHECK(il.GetImageCount() == 1);
ok = il.Remove(-1);
CHECK_FALSE(ok);
CHECK(il.GetImageCount() == 1);
ok = il.Remove(5);
CHECK_FALSE(ok);
CHECK(il.GetImageCount() == 1);
}
}
// This test relies on logical pixels being different from physical ones.
#ifdef wxHAS_DPI_INDEPENDENT_PIXELS
TEST_CASE("ImageList:HiDPI", "[imagelist][hidpi]")
{
wxImage img1(8, 4);
img1.SetRGB(wxRect(0, 0, 8, 4), 0, 63, 127);
REQUIRE(img1.IsOk());
wxImage img2(16, 8);
img2.SetRGB(wxRect(0, 0, 16, 8), 255, 128, 64);
REQUIRE(img2.IsOk());
wxBitmap bmp1x(img1, -1, 1.0);
REQUIRE(bmp1x.IsOk());
CHECK(bmp1x.GetSize() == wxSize(8, 4));
CHECK(bmp1x.GetLogicalSize() == wxSize(8, 4));
CHECK_FALSE(bmp1x.HasAlpha());
CHECK(bmp1x.GetMask() == NULL);
wxBitmap bmp2x(img2, -1, 2.0);
REQUIRE(bmp2x.IsOk());
CHECK(bmp2x.GetSize() == wxSize(16, 8));
CHECK(bmp2x.GetLogicalSize() == wxSize(8, 4));
CHECK_FALSE(bmp2x.HasAlpha());
CHECK(bmp2x.GetMask() == NULL);
// Logical image size
wxImageList il(8, 4, false);
int idx = il.Add(bmp2x);
REQUIRE(idx == 0);
REQUIRE(il.GetImageCount() == 1);
idx = il.Add(bmp1x);
REQUIRE(idx == 1);
REQUIRE(il.GetImageCount() == 2);
wxBitmap bmp = il.GetBitmap(0);
REQUIRE(bmp.IsOk() == true);
CHECK(bmp.GetScaleFactor() == 2.0);
CHECK(bmp.GetSize() == wxSize(16, 8));
CHECK(bmp.GetLogicalSize() == wxSize(8, 4));
CHECK_FALSE(bmp.HasAlpha());
CHECK(bmp.GetMask() == NULL);
bmp = il.GetBitmap(1);
REQUIRE(bmp.IsOk() == true);
CHECK(bmp.GetScaleFactor() == 1.0);
CHECK(bmp.GetSize() == wxSize(8, 4));
CHECK(bmp.GetLogicalSize() == wxSize(8, 4));
CHECK_FALSE(bmp.HasAlpha());
CHECK(bmp.GetMask() == NULL);
}
#endif // wxHAS_DPI_INDEPENDENT_PIXELS