From 04a8da5f571fab1ac2c7295107f9e435d3f39d78 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 10 Nov 2010 13:53:08 +0000 Subject: [PATCH] Implement bitmap mask copying in wxX11. Copy the mask pixmap properly in wxX11, otherwise copying masks resulted in freeing the same pixmap twice and an X error. This fixes the bitmap unit test for wxX11. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66097 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/x11/bitmap.h | 2 ++ src/x11/bitmap.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/wx/x11/bitmap.h b/include/wx/x11/bitmap.h index 2a272f92c2..6ae61b96c2 100644 --- a/include/wx/x11/bitmap.h +++ b/include/wx/x11/bitmap.h @@ -34,6 +34,7 @@ class WXDLLIMPEXP_CORE wxMask: public wxObject { public: wxMask(); + wxMask(const wxMask& mask); wxMask( const wxBitmap& bitmap, const wxColour& colour ); wxMask( const wxBitmap& bitmap, int paletteIndex ); wxMask( const wxBitmap& bitmap ); @@ -53,6 +54,7 @@ public: private: WXPixmap m_bitmap; WXDisplay *m_display; + wxSize m_size; private: DECLARE_DYNAMIC_CLASS(wxMask) diff --git a/src/x11/bitmap.cpp b/src/x11/bitmap.cpp index fac57599b1..cded72e272 100644 --- a/src/x11/bitmap.cpp +++ b/src/x11/bitmap.cpp @@ -34,6 +34,10 @@ bool wxGetImageFromDrawable(GR_DRAW_ID drawable, int srcX, int srcY, int width, int height, wxImage& image); #endif +static WXPixmap wxGetSubPixmap( WXDisplay* xdisplay, WXPixmap xpixmap, + int x, int y, int width, int height, + int depth ); + #if wxUSE_XPM #if wxHAVE_LIB_XPM #include @@ -55,6 +59,24 @@ wxMask::wxMask() m_display = NULL; } +wxMask::wxMask(const wxMask& mask) +{ + m_display = mask.m_display; + if ( !mask.m_bitmap ) + { + m_bitmap = NULL; + return; + } + + m_size = mask.m_size; + + // Duplicate the mask bitmap using the existing wxGetSubPixmap() function. + // There are probably/surely better ways to do it. + m_bitmap = wxGetSubPixmap(m_display, mask.m_bitmap, + 0, 0, m_size.x, m_size.y, + 1); +} + wxMask::wxMask( const wxBitmap& bitmap, const wxColour& colour ) { m_bitmap = NULL; @@ -82,6 +104,8 @@ wxMask::~wxMask() bool wxMask::Create( const wxBitmap& bitmap, const wxColour& colour ) { + m_size = bitmap.GetSize(); + #if !wxUSE_NANOX if (m_bitmap) { -- 2.47.2