X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e8508ea8a890c90e6e72b2579780ca2ccbf40270..74b1f0b45e0f0bc7e25c5f32bb495e3e4bcd3392:/src/motif/bmpmotif.cpp?ds=sidebyside diff --git a/src/motif/bmpmotif.cpp b/src/motif/bmpmotif.cpp index c0b958ab78..51caa8e009 100644 --- a/src/motif/bmpmotif.cpp +++ b/src/motif/bmpmotif.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: bitmap.cpp +// Name: src/motif/bmpmotif.cpp // Purpose: wxBitmap // Author: Julian Smart, originally in bitmap.cpp // Modified by: @@ -9,17 +9,15 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "bmpmotif.h" -#endif - -#ifdef __VMS -#define XtParent XTPARENT -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" -#include "wx/defs.h" #include "wx/motif/bmpmotif.h" +#ifndef WX_PRECOMP + #include "wx/math.h" +#endif + #ifdef __VMS__ #pragma message disable nosimpint #endif @@ -33,10 +31,14 @@ #if wxHAVE_LIB_XPM #include #endif -#include Pixmap XCreateInsensitivePixmap( Display *display, Pixmap pixmap ); +static inline wxCharBuffer GetCacheImageName(WXImage image) +{ + return wxString::Format(wxT("wxBitmap_%p"), image).ToAscii(); +} + wxBitmapCache::~wxBitmapCache() { if( m_display ) @@ -63,7 +65,7 @@ wxBitmapCache::~wxBitmapCache() void wxBitmapCache::SetBitmap( const wxBitmap& bitmap ) { - if( m_bitmap != bitmap ) + if ( !m_bitmap.IsSameAs(bitmap) ) { InvalidateCache(); m_bitmap = bitmap; @@ -72,7 +74,7 @@ void wxBitmapCache::SetBitmap( const wxBitmap& bitmap ) { XmUninstallImage( (XImage*)m_image ); XtFree( (char*)(XImage*)m_image ); - m_image = (WXImage*)NULL; + m_image = NULL; } } } @@ -99,7 +101,7 @@ void wxBitmapCache::CreateImageIfNeeded( WXWidget w ) (WXDisplay*)wxGetDisplay(); XImage *ximage = XGetImage( (Display*)m_display, - (Drawable)m_bitmap.GetPixmap(), + (Drawable)m_bitmap.GetDrawable(), 0, 0, m_bitmap.GetWidth(), m_bitmap.GetHeight(), AllPlanes, ZPixmap ); @@ -108,12 +110,26 @@ void wxBitmapCache::CreateImageIfNeeded( WXWidget w ) if( m_image ) { - char tmp[128]; - sprintf( tmp, "Im%x", (unsigned int)ximage ); - XmInstallImage( ximage, tmp ); + XmInstallImage( ximage, GetCacheImageName(m_image).data() ); } } +WXPixmap wxBitmapCache::GetPixmapFromCache(WXWidget w) +{ + Widget widget = (Widget)w; + while( XmIsGadget( widget ) ) + widget = XtParent( widget ); + + WXPixel fg, bg; + XtVaGetValues( widget, + XmNbackground, &bg, + XmNforeground, &fg, + NULL ); + + Screen* screen = DefaultScreenOfDisplay( (Display*)m_display ); + return (WXPixmap)XmGetPixmap(screen, GetCacheImageName(m_image).data(), fg, bg); +} + WXPixmap wxBitmapCache::GetLabelPixmap( WXWidget w ) { if( m_labelPixmap && !m_recalcPixmaps.label ) @@ -129,21 +145,7 @@ WXPixmap wxBitmapCache::GetLabelPixmap( WXWidget w ) if( !m_image ) return (WXPixmap)NULL; - char tmp[128]; - sprintf( tmp, "Im%x", (unsigned int)m_image ); - - Pixel fg, bg; - Widget widget = (Widget)w; - - while( XmIsGadget( widget ) ) - widget = XtParent( widget ); - XtVaGetValues( widget, - XmNbackground, &bg, - XmNforeground, &fg, - NULL ); - - m_labelPixmap = (WXPixmap)XmGetPixmap( screen, tmp, fg, bg ); - + m_labelPixmap = GetPixmapFromCache(w); m_recalcPixmaps.label = !m_labelPixmap; return m_labelPixmap; } @@ -163,19 +165,7 @@ WXPixmap wxBitmapCache::GetArmPixmap( WXWidget w ) if( !m_image ) return (WXPixmap)NULL; - char tmp[128]; - sprintf( tmp, "Im%x", (unsigned int)m_image ); - - Pixel fg, bg; - Widget widget = (Widget) w; - - XtVaGetValues( widget, XmNarmColor, &bg, NULL ); - while( XmIsGadget( widget ) ) - widget = XtParent( widget ); - XtVaGetValues( widget, XmNforeground, &fg, NULL ); - - m_armPixmap = (WXPixmap)XmGetPixmap( screen, tmp, fg, bg ); - + m_armPixmap = GetPixmapFromCache(w); m_recalcPixmaps.arm = !m_armPixmap; return m_armPixmap; } @@ -197,7 +187,7 @@ WXPixmap wxBitmapCache::GetInsensPixmap( WXWidget w ) m_insensPixmap = (WXPixmap)XCreateInsensitivePixmap( (Display*)m_display, - (Pixmap)m_bitmap.GetPixmap() ); + (Pixmap)m_bitmap.GetDrawable() ); m_recalcPixmaps.insens = !m_insensPixmap; return m_insensPixmap; @@ -273,7 +263,7 @@ XCreateInsensitivePixmap( Display *display, Pixmap pixmap ) stipple = XCreateBitmapFromData( display, pixmap, stipple_data, 16, 16 ); if ( 0 != stipple ) { - gc = XCreateGC( display, pixmap, (XtGCMask)0, (XGCValues*)NULL ); + gc = XCreateGC( display, pixmap, (XtGCMask)0, NULL ); if ( NULL != gc ) { /* Create an identical copy of the argument pixmap.