/////////////////////////////////////////////////////////////////////////////// // Name: tests/graphics/graphbitmap.cpp // Purpose: wxGraphicsBitmap unit test // Author: Artur Wieczorek // Created: 2021-02-05 // Copyright: (c) 2021 wxWidgets development team /////////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- #include "testprec.h" #ifdef wxHAS_RAW_BITMAP #include "wx/bitmap.h" #include "wx/rawbmp.h" #include "wx/dcmemory.h" #include "wx/graphics.h" #include "testimage.h" #ifdef __WXMSW__ // Support for iteration over 32 bpp 0RGB bitmaps typedef wxPixelFormat wxNative32PixelFormat; typedef wxPixelData wxNative32PixelData; #endif // __WXMSW__ #ifdef __WXOSX__ // 32 bpp xRGB bitmaps are native ones typedef wxNativePixelData wxNative32PixelData; #endif // __WXOSX__ // ---------------------------------------------------------------------------- // tests // ---------------------------------------------------------------------------- #if wxUSE_GRAPHICS_CONTEXT namespace { wxBitmap DoCreateBitmapRGB(int w, int h, int bpp, bool withMask) { wxBitmap bmp(w, h, bpp); { wxMemoryDC dc(bmp); dc.SetBackground(*wxBLUE_BRUSH); dc.Clear(); dc.SetPen(*wxYELLOW_PEN); dc.SetBrush(*wxYELLOW_BRUSH); dc.DrawRectangle(2, 2, bmp.GetWidth() - 2, bmp.GetHeight() - 2); } REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() == NULL); if ( withMask ) { // Mask wxBitmap bmask(bmp.GetWidth(), bmp.GetHeight(), 1); { wxMemoryDC dc(bmask); wxGraphicsContext* gc = dc.GetGraphicsContext(); if ( gc ) { gc->SetAntialiasMode(wxANTIALIAS_NONE); } dc.SetBackground(*wxBLACK_BRUSH); dc.Clear(); dc.SetPen(*wxWHITE_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawRectangle(4, 4, 4, 4); } bmp.SetMask(new wxMask(bmask)); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() != NULL); } return bmp; } wxBitmap CreateBitmapRGB(int w, int h, bool withMask) { return DoCreateBitmapRGB(w, h, 24, withMask); } #if defined(__WXMSW__) || defined(__WXOSX__) // 32-bit RGB bitmap wxBitmap CreateBitmapXRGB(int w, int h, bool withMask) { return DoCreateBitmapRGB(w, h, 32, withMask); } #endif // __WXMSW__ || __WXOSX__ wxBitmap CreateBitmapRGBA(int w, int h, bool withMask) { wxBitmap bmp(w, h, 32); #if defined(__WXMSW__) || defined(__WXOSX__) bmp.UseAlpha(); #endif // __WXMSW__ || __WXOSX__ { const wxColour clrFg(*wxCYAN); const wxColour clrBg(*wxGREEN); const unsigned char alpha = 51; #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); if ( withMask ) { // Mask wxBitmap bmask(bmp.GetWidth(), bmp.GetHeight(), 1); { wxMemoryDC dc(bmask); wxGraphicsContext* gc = dc.GetGraphicsContext(); if ( gc ) { gc->SetAntialiasMode(wxANTIALIAS_NONE); } dc.SetBackground(*wxBLACK_BRUSH); dc.Clear(); dc.SetPen(*wxWHITE_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawRectangle(4, 4, 4, 4); } bmp.SetMask(new wxMask(bmask)); REQUIRE(bmp.HasAlpha() == true); REQUIRE(bmp.GetMask() != NULL); } return bmp; } wxImage MakeReferenceImage(const wxImage& img) { wxImage refImg = img; if ( refImg.HasMask() ) { // wxGraphicsBitmap doesn't have a mask so we need wxImage // without mask to be compared with created wxGraphicsBitmap. if ( refImg.HasAlpha() ) { // We need to blend mask with alpha values size_t numPixels = refImg.GetWidth() * refImg.GetHeight(); unsigned char* oldAlpha = new unsigned char[numPixels]; memcpy(oldAlpha, refImg.GetAlpha(), numPixels); refImg.ClearAlpha(); refImg.InitAlpha(); unsigned char* newAlpha = refImg.GetAlpha(); for ( size_t i = 0; i < numPixels; i++ ) { if ( newAlpha[i] == wxIMAGE_ALPHA_OPAQUE ) newAlpha[i] = oldAlpha[i]; } delete[]oldAlpha; } else { refImg.InitAlpha(); } } if ( refImg.HasAlpha() ) { // We need also to remove mask colour from transparent pixels // for compatibility with wxGraphicsBitmap. for ( int y = 0; y < refImg.GetHeight(); y++ ) for ( int x = 0; x < refImg.GetWidth(); x++ ) { if ( refImg.GetAlpha(x, y) == wxALPHA_TRANSPARENT ) { refImg.SetRGB(x, y, 0, 0, 0); } } } return refImg; } inline void CheckCreateGraphBitmap(wxGraphicsRenderer* gr, const wxBitmap& srcBmp, const wxImage& srcImg) { wxGraphicsBitmap gbmp = gr->CreateBitmap(srcBmp); wxImage gimage = gbmp.ConvertToImage(); // Reference image needs to be in the format compatible with wxGraphicsBitmap. wxImage refImg = MakeReferenceImage(srcImg); CHECK_THAT(gimage, RGBASameAs(refImg)); } inline void CheckCreateGraphSubBitmap(wxGraphicsRenderer* gr, const wxBitmap& srcBmp, double x, double y, double w, double h, const wxImage& srcImg) { wxGraphicsBitmap gbmp = gr->CreateBitmap(srcBmp); wxGraphicsBitmap gSubBmp = gr->CreateSubBitmap(gbmp, x, y, w, h); wxImage gimage = gSubBmp.ConvertToImage(); // Reference image needs to be in the format compatible with wxGraphicsBitmap. wxImage refImg = MakeReferenceImage(srcImg); CHECK_THAT(gimage, RGBASameAs(refImg)); } inline void CheckCreateGraphBitmapFromImage(wxGraphicsRenderer* gr, const wxImage& srcImg) { wxGraphicsBitmap gbmp = gr->CreateBitmapFromImage(srcImg); wxImage gimage = gbmp.ConvertToImage(); // Reference image needs to be in the format compatible with wxGraphicsBitmap. wxImage refImg = MakeReferenceImage(srcImg); CHECK_THAT(gimage, RGBASameAs(refImg)); } }; TEST_CASE("GraphicsBitmapTestCase::Create", "[graphbitmap][create]") { SECTION("RGB bitmap without mask") { // RGB bitmap wxBitmap bmp = CreateBitmapRGB(8, 8, false); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() == NULL); // Reference image wxImage image = bmp.ConvertToImage(); REQUIRE_FALSE(image.HasAlpha()); REQUIRE_FALSE(image.HasMask()); REQUIRE(image.GetWidth() == bmp.GetWidth()); REQUIRE(image.GetHeight() == bmp.GetHeight()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("RGB bitmap with mask") { // RGB bitmap wxBitmap bmp = CreateBitmapRGB(8, 8, true); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() != NULL); // Reference image wxImage image = bmp.ConvertToImage(); REQUIRE_FALSE(image.HasAlpha()); 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()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { if ( wxIsRunningUnderWine() ) return; wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_CAIRO } #if defined(__WXMSW__) || defined(__WXOSX__) SECTION("xRGB bitmap without mask") { // xRGB bitmap wxBitmap bmp = CreateBitmapXRGB(8, 8, false); REQUIRE(bmp.GetDepth() == 32); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() == NULL); // Reference image wxImage image = bmp.ConvertToImage(); REQUIRE_FALSE(image.HasAlpha()); REQUIRE_FALSE(image.HasMask()); REQUIRE(image.GetWidth() == bmp.GetWidth()); REQUIRE(image.GetHeight() == bmp.GetHeight()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("xRGB bitmap with mask") { // xRGB bitmap wxBitmap bmp = CreateBitmapXRGB(8, 8, true); REQUIRE(bmp.GetDepth() == 32); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() != NULL); // Reference image wxImage image = bmp.ConvertToImage(); REQUIRE_FALSE(image.HasAlpha()); 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()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { if ( wxIsRunningUnderWine() ) return; wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_CAIRO } #endif // _WXMSW__ || __WXOSX__ SECTION("RGBA bitmap without mask") { // RGBA Bitmap wxBitmap bmp = CreateBitmapRGBA(8, 8, false); REQUIRE(bmp.HasAlpha() == true); REQUIRE(bmp.GetMask() == NULL); // Reference image wxImage image = bmp.ConvertToImage(); REQUIRE(image.HasAlpha() == true); REQUIRE_FALSE(image.HasMask()); REQUIRE(image.GetWidth() == bmp.GetWidth()); REQUIRE(image.GetHeight() == bmp.GetHeight()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("RGBA bitmap with mask") { // RGBA Bitmap wxBitmap bmp = CreateBitmapRGBA(8, 8, true); REQUIRE(bmp.HasAlpha() == true); REQUIRE(bmp.GetMask() != NULL); // Reference image 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()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { if ( wxIsRunningUnderWine() ) return; wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmap(gr, bmp, image); } #endif // wxUSE_GRAPHICS_CAIRO } } TEST_CASE("GraphicsBitmapTestCase::SubBitmap", "[graphbitmap][subbitmap][create]") { SECTION("RGB bitmap without mask") { // RGB bitmap wxBitmap bmp = CreateBitmapRGB(8, 8, false); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() == NULL); // Reference image const int subX = 1; const int subY = 1; const int subW = 4; const int subH = 5; wxImage image = bmp.ConvertToImage().GetSubImage(wxRect(subX, subY, subW, subH)); REQUIRE_FALSE(image.HasAlpha()); REQUIRE_FALSE(image.HasMask()); REQUIRE(image.GetWidth() == subW); REQUIRE(image.GetHeight() == subH); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("RGB bitmap with mask") { // RGB bitmap wxBitmap bmp = CreateBitmapRGB(8, 8, true); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() != NULL); // Reference image const int subX = 2; const int subY = 2; const int subW = 4; const int subH = 5; wxImage image = bmp.ConvertToImage().GetSubImage(wxRect(subX, subY, subW, subH)); REQUIRE_FALSE(image.HasAlpha()); REQUIRE(image.HasMask() == true); REQUIRE(image.GetWidth() == subW); REQUIRE(image.GetHeight() == subH); const wxColour maskCol(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue()); REQUIRE(maskCol.IsOk()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { if ( wxIsRunningUnderWine() ) return; wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_CAIRO } #if defined(__WXMSW__) || defined(__WXOSX__) SECTION("xRGB bitmap without mask") { // xRGB bitmap wxBitmap bmp = CreateBitmapXRGB(8, 8, false); REQUIRE(bmp.GetDepth() == 32); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() == NULL); // Reference image const int subX = 1; const int subY = 1; const int subW = 4; const int subH = 5; wxImage image = bmp.ConvertToImage().GetSubImage(wxRect(subX, subY, subW, subH)); REQUIRE_FALSE(image.HasAlpha()); REQUIRE_FALSE(image.HasMask()); REQUIRE(image.GetWidth() == subW); REQUIRE(image.GetHeight() == subH); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("xRGB bitmap with mask") { // xRGB bitmap wxBitmap bmp = CreateBitmapXRGB(8, 8, true); REQUIRE(bmp.GetDepth() == 32); REQUIRE_FALSE(bmp.HasAlpha()); REQUIRE(bmp.GetMask() != NULL); // Reference image const int subX = 2; const int subY = 2; const int subW = 4; const int subH = 5; wxImage image = bmp.ConvertToImage().GetSubImage(wxRect(subX, subY, subW, subH)); REQUIRE_FALSE(image.HasAlpha()); REQUIRE(image.HasMask() == true); REQUIRE(image.GetWidth() == subW); REQUIRE(image.GetHeight() == subH); const wxColour maskCol(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue()); REQUIRE(maskCol.IsOk()); // wxGraphicsBitmap doesn't have a mask so we need wxImage without mask // to be compared with created wxGraphicsBitmap. image.InitAlpha(); REQUIRE(image.HasAlpha() == true); REQUIRE_FALSE(image.HasMask()); // We need also to remove mask colour from transparent pixels // for compatibility with wxGraphicsMask. for ( int y = 0; y < image.GetHeight(); y++ ) for ( int x = 0; x < image.GetWidth(); x++ ) { if ( image.GetAlpha(x, y) == wxALPHA_TRANSPARENT ) { image.SetRGB(x, y, 0, 0, 0); } } SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { if ( wxIsRunningUnderWine() ) return; wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_CAIRO } #endif // __WXMSW__ || __WXOSX__ SECTION("RGBA bitmap without mask") { // RGBA Bitmap wxBitmap bmp = CreateBitmapRGBA(8, 8, false); REQUIRE(bmp.HasAlpha() == true); REQUIRE(bmp.GetMask() == NULL); // Reference image const int subX = 2; const int subY = 2; const int subW = 4; const int subH = 5; wxImage image = bmp.ConvertToImage().GetSubImage(wxRect(subX, subY, subW, subH)); REQUIRE(image.HasAlpha() == true); REQUIRE_FALSE(image.HasMask()); REQUIRE(image.GetWidth() == subW); REQUIRE(image.GetHeight() == subH); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("RGBA bitmap with mask") { // RGBA Bitmap wxBitmap bmp = CreateBitmapRGBA(8, 8, true); REQUIRE(bmp.HasAlpha() == true); REQUIRE(bmp.GetMask() != NULL); // Reference image const int subX = 2; const int subY = 2; const int subW = 4; const int subH = 5; wxImage image = bmp.ConvertToImage().GetSubImage(wxRect(subX, subY, subW, subH)); REQUIRE(image.HasAlpha() == true); REQUIRE(image.HasMask() == true); REQUIRE(image.GetWidth() == subW); REQUIRE(image.GetHeight() == subH); const wxColour maskCol(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue()); REQUIRE(maskCol.IsOk()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { if ( wxIsRunningUnderWine() ) return; wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphSubBitmap(gr, bmp, subX, subY, subW, subH, image); } #endif // wxUSE_GRAPHICS_CAIRO } } TEST_CASE("GraphicsBitmapTestCase::CreateFromImage", "[graphbitmap][create][fromimage]") { const wxColour maskCol(*wxRED); const wxColour fillCol(*wxGREEN); SECTION("RGB image without mask") { wxImage img(4, 4); for ( int y = 0; y < img.GetHeight(); y++ ) for ( int x = 0; x < img.GetWidth(); x++ ) { if ( x < img.GetWidth() / 2 ) img.SetRGB(x, y, maskCol.Red(), maskCol.Green(), maskCol.Blue()); else img.SetRGB(x, y, fillCol.Red(), fillCol.Green(), fillCol.Blue()); } REQUIRE_FALSE(img.HasAlpha()); REQUIRE_FALSE(img.HasMask()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("RGB image with mask") { wxImage img(4, 4); for ( int y = 0; y < img.GetHeight(); y++ ) for ( int x = 0; x < img.GetWidth(); x++ ) { if ( x < img.GetWidth() / 2 ) img.SetRGB(x, y, maskCol.Red(), maskCol.Green(), maskCol.Blue()); else img.SetRGB(x, y, fillCol.Red(), fillCol.Green(), fillCol.Blue()); } img.SetMaskColour(maskCol.Red(), maskCol.Green(), maskCol.Blue()); REQUIRE_FALSE(img.HasAlpha()); REQUIRE(img.HasMask() == true); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("RGBA image without mask") { wxImage img(4, 4); img.SetAlpha(); for ( int y = 0; y < img.GetHeight(); y++ ) for ( int x = 0; x < img.GetWidth(); x++ ) { if ( x < img.GetWidth() / 2 ) img.SetRGB(x, y, maskCol.Red(), maskCol.Green(), maskCol.Blue()); else img.SetRGB(x, y, fillCol.Red(), fillCol.Green(), fillCol.Blue()); if ( y < img.GetHeight() / 2 ) img.SetAlpha(x, y, 128); else img.SetAlpha(x, y, 0); } REQUIRE(img.HasAlpha() == true); REQUIRE_FALSE(img.HasMask()); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_CAIRO } SECTION("RGBA image with mask") { wxImage img(4, 4); img.SetAlpha(); for ( int y = 0; y < img.GetHeight(); y++ ) for ( int x = 0; x < img.GetWidth(); x++ ) { if ( x < img.GetWidth() / 2 ) img.SetRGB(x, y, maskCol.Red(), maskCol.Green(), maskCol.Blue()); else img.SetRGB(x, y, fillCol.Red(), fillCol.Green(), fillCol.Blue()); if ( y < img.GetHeight() / 2 ) img.SetAlpha(x, y, 128); else img.SetAlpha(x, y, 0); } img.SetMaskColour(maskCol.Red(), maskCol.Green(), maskCol.Blue()); REQUIRE(img.HasAlpha() == true); REQUIRE(img.HasMask() == true); SECTION("Default GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDefaultRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #if defined(__WXMSW__) #if wxUSE_GRAPHICS_GDIPLUS SECTION("GDI+ GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_DIRECT2D SECTION("Direct2D GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_DIRECT2D #endif // __WXMSW__ #if wxUSE_CAIRO SECTION("Cairo GC") { wxGraphicsRenderer* gr = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(gr != NULL); CheckCreateGraphBitmapFromImage(gr, img); } #endif // wxUSE_GRAPHICS_CAIRO } } #endif // wxUSE_GRAPHICS_CONTEXT #endif // wxHAS_RAW_BITMAP