X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5f01ae00e0597d24b76e54aff7a8f369ab83c15..88594d02eb59a55ac85d3210a49d02918124617b:/src/gtk/bitmap.cpp diff --git a/src/gtk/bitmap.cpp b/src/gtk/bitmap.cpp index 170e8daf4f..1f62c2a11b 100644 --- a/src/gtk/bitmap.cpp +++ b/src/gtk/bitmap.cpp @@ -11,6 +11,9 @@ #pragma implementation "bitmap.h" #endif +#include "wx/defs.h" + +#include "wx/palette.h" #include "wx/bitmap.h" #include "wx/icon.h" #include "wx/filefn.h" @@ -40,7 +43,7 @@ extern void gdk_wx_draw_bitmap (GdkDrawable *drawable, // data //----------------------------------------------------------------------------- -extern GtkWidget *wxRootWindow; +extern GtkWidget *wxGetRootWindow(); //----------------------------------------------------------------------------- // wxMask @@ -89,7 +92,7 @@ bool wxMask::Create( const wxBitmap& bitmap, wxImage image( bitmap ); if (!image.Ok()) return FALSE; - m_bitmap = gdk_pixmap_new( wxRootWindow->window, image.GetWidth(), image.GetHeight(), 1 ); + m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, image.GetWidth(), image.GetHeight(), 1 ); GdkGC *gc = gdk_gc_new( m_bitmap ); GdkColor color; @@ -108,9 +111,9 @@ bool wxMask::Create( const wxBitmap& bitmap, unsigned char green = colour.Green(); unsigned char blue = colour.Blue(); - GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window ); + GdkVisual *visual = gdk_window_get_visual( wxGetRootWindow()->window ); wxASSERT( visual ); - + int bpp = visual->depth; if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15; if (bpp == 15) @@ -170,7 +173,7 @@ bool wxMask::Create( const wxBitmap& bitmap, int paletteIndex ) wxPalette *pal = bitmap.GetPalette(); wxCHECK_MSG( pal, FALSE, wxT("Cannot create mask from bitmap without palette") ); - + pal->GetRGB(paletteIndex, &r, &g, &b); return Create(bitmap, wxColour(r, g, b)); @@ -188,7 +191,7 @@ bool wxMask::Create( const wxBitmap& bitmap ) wxCHECK_MSG( bitmap.GetBitmap(), FALSE, wxT("Cannot create mask from colour bitmap") ); - m_bitmap = gdk_pixmap_new( wxRootWindow->window, bitmap.GetWidth(), bitmap.GetHeight(), 1 ); + m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, bitmap.GetWidth(), bitmap.GetHeight(), 1 ); if (!m_bitmap) return FALSE; @@ -252,14 +255,11 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmap,wxGDIObject) wxBitmap::wxBitmap() { - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); } wxBitmap::wxBitmap( int width, int height, int depth ) { Create( width, height, depth ); - - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); } bool wxBitmap::Create( int width, int height, int depth ) @@ -268,7 +268,7 @@ bool wxBitmap::Create( int width, int height, int depth ) wxCHECK_MSG( (width > 0) && (height > 0), FALSE, wxT("invalid bitmap size") ) - GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window ); + GdkVisual *visual = gdk_window_get_visual( wxGetRootWindow()->window ); wxASSERT( visual ); if (depth == -1) depth = visual->depth; @@ -282,12 +282,12 @@ bool wxBitmap::Create( int width, int height, int depth ) M_BMPDATA->m_height = height; if (depth == 1) { - M_BMPDATA->m_bitmap = gdk_pixmap_new( wxRootWindow->window, width, height, 1 ); + M_BMPDATA->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ); M_BMPDATA->m_bpp = 1; } else { - M_BMPDATA->m_pixmap = gdk_pixmap_new( wxRootWindow->window, width, height, depth ); + M_BMPDATA->m_pixmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, depth ); M_BMPDATA->m_bpp = visual->depth; } @@ -298,14 +298,14 @@ bool wxBitmap::CreateFromXpm( const char **bits ) { wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid bitmap data") ) - GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window ); + GdkVisual *visual = gdk_window_get_visual( wxGetRootWindow()->window ); wxASSERT( visual ); - + m_refData = new wxBitmapRefData(); GdkBitmap *mask = (GdkBitmap*) NULL; - M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( wxRootWindow->window, &mask, NULL, (gchar **) bits ); + M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( wxGetRootWindow()->window, &mask, NULL, (gchar **) bits ); wxCHECK_MSG( M_BMPDATA->m_pixmap, FALSE, wxT("couldn't create pixmap") ); @@ -318,22 +318,16 @@ bool wxBitmap::CreateFromXpm( const char **bits ) gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); M_BMPDATA->m_bpp = visual->depth; // ? - - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); return TRUE; } -extern GtkWidget *wxRootWindow; - bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) { wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") ) wxCHECK_MSG( depth == -1 || depth == 1, FALSE, wxT("invalid bitmap depth") ) m_refData = new wxBitmapRefData(); - - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); // ------ // convertion to mono bitmap: @@ -346,11 +340,11 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) SetHeight( height ); SetWidth( width ); - SetBitmap( gdk_pixmap_new( wxRootWindow->window, width, height, 1 ) ); + SetBitmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ) ); SetDepth( 1 ); - GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window ); + GdkVisual *visual = gdk_window_get_visual( wxGetRootWindow()->window ); wxASSERT( visual ); // Create picture image @@ -371,7 +365,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) mask_image = gdk_image_new_bitmap( visual, mask_data, width, height ); wxMask *mask = new wxMask(); - mask->m_bitmap = gdk_pixmap_new( wxRootWindow->window, width, height, 1 ); + mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ); SetMask( mask ); } @@ -431,7 +425,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) gdk_gc_unref( mask_gc ); } } - + // ------ // convertion to colour bitmap: // ------ @@ -443,11 +437,11 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) SetHeight( height ); SetWidth( width ); - SetPixmap( gdk_pixmap_new( wxRootWindow->window, width, height, -1 ) ); + SetPixmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, -1 ) ); // Retrieve depth - GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window ); + GdkVisual *visual = gdk_window_get_visual( wxGetRootWindow()->window ); wxASSERT( visual ); int bpp = visual->depth; @@ -501,7 +495,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) mask_image = gdk_image_new_bitmap( visual, mask_data, width, height ); wxMask *mask = new wxMask(); - mask->m_bitmap = gdk_pixmap_new( wxRootWindow->window, width, height, 1 ); + mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ); SetMask( mask ); } @@ -636,7 +630,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) wxImage wxBitmap::ConvertToImage() const { wxImage image; - + wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") ); GdkImage *gdk_image = (GdkImage*) NULL; @@ -657,7 +651,7 @@ wxImage wxBitmap::ConvertToImage() const } wxCHECK_MSG( gdk_image, wxNullImage, wxT("couldn't create image") ); - + image.Create( GetWidth(), GetHeight() ); char unsigned *data = image.GetData(); @@ -691,7 +685,7 @@ wxImage wxBitmap::ConvertToImage() const { GdkVisual *visual = gdk_window_get_visual( GetPixmap() ); - if (visual == NULL) visual = gdk_window_get_visual( wxRootWindow->window ); + if (visual == NULL) visual = gdk_window_get_visual( wxGetRootWindow()->window ); bpp = visual->depth; if (bpp == 16) bpp = visual->red_prec + visual->green_prec + visual->blue_prec; red_shift_right = visual->red_shift; @@ -765,7 +759,7 @@ wxImage wxBitmap::ConvertToImage() const } gdk_image_destroy( gdk_image ); - if (gdk_image_mask) gdk_image_destroy( gdk_image_mask ); + if (gdk_image_mask) gdk_image_destroy( gdk_image_mask ); return image; } @@ -773,15 +767,11 @@ wxImage wxBitmap::ConvertToImage() const wxBitmap::wxBitmap( const wxBitmap& bmp ) { Ref( bmp ); - - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); } wxBitmap::wxBitmap( const wxString &filename, int type ) { LoadFile( filename, type ); - - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); } wxBitmap::wxBitmap( const char bits[], int width, int height, int WXUNUSED(depth)) @@ -790,25 +780,23 @@ wxBitmap::wxBitmap( const char bits[], int width, int height, int WXUNUSED(depth M_BMPDATA->m_mask = (wxMask *) NULL; M_BMPDATA->m_bitmap = - gdk_bitmap_create_from_data( wxRootWindow->window, (gchar *) bits, width, height ); + gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) bits, width, height ); M_BMPDATA->m_width = width; M_BMPDATA->m_height = height; M_BMPDATA->m_bpp = 1; wxCHECK_RET( M_BMPDATA->m_bitmap, wxT("couldn't create bitmap") ); - - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); } wxBitmap::~wxBitmap() { - if (wxTheBitmapList) wxTheBitmapList->DeleteObject(this); } wxBitmap& wxBitmap::operator = ( const wxBitmap& bmp ) { - if (*this == bmp) return (*this); - Ref( bmp ); + if ( m_refData != bmp.m_refData ) + Ref( bmp ); + return *this; } @@ -864,6 +852,12 @@ void wxBitmap::SetMask( wxMask *mask ) M_BMPDATA->m_mask = mask; } +bool wxBitmap::CopyFromIcon(const wxIcon& icon) +{ + *this = icon; + return TRUE; +} + wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const { wxCHECK_MSG( Ok() && @@ -890,7 +884,7 @@ wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const if (GetMask()) { wxMask *mask = new wxMask; - mask->m_bitmap = gdk_pixmap_new( wxRootWindow->window, rect.width, rect.height, 1 ); + mask->m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, rect.width, rect.height, 1 ); GdkGC *gc = gdk_gc_new( mask->m_bitmap ); gdk_wx_draw_bitmap( mask->m_bitmap, gc, M_BMPDATA->m_mask->m_bitmap, 0, 0, rect.x, rect.y, rect.width, rect.height ); @@ -921,16 +915,16 @@ bool wxBitmap::LoadFile( const wxString &name, int type ) if (!wxFileExists(name)) return FALSE; - GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window ); + GdkVisual *visual = gdk_window_get_visual( wxGetRootWindow()->window ); wxASSERT( visual ); - + if (type == wxBITMAP_TYPE_XPM) { m_refData = new wxBitmapRefData(); GdkBitmap *mask = (GdkBitmap*) NULL; - M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm( wxRootWindow->window, &mask, NULL, name.fn_str() ); + M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm( wxGetRootWindow()->window, &mask, NULL, name.fn_str() ); if (mask) { @@ -939,7 +933,7 @@ bool wxBitmap::LoadFile( const wxString &name, int type ) } gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); - + M_BMPDATA->m_bpp = visual->depth; } else // try if wxImage can load it