mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-09-28 15:50:17 +08:00
Fix wxGraphicsBitmap creation after recent changes to wxBitmap under wxQt
This commit is contained in:
+26
-11
@@ -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;
|
||||
|
||||
@@ -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")
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user