diff --git a/src/generic/graphicc.cpp b/src/generic/graphicc.cpp index 5408fc5959..c12cc450be 100644 --- a/src/generic/graphicc.cpp +++ b/src/generic/graphicc.cpp @@ -586,7 +586,7 @@ protected: #ifdef __WXMAC__ CGContextRef m_cgContext; #endif // __WXMAC__ - + private: cairo_t* m_context; cairo_matrix_t m_internalTransform; @@ -1608,6 +1608,21 @@ wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, cairo_surfac m_buffer = nullptr; } +namespace +{ +#ifdef wxHAS_RAW_BITMAP +// Return true if the pixel is masked under this platform +inline bool IsMasked(wxNativePixelData::Iterator& p) +{ +#ifndef __WXQT__ + return p.Red()+p.Green()+p.Blue() == 0; +#else + return p.Red()+p.Green()+p.Blue() != 0; +#endif +} +#endif +} + wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitmap& bmp ) : wxGraphicsBitmapData(renderer) { @@ -1622,14 +1637,14 @@ wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitm // different format and iterator than if it doesn't... const bool isSrcBpp32 = bmp.GetDepth() == 32; -#if defined(__WXMSW__) || defined(__WXOSX__) - // Under MSW and OSX we can have 32 bpp xRGB bitmaps (without alpha). +#if defined(__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) + // Under MSW, OSX and Qt we can have 32 bpp xRGB bitmaps (without alpha). const bool hasAlpha = bmp.HasAlpha(); #endif cairo_format_t bufferFormat = - // Under MSW and OSX we can have 32 bpp xRGB bitmaps (without alpha). -#if defined(__WXMSW__) || defined(__WXOSX__) + // Under MSW, OSX and Qt we can have 32 bpp xRGB bitmaps (without alpha). +#if defined(__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) (isSrcBpp32 && hasAlpha) || bmp.GetMask() != nullptr #else isSrcBpp32 || bmp.GetMask() != nullptr @@ -1659,11 +1674,11 @@ wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitm // with alpha in the upper 8 bits, then red, then green, then // blue. The 32-bit quantities are stored native-endian. // Pre-multiplied alpha is used. -#if defined (__WXMSW__) || defined(__WXOSX__) +#if defined (__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) unsigned char alpha = hasAlpha ? p.Alpha() : wxALPHA_OPAQUE; - // MSW and OSX bitmap pixel bits are already premultiplied. + // MSW, OSX and Qt bitmap pixel bits are already premultiplied. *data = (alpha << 24 | p.Red() << 16 | p.Green() << 8 | p.Blue()); -#else // !__WXMSW__ , !__WXOSX__ +#else // !__WXMSW__ , !__WXOSX__ , !__WXQT__ // We always have alpha, but we need to premultiply it. unsigned char alpha = p.Alpha(); if (alpha == wxALPHA_TRANSPARENT) @@ -1673,7 +1688,7 @@ wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitm | Premultiply(alpha, p.Red()) << 16 | Premultiply(alpha, p.Green()) << 8 | Premultiply(alpha, p.Blue())); -#endif // __WXMSW__, __WXOSX__ / !__WXMSW__, !__WXOSX__ +#endif // __WXMSW__, __WXOSX__, __WXQT__ / !__WXMSW__, !__WXOSX__, !__WXQT__ ++data; ++p; } @@ -1735,7 +1750,7 @@ wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitm wxUint32* const rowStartDst = data; for (int x=0; x < pixData.GetWidth(); x++) { - if (p.Red()+p.Green()+p.Blue() == 0) + if ( IsMasked(p) ) *data = 0; ++data; @@ -2414,7 +2429,7 @@ wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, cairo_t *context ) #ifdef __WXMAC__ m_cgContext = nullptr; #endif // __WXMAC__ - + Init( cairo_reference(context), true ); m_width = 0; m_height = 0; diff --git a/tests/graphics/graphbitmap.cpp b/tests/graphics/graphbitmap.cpp index 929f1fecdf..12c817308b 100644 --- a/tests/graphics/graphbitmap.cpp +++ b/tests/graphics/graphbitmap.cpp @@ -26,10 +26,10 @@ typedef wxPixelFormat wxNative32PixelFormat; typedef wxPixelData wxNative32PixelData; #endif // __WXMSW__ -#ifdef __WXOSX__ +#if defined(__WXOSX__) || defined(__WXQT__) // 32 bpp xRGB bitmaps are native ones typedef wxNativePixelData wxNative32PixelData; -#endif // __WXOSX__ +#endif // __WXOSX__ || __WXQT__ // ---------------------------------------------------------------------------- // tests @@ -82,13 +82,13 @@ wxBitmap CreateBitmapRGB(int w, int h, bool withMask) return DoCreateBitmapRGB(w, h, 24, withMask); } -#if defined(__WXMSW__) || defined(__WXOSX__) +#if defined(__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) // 32-bit RGB bitmap wxBitmap CreateBitmapXRGB(int w, int h, bool withMask) { return DoCreateBitmapRGB(w, h, 32, withMask); } -#endif // __WXMSW__ || __WXOSX__ +#endif // __WXMSW__ || __WXOSX__ || __WXQT__ wxBitmap CreateBitmapRGBA(int w, int h, bool withMask) { @@ -101,12 +101,12 @@ wxBitmap CreateBitmapRGBA(int w, int h, bool withMask) const wxColour clrBg(*wxGREEN); const unsigned char alpha = 51; -#if defined(__WXMSW__) || defined(__WXOSX__) +#if defined(__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) // 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__ +#endif // __WXMSW__ || __WXOSX__ || __WXQT__ wxAlphaPixelData data(bmp); REQUIRE(data); @@ -358,7 +358,7 @@ TEST_CASE("GraphicsBitmapTestCase::Create", "[graphbitmap][create]") #endif // wxUSE_GRAPHICS_CAIRO } -#if defined(__WXMSW__) || defined(__WXOSX__) +#if defined(__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) SECTION("xRGB bitmap without mask") { // xRGB bitmap @@ -467,7 +467,7 @@ TEST_CASE("GraphicsBitmapTestCase::Create", "[graphbitmap][create]") } #endif // wxUSE_GRAPHICS_CAIRO } -#endif // _WXMSW__ || __WXOSX__ +#endif // _WXMSW__ || __WXOSX__ || __WXQT__ SECTION("RGBA bitmap without mask") { @@ -694,7 +694,7 @@ TEST_CASE("GraphicsBitmapTestCase::SubBitmap", "[graphbitmap][subbitmap][create] #endif // wxUSE_GRAPHICS_CAIRO } -#if defined(__WXMSW__) || defined(__WXOSX__) +#if defined(__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) SECTION("xRGB bitmap without mask") { // xRGB bitmap @@ -827,7 +827,7 @@ TEST_CASE("GraphicsBitmapTestCase::SubBitmap", "[graphbitmap][subbitmap][create] } #endif // wxUSE_GRAPHICS_CAIRO } -#endif // __WXMSW__ || __WXOSX__ +#endif // __WXMSW__ || __WXOSX__ || __WXQT__ SECTION("RGBA bitmap without mask") {