X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b7cacb43db1e69b87b257a67912b4d52995b070a..68a9527d5185cdd9d3fef3d9421415c50de8794d:/src/gtk/bitmap.cpp diff --git a/src/gtk/bitmap.cpp b/src/gtk/bitmap.cpp index 1d9e3f82bd..37cf202e56 100644 --- a/src/gtk/bitmap.cpp +++ b/src/gtk/bitmap.cpp @@ -708,11 +708,6 @@ wxImage wxBitmap::ConvertToImage() const return image; } -bool wxBitmap::operator == ( const wxBitmap& bmp ) const -{ - return m_refData == bmp.m_refData; -} - bool wxBitmap::IsOk() const { return (m_refData != NULL) && @@ -754,6 +749,7 @@ void wxBitmap::SetMask( wxMask *mask ) { wxCHECK_RET( Ok(), wxT("invalid bitmap") ); + AllocExclusive(); delete M_BMPDATA->m_mask; M_BMPDATA->m_mask = mask; } @@ -857,25 +853,19 @@ void wxBitmap::SetPalette(const wxPalette& WXUNUSED(palette)) void wxBitmap::SetHeight( int height ) { - if (!m_refData) - m_refData = new wxBitmapRefData; - + AllocExclusive(); M_BMPDATA->m_height = height; } void wxBitmap::SetWidth( int width ) { - if (!m_refData) - m_refData = new wxBitmapRefData; - + AllocExclusive(); M_BMPDATA->m_width = width; } void wxBitmap::SetDepth( int depth ) { - if (!m_refData) - m_refData = new wxBitmapRefData; - + AllocExclusive(); M_BMPDATA->m_bpp = depth; } @@ -884,6 +874,8 @@ void wxBitmap::SetPixmap( GdkPixmap *pixmap ) if (!m_refData) m_refData = new wxBitmapRefData; + // AllocExclusive should not be needed for this internal function + wxASSERT(m_refData->GetRefCount() == 1); wxASSERT(M_BMPDATA->m_pixmap == NULL); M_BMPDATA->m_pixmap = pixmap; gdk_drawable_get_size(pixmap, &M_BMPDATA->m_width, &M_BMPDATA->m_height); @@ -983,6 +975,8 @@ void wxBitmap::SetPixbuf(GdkPixbuf* pixbuf, int depth) if (!m_refData) m_refData = new wxBitmapRefData; + // AllocExclusive should not be needed for this internal function + wxASSERT(m_refData->GetRefCount() == 1); wxASSERT(M_BMPDATA->m_pixbuf == NULL); M_BMPDATA->m_pixbuf = pixbuf; M_BMPDATA->m_width = gdk_pixbuf_get_width(pixbuf); @@ -1045,11 +1039,57 @@ void wxBitmap::UseAlpha() if (!gdk_pixbuf_get_has_alpha(pixbuf)) { M_BMPDATA->m_pixbuf = NULL; - SetPixbuf(gdk_pixbuf_add_alpha(pixbuf, false, 0, 0, 0)); + AllocExclusive(); + M_BMPDATA->m_pixbuf = gdk_pixbuf_add_alpha(pixbuf, false, 0, 0, 0); g_object_unref(pixbuf); } } +wxObjectRefData* wxBitmap::CreateRefData() const +{ + return new wxBitmapRefData; +} + +wxObjectRefData* wxBitmap::CloneRefData(const wxObjectRefData* data) const +{ + const wxBitmapRefData* oldRef = wx_static_cast(const wxBitmapRefData*, data); + wxBitmapRefData* newRef = new wxBitmapRefData; + newRef->m_width = oldRef->m_width; + newRef->m_height = oldRef->m_height; + newRef->m_bpp = oldRef->m_bpp; + if (oldRef->m_pixmap != NULL) + { + newRef->m_pixmap = gdk_pixmap_new( + oldRef->m_pixmap, oldRef->m_width, oldRef->m_height, + // use pixmap depth, m_bpp may not match + gdk_drawable_get_depth(oldRef->m_pixmap)); + GdkGC* gc = gdk_gc_new(newRef->m_pixmap); + gdk_draw_drawable( + newRef->m_pixmap, gc, oldRef->m_pixmap, 0, 0, 0, 0, -1, -1); + g_object_unref(gc); + } + if (oldRef->m_pixbuf != NULL) + { + newRef->m_pixbuf = gdk_pixbuf_copy(oldRef->m_pixbuf); + } + if (oldRef->m_mask != NULL) + { + newRef->m_mask = new wxMask; + newRef->m_mask->m_bitmap = gdk_pixmap_new( + oldRef->m_mask->m_bitmap, oldRef->m_width, oldRef->m_height, 1); + GdkGC* gc = gdk_gc_new(newRef->m_mask->m_bitmap); + gdk_draw_drawable(newRef->m_mask->m_bitmap, + gc, oldRef->m_mask->m_bitmap, 0, 0, 0, 0, -1, -1); + g_object_unref(gc); + } +#if wxUSE_PALETTE + // implement this if SetPalette is ever implemented + wxASSERT(oldRef->m_palette == NULL); +#endif + + return newRef; +} + //----------------------------------------------------------------------------- // wxBitmapHandler //-----------------------------------------------------------------------------