Fix wxBitmap::GetRawData() in wxQt
This method used to return a dangling pointer to a temporary buffer, which resulted in a crash when using it, e.g. in the unit test. Fix this by keeping a QImage as a member in wxBitmapRefData, so that the pointer to its data remain valid until UngetRawData() is called. Also check that GetRawData() returns a non-null pointer in the test. Closes https://github.com/wxWidgets/wxWidgets/pull/1067
This commit is contained in:
committed by
Vadim Zeitlin
parent
013c6a6b6a
commit
db15e99884
@@ -144,6 +144,7 @@ class wxBitmapRefData: public wxGDIRefData
|
|||||||
virtual ~wxBitmapRefData() { delete m_mask; }
|
virtual ~wxBitmapRefData() { delete m_mask; }
|
||||||
|
|
||||||
QPixmap m_qtPixmap;
|
QPixmap m_qtPixmap;
|
||||||
|
QImage m_rawPixelSource;
|
||||||
wxMask *m_mask;
|
wxMask *m_mask;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -409,17 +410,19 @@ void wxBitmap::SetDepth(int depth)
|
|||||||
void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp)
|
void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp)
|
||||||
{
|
{
|
||||||
void* bits = NULL;
|
void* bits = NULL;
|
||||||
// allow access if bpp is valid and matches existence of alpha
|
|
||||||
if ( !M_PIXDATA.isNull() )
|
wxBitmapRefData *refData = static_cast<wxBitmapRefData *>(m_refData);
|
||||||
|
|
||||||
|
// allow access if bpp is valid
|
||||||
|
if ( !refData->m_qtPixmap.isNull() )
|
||||||
{
|
{
|
||||||
QImage qimage = M_PIXDATA.toImage();
|
if ( bpp == 32 )
|
||||||
bool hasAlpha = M_PIXDATA.hasAlphaChannel();
|
|
||||||
if ((bpp == 24 && !hasAlpha) || (bpp == 32 && hasAlpha))
|
|
||||||
{
|
{
|
||||||
data.m_height = qimage.height();
|
refData->m_rawPixelSource = refData->m_qtPixmap.toImage().convertToFormat(QImage::Format_RGBA8888);
|
||||||
data.m_width = qimage.width();
|
data.m_height = refData->m_rawPixelSource.height();
|
||||||
data.m_stride = qimage.bytesPerLine();
|
data.m_width = refData->m_rawPixelSource.width();
|
||||||
bits = (void*) qimage.bits();
|
data.m_stride = refData->m_rawPixelSource.bytesPerLine();
|
||||||
|
bits = refData->m_rawPixelSource.bits();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bits;
|
return bits;
|
||||||
@@ -427,7 +430,9 @@ void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp)
|
|||||||
|
|
||||||
void wxBitmap::UngetRawData(wxPixelDataBase& WXUNUSED(data))
|
void wxBitmap::UngetRawData(wxPixelDataBase& WXUNUSED(data))
|
||||||
{
|
{
|
||||||
wxMISSING_IMPLEMENTATION( __FUNCTION__ );
|
wxBitmapRefData *refData = static_cast<wxBitmapRefData *>(m_refData);
|
||||||
|
refData->m_qtPixmap = QPixmap::fromImage(refData->m_rawPixelSource);
|
||||||
|
refData->m_rawPixelSource = QImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
QPixmap *wxBitmap::GetHandle() const
|
QPixmap *wxBitmap::GetHandle() const
|
||||||
|
@@ -126,6 +126,7 @@ void BitmapTestCase::OverlappingBlit()
|
|||||||
if ( m_bmp.GetDepth() == 32 )
|
if ( m_bmp.GetDepth() == 32 )
|
||||||
{
|
{
|
||||||
wxAlphaPixelData npd( m_bmp );
|
wxAlphaPixelData npd( m_bmp );
|
||||||
|
CPPUNIT_ASSERT_MESSAGE( "Expected raw pixels to not be NULL", npd );
|
||||||
wxAlphaPixelData::Iterator it( npd );
|
wxAlphaPixelData::Iterator it( npd );
|
||||||
|
|
||||||
ASSERT_EQUAL_RGB( it, 255, 0, 0 );
|
ASSERT_EQUAL_RGB( it, 255, 0, 0 );
|
||||||
|
Reference in New Issue
Block a user