Add more tests of converting wxBitmap to wxImage
This commit is contained in:
@@ -131,17 +131,55 @@ TEST_CASE("BitmapTestCase::Mask", "[bitmap][mask]")
|
|||||||
REQUIRE(bmp.GetMask() == mask2);
|
REQUIRE(bmp.GetMask() == mask2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("BitmapTestCase::ConvertToImageWithMask", "[bitmap][image][mask]")
|
TEST_CASE("BitmapTestCase::ToImage", "[bitmap][image][convertto]")
|
||||||
{
|
{
|
||||||
wxBitmap color(32, 32, 24);
|
SECTION("RGB bitmap without mask")
|
||||||
{
|
{
|
||||||
wxMemoryDC dc(color);
|
// RGB bitmap
|
||||||
|
wxBitmap bmp(16, 16, 24);
|
||||||
|
{
|
||||||
|
wxMemoryDC dc(bmp);
|
||||||
dc.SetPen(*wxYELLOW_PEN);
|
dc.SetPen(*wxYELLOW_PEN);
|
||||||
dc.SetBrush(*wxYELLOW_BRUSH);
|
dc.SetBrush(*wxYELLOW_BRUSH);
|
||||||
dc.DrawRectangle(0, 0, color.GetWidth(), color.GetHeight());
|
dc.DrawRectangle(0, 0, bmp.GetWidth(), bmp.GetHeight());
|
||||||
}
|
}
|
||||||
|
REQUIRE_FALSE(bmp.HasAlpha());
|
||||||
|
REQUIRE(bmp.GetMask() == NULL);
|
||||||
|
|
||||||
|
wxImage image = bmp.ConvertToImage();
|
||||||
|
REQUIRE_FALSE(image.HasAlpha());
|
||||||
|
REQUIRE_FALSE(image.HasMask());
|
||||||
|
REQUIRE(image.GetWidth() == bmp.GetWidth());
|
||||||
|
REQUIRE(image.GetHeight() == bmp.GetHeight());
|
||||||
|
|
||||||
|
wxNativePixelData dataBmp(bmp);
|
||||||
|
wxNativePixelData::Iterator rowStartBmp(dataBmp);
|
||||||
|
|
||||||
|
for ( int y = 0; y < bmp.GetHeight(); ++y )
|
||||||
{
|
{
|
||||||
wxBitmap bmask(color.GetWidth(), color.GetHeight(), 1);
|
wxNativePixelData::Iterator iBmp = rowStartBmp;
|
||||||
|
for ( int x = 0; x < bmp.GetWidth(); ++x, ++iBmp )
|
||||||
|
{
|
||||||
|
wxColour bmpc(iBmp.Red(), iBmp.Green(), iBmp.Blue());
|
||||||
|
wxColour imgc(image.GetRed(x, y), image.GetGreen(x, y), image.GetBlue(x, y));
|
||||||
|
CHECK_EQUAL_COLOUR_RGB(imgc, bmpc);
|
||||||
|
}
|
||||||
|
rowStartBmp.OffsetY(dataBmp, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("RGB bitmap with mask")
|
||||||
|
{
|
||||||
|
// RGB bitmap
|
||||||
|
wxBitmap bmp(16, 16, 24);
|
||||||
|
{
|
||||||
|
wxMemoryDC dc(bmp);
|
||||||
|
dc.SetPen(*wxYELLOW_PEN);
|
||||||
|
dc.SetBrush(*wxYELLOW_BRUSH);
|
||||||
|
dc.DrawRectangle(0, 0, bmp.GetWidth(), bmp.GetHeight());
|
||||||
|
}
|
||||||
|
// Mask
|
||||||
|
wxBitmap bmask(bmp.GetWidth(), bmp.GetHeight(), 1);
|
||||||
{
|
{
|
||||||
wxMemoryDC dc(bmask);
|
wxMemoryDC dc(bmask);
|
||||||
#if wxUSE_GRAPHICS_CONTEXT
|
#if wxUSE_GRAPHICS_CONTEXT
|
||||||
@@ -157,31 +195,248 @@ TEST_CASE("BitmapTestCase::ConvertToImageWithMask", "[bitmap][image][mask]")
|
|||||||
dc.SetBrush(*wxWHITE_BRUSH);
|
dc.SetBrush(*wxWHITE_BRUSH);
|
||||||
dc.DrawRectangle(4, 4, 8, 8);
|
dc.DrawRectangle(4, 4, 8, 8);
|
||||||
}
|
}
|
||||||
REQUIRE_FALSE(color.HasAlpha());
|
bmp.SetMask(new wxMask(bmask));
|
||||||
REQUIRE(color.GetMask() == NULL);
|
REQUIRE_FALSE(bmp.HasAlpha());
|
||||||
color.SetMask(new wxMask(bmask));
|
REQUIRE(bmp.GetMask() != NULL);
|
||||||
REQUIRE_FALSE(color.HasAlpha());
|
const int numUnmaskedPixels = 8 * 8;
|
||||||
REQUIRE(color.GetMask() != NULL);
|
|
||||||
}
|
|
||||||
wxImage image = color.ConvertToImage();
|
|
||||||
|
|
||||||
wxNativePixelData dataColor(color);
|
wxImage image = bmp.ConvertToImage();
|
||||||
wxNativePixelData::Iterator rowStartColor(dataColor);
|
REQUIRE_FALSE(image.HasAlpha());
|
||||||
wxBitmap mask = color.GetMask()->GetBitmap();
|
REQUIRE(image.HasMask() == true);
|
||||||
|
REQUIRE(image.GetWidth() == bmp.GetWidth());
|
||||||
|
REQUIRE(image.GetHeight() == bmp.GetHeight());
|
||||||
|
const wxColour maskCol(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue());
|
||||||
|
REQUIRE(maskCol.IsOk());
|
||||||
|
|
||||||
|
wxNativePixelData dataBmp(bmp);
|
||||||
|
wxNativePixelData::Iterator rowStartBmp(dataBmp);
|
||||||
|
wxBitmap mask = bmp.GetMask()->GetBitmap();
|
||||||
wxNativePixelData dataMask(mask);
|
wxNativePixelData dataMask(mask);
|
||||||
wxNativePixelData::Iterator rowStartMask(dataMask);
|
wxNativePixelData::Iterator rowStartMask(dataMask);
|
||||||
|
|
||||||
for ( int y = 0; y < color.GetHeight(); ++y ) {
|
int unmaskedPixelsCount = 0;
|
||||||
wxNativePixelData::Iterator iColor = rowStartColor;
|
for ( int y = 0; y < bmp.GetHeight(); ++y )
|
||||||
|
{
|
||||||
|
wxNativePixelData::Iterator iBmp = rowStartBmp;
|
||||||
wxNativePixelData::Iterator iMask = rowStartMask;
|
wxNativePixelData::Iterator iMask = rowStartMask;
|
||||||
for ( int x = 0; x < color.GetWidth(); ++x, ++iColor, ++iMask ) {
|
for ( int x = 0; x < bmp.GetWidth(); ++x, ++iBmp, ++iMask )
|
||||||
CHECK((iMask.Red() == 255 && iMask.Green() == 255 && iMask.Blue() == 255 ? iColor.Red() : 1) == image.GetRed(x, y));
|
{
|
||||||
CHECK((iMask.Red() == 255 && iMask.Green() == 255 && iMask.Blue() == 255 ? iColor.Green() : 2) == image.GetGreen(x, y));
|
wxColour bmpc(iBmp.Red(), iBmp.Green(), iBmp.Blue());
|
||||||
CHECK((iMask.Red() == 255 && iMask.Green() == 255 && iMask.Blue() == 255 ? iColor.Blue() : 3) == image.GetBlue(x, y));
|
wxColour maskc(iMask.Red(), iMask.Green(), iMask.Blue());
|
||||||
|
wxColour imgc(image.GetRed(x, y), image.GetGreen(x, y), image.GetBlue(x, y));
|
||||||
|
if ( maskc == *wxWHITE )
|
||||||
|
{
|
||||||
|
CHECK_EQUAL_COLOUR_RGB(imgc, bmpc);
|
||||||
|
unmaskedPixelsCount++;
|
||||||
}
|
}
|
||||||
rowStartColor.OffsetY(dataColor, 1);
|
else
|
||||||
|
{
|
||||||
|
CHECK_EQUAL_COLOUR_RGB(imgc, maskCol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rowStartBmp.OffsetY(dataBmp, 1);
|
||||||
rowStartMask.OffsetY(dataMask, 1);
|
rowStartMask.OffsetY(dataMask, 1);
|
||||||
}
|
}
|
||||||
|
CHECK(unmaskedPixelsCount == numUnmaskedPixels);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("RGBA bitmap without mask")
|
||||||
|
{
|
||||||
|
// RGBA Bitmap
|
||||||
|
wxBitmap bmp(16, 16, 32);
|
||||||
|
#if defined(__WXMSW__) || defined(__WXOSX__)
|
||||||
|
bmp.UseAlpha();
|
||||||
|
#endif // __WXMSW__ || __WXOSX__
|
||||||
|
{
|
||||||
|
const wxColour clrFg(*wxCYAN);
|
||||||
|
const wxColour clrBg(*wxGREEN);
|
||||||
|
const unsigned char alpha = 92;
|
||||||
|
|
||||||
|
#if defined(__WXMSW__) || defined(__WXOSX__)
|
||||||
|
// premultiplied values
|
||||||
|
const wxColour clrFgAlpha(((clrFg.Red() * alpha) + 127) / 255, ((clrFg.Green() * alpha) + 127) / 255, ((clrFg.Blue() * alpha) + 127) / 255);
|
||||||
|
#else
|
||||||
|
const wxColour clrFgAlpha(clrFg);
|
||||||
|
#endif // __WXMSW__ || __WXOSX__
|
||||||
|
|
||||||
|
wxAlphaPixelData data(bmp);
|
||||||
|
REQUIRE(data);
|
||||||
|
wxAlphaPixelData::Iterator p(data);
|
||||||
|
for ( int y = 0; y < bmp.GetHeight(); y++)
|
||||||
|
{
|
||||||
|
wxAlphaPixelData::Iterator rowStart = p;
|
||||||
|
for ( int x = 0; x < bmp.GetWidth(); x++, ++p )
|
||||||
|
{
|
||||||
|
if ( x < bmp.GetWidth() / 2 )
|
||||||
|
{ // opaque
|
||||||
|
p.Red() = clrFg.Red();
|
||||||
|
p.Green() = clrFg.Green();
|
||||||
|
p.Blue() = clrFg.Blue();
|
||||||
|
p.Alpha() = 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // with transparency
|
||||||
|
p.Red() = clrFgAlpha.Red();
|
||||||
|
p.Green() = clrFgAlpha.Green();
|
||||||
|
p.Blue() = clrFgAlpha.Blue();
|
||||||
|
p.Alpha() = alpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p = rowStart;
|
||||||
|
p.OffsetY(data, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
REQUIRE(bmp.HasAlpha() == true);
|
||||||
|
REQUIRE(bmp.GetMask() == NULL);
|
||||||
|
|
||||||
|
wxImage image = bmp.ConvertToImage();
|
||||||
|
REQUIRE(image.HasAlpha() == true);
|
||||||
|
REQUIRE_FALSE(image.HasMask());
|
||||||
|
REQUIRE(image.GetWidth() == bmp.GetWidth());
|
||||||
|
REQUIRE(image.GetHeight() == bmp.GetHeight());
|
||||||
|
|
||||||
|
wxAlphaPixelData dataBmp(bmp);
|
||||||
|
wxAlphaPixelData::Iterator rowStartBmp(dataBmp);
|
||||||
|
|
||||||
|
for ( int y = 0; y < bmp.GetHeight(); ++y )
|
||||||
|
{
|
||||||
|
wxAlphaPixelData::Iterator iBmp = rowStartBmp;
|
||||||
|
for ( int x = 0; x < bmp.GetWidth(); ++x, ++iBmp )
|
||||||
|
{
|
||||||
|
wxColour bmpc(iBmp.Red(), iBmp.Green(), iBmp.Blue(), iBmp.Alpha());
|
||||||
|
wxColour imgc(image.GetRed(x, y), image.GetGreen(x, y), image.GetBlue(x, y), image.GetAlpha(x,y));
|
||||||
|
#if defined(__WXMSW__) || defined(__WXOSX__)
|
||||||
|
// Premultiplied values
|
||||||
|
unsigned char r = ((imgc.Red() * imgc.Alpha()) + 127) / 255;
|
||||||
|
unsigned char g = ((imgc.Green() * imgc.Alpha()) + 127) / 255;
|
||||||
|
unsigned char b = ((imgc.Blue() * imgc.Alpha()) + 127) / 255;
|
||||||
|
imgc.Set(r, g, b, imgc.Alpha());
|
||||||
|
#endif // __WXMSW__ || __WXOSX__
|
||||||
|
CHECK_EQUAL_COLOUR_RGBA(imgc, bmpc);
|
||||||
|
}
|
||||||
|
rowStartBmp.OffsetY(dataBmp, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__WXGTK20__) && !defined(__WXGTK3__)
|
||||||
|
// Bitmaps with both alpha and a mask don't work well in wxGTK2 so skip the test in this case.
|
||||||
|
WARN("Skipping test known not to work in wxGTK2.");
|
||||||
|
#else
|
||||||
|
SECTION("RGBA bitmap with mask")
|
||||||
|
{
|
||||||
|
// RGBA Bitmap
|
||||||
|
wxBitmap bmp(16, 16, 32);
|
||||||
|
#if defined(__WXMSW__) || defined(__WXOSX__)
|
||||||
|
bmp.UseAlpha();
|
||||||
|
#endif // __WXMSW__ || __WXOSX__
|
||||||
|
{
|
||||||
|
const wxColour clrFg(*wxCYAN);
|
||||||
|
const wxColour clrBg(*wxGREEN);
|
||||||
|
const unsigned char alpha = 92;
|
||||||
|
#if defined(__WXMSW__) || defined(__WXOSX__)
|
||||||
|
// premultiplied values
|
||||||
|
const wxColour clrFgAlpha(((clrFg.Red() * alpha) + 127) / 255, ((clrFg.Green() * alpha) + 127) / 255, ((clrFg.Blue() * alpha) + 127) / 255);
|
||||||
|
#else
|
||||||
|
const wxColour clrFgAlpha(clrFg);
|
||||||
|
#endif // __WXMSW__ || __WXOSX__
|
||||||
|
|
||||||
|
wxAlphaPixelData data(bmp);
|
||||||
|
REQUIRE(data);
|
||||||
|
wxAlphaPixelData::Iterator p(data);
|
||||||
|
for ( int y = 0; y < bmp.GetHeight(); y++)
|
||||||
|
{
|
||||||
|
wxAlphaPixelData::Iterator rowStart = p;
|
||||||
|
for ( int x = 0; x < bmp.GetWidth(); x++, ++p )
|
||||||
|
{
|
||||||
|
if ( x < bmp.GetWidth() / 2 )
|
||||||
|
{ // opaque
|
||||||
|
p.Red() = clrFg.Red();
|
||||||
|
p.Green() = clrFg.Green();
|
||||||
|
p.Blue() = clrFg.Blue();
|
||||||
|
p.Alpha() = 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // with transparency
|
||||||
|
p.Red() = clrFgAlpha.Red();
|
||||||
|
p.Green() = clrFgAlpha.Green();
|
||||||
|
p.Blue() = clrFgAlpha.Blue();
|
||||||
|
p.Alpha() = alpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p = rowStart;
|
||||||
|
p.OffsetY(data, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mask
|
||||||
|
wxBitmap bmask(bmp.GetWidth(), bmp.GetHeight(), 1);
|
||||||
|
{
|
||||||
|
wxMemoryDC dc(bmask);
|
||||||
|
#if wxUSE_GRAPHICS_CONTEXT
|
||||||
|
wxGraphicsContext* gc = dc.GetGraphicsContext();
|
||||||
|
if (gc)
|
||||||
|
{
|
||||||
|
gc->SetAntialiasMode(wxANTIALIAS_NONE);
|
||||||
|
}
|
||||||
|
#endif // wxUSE_GRAPHICS_CONTEXT
|
||||||
|
dc.SetBackground(*wxBLACK_BRUSH);
|
||||||
|
dc.Clear();
|
||||||
|
dc.SetPen(*wxWHITE_PEN);
|
||||||
|
dc.SetBrush(*wxWHITE_BRUSH);
|
||||||
|
dc.DrawRectangle(4, 4, 8, 8);
|
||||||
|
}
|
||||||
|
bmp.SetMask(new wxMask(bmask));
|
||||||
|
REQUIRE(bmp.HasAlpha() == true);
|
||||||
|
REQUIRE(bmp.GetMask() != NULL);
|
||||||
|
const int numUnmaskedPixels = 8 * 8;
|
||||||
|
|
||||||
|
wxImage image = bmp.ConvertToImage();
|
||||||
|
REQUIRE(image.HasAlpha() == true);
|
||||||
|
REQUIRE(image.HasMask() == true);
|
||||||
|
REQUIRE(image.GetWidth() == bmp.GetWidth());
|
||||||
|
REQUIRE(image.GetHeight() == bmp.GetHeight());
|
||||||
|
const wxColour maskCol(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue());
|
||||||
|
REQUIRE(maskCol.IsOk());
|
||||||
|
|
||||||
|
wxAlphaPixelData dataBmp(bmp);
|
||||||
|
wxAlphaPixelData::Iterator rowStartBmp(dataBmp);
|
||||||
|
wxBitmap mask = bmp.GetMask()->GetBitmap();
|
||||||
|
wxNativePixelData dataMask(mask);
|
||||||
|
wxNativePixelData::Iterator rowStartMask(dataMask);
|
||||||
|
|
||||||
|
int unmaskedPixelsCount = 0;
|
||||||
|
for ( int y = 0; y < bmp.GetHeight(); ++y )
|
||||||
|
{
|
||||||
|
wxAlphaPixelData::Iterator iBmp = rowStartBmp;
|
||||||
|
wxNativePixelData::Iterator iMask = rowStartMask;
|
||||||
|
for ( int x = 0; x < bmp.GetWidth(); ++x, ++iBmp, ++iMask )
|
||||||
|
{
|
||||||
|
wxColour bmpc(iBmp.Red(), iBmp.Green(), iBmp.Blue(), iBmp.Alpha());
|
||||||
|
wxColour maskc(iMask.Red(), iMask.Green(), iMask.Blue());
|
||||||
|
wxColour imgc(image.GetRed(x, y), image.GetGreen(x, y), image.GetBlue(x, y), image.GetAlpha(x,y));
|
||||||
|
if ( maskc == *wxWHITE )
|
||||||
|
{
|
||||||
|
#if defined(__WXMSW__) || defined(__WXOSX__)
|
||||||
|
// Premultiplied values
|
||||||
|
unsigned char r = ((imgc.Red() * imgc.Alpha()) + 127) / 255;
|
||||||
|
unsigned char g = ((imgc.Green() * imgc.Alpha()) + 127) / 255;
|
||||||
|
unsigned char b = ((imgc.Blue() * imgc.Alpha()) + 127) / 255;
|
||||||
|
imgc.Set(r, g, b, imgc.Alpha());
|
||||||
|
#endif // __WXMSW__ || __WXOSX
|
||||||
|
CHECK_EQUAL_COLOUR_RGBA(imgc, bmpc);
|
||||||
|
unmaskedPixelsCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CHECK_EQUAL_COLOUR_RGB(imgc, maskCol);
|
||||||
|
CHECK(imgc.Alpha() == bmpc.Alpha());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rowStartBmp.OffsetY(dataBmp, 1);
|
||||||
|
rowStartMask.OffsetY(dataMask, 1);
|
||||||
|
}
|
||||||
|
CHECK(unmaskedPixelsCount == numUnmaskedPixels);
|
||||||
|
}
|
||||||
|
#endif // !__WXGTK20__
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("BitmapTestCase::FromImage", "[bitmap][image][convertfrom]")
|
TEST_CASE("BitmapTestCase::FromImage", "[bitmap][image][convertfrom]")
|
||||||
|
Reference in New Issue
Block a user