Fix wxGraphicsBitmap creation after recent changes to wxBitmap under wxQt

This commit is contained in:
ali kettab
2023-09-13 21:11:26 +01:00
parent d9e3efcf20
commit 160d171077
2 changed files with 36 additions and 21 deletions
+26 -11
View File
@@ -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;
+10 -10
View File
@@ -26,10 +26,10 @@
typedef wxPixelFormat<unsigned char, 32, 2, 1, 0> wxNative32PixelFormat;
typedef wxPixelData<wxBitmap, wxNative32PixelFormat> 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")
{