X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/99c67c777b7d7a6f0ea74823bff7b9c40379b5fa..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/gtk1/bitmap.cpp diff --git a/src/gtk1/bitmap.cpp b/src/gtk1/bitmap.cpp index 3e9ade68da..33b1a1f286 100644 --- a/src/gtk1/bitmap.cpp +++ b/src/gtk1/bitmap.cpp @@ -14,9 +14,11 @@ #include "wx/bitmap.h" #include "wx/icon.h" #include "wx/filefn.h" +#include "wx/image.h" + +#include "gdk/gdk.h" #include "gdk/gdkprivate.h" #include "gdk/gdkx.h" -#include "wx/image.h" //----------------------------------------------------------------------------- // wxMask @@ -29,16 +31,19 @@ wxMask::wxMask() m_bitmap = (GdkBitmap *) NULL; } -wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap), const wxColour& WXUNUSED(colour) ) +wxMask::wxMask( const wxBitmap& bitmap, const wxColour& colour ) { + Create( bitmap, colour ); } -wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap), int WXUNUSED(paletteIndex) ) +wxMask::wxMask( const wxBitmap& bitmap, int paletteIndex ) { + Create( bitmap, paletteIndex ); } -wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap) ) +wxMask::wxMask( const wxBitmap& bitmap ) { + Create( bitmap ); } wxMask::~wxMask() @@ -46,7 +51,60 @@ wxMask::~wxMask() if (m_bitmap) gdk_bitmap_unref( m_bitmap ); } -GdkBitmap *wxMask::GetBitmap(void) const +bool wxMask::Create( const wxBitmap& WXUNUSED(bitmap), + const wxColour& WXUNUSED(colour) ) +{ + if (m_bitmap) + { + gdk_bitmap_unref( m_bitmap ); + m_bitmap = (GdkBitmap*) NULL; + } + + wxFAIL_MSG( wxT("TODO") ); + + return FALSE; +} + +bool wxMask::Create( const wxBitmap& WXUNUSED(bitmap), + int WXUNUSED(paletteIndex) ) +{ + if (m_bitmap) + { + gdk_bitmap_unref( m_bitmap ); + m_bitmap = (GdkBitmap*) NULL; + } + + wxFAIL_MSG( wxT("not implemented") ); + + return FALSE; +} + +bool wxMask::Create( const wxBitmap& bitmap ) +{ + if (m_bitmap) + { + gdk_bitmap_unref( m_bitmap ); + m_bitmap = (GdkBitmap*) NULL; + } + + if (!bitmap.Ok()) return FALSE; + + wxCHECK_MSG( bitmap.GetBitmap(), FALSE, wxT("Cannot create mask from colour bitmap") ); + + m_bitmap = gdk_pixmap_new( (GdkWindow*) &gdk_root_parent, bitmap.GetWidth(), bitmap.GetHeight(), 1 ); + + if (!m_bitmap) return FALSE; + + GdkGC *gc = gdk_gc_new( m_bitmap ); + + gdk_draw_bitmap( m_bitmap, gc, bitmap.GetBitmap(), 0, 0, 0, 0, bitmap.GetWidth(), bitmap.GetHeight() ); + + gdk_gc_unref( gc ); + + return TRUE; +} + +GdkBitmap *wxMask::GetBitmap() const { return m_bitmap; } @@ -58,8 +116,8 @@ GdkBitmap *wxMask::GetBitmap(void) const class wxBitmapRefData: public wxObjectRefData { public: - wxBitmapRefData(void); - ~wxBitmapRefData(void); + wxBitmapRefData(); + ~wxBitmapRefData(); GdkPixmap *m_pixmap; GdkBitmap *m_bitmap; @@ -102,25 +160,35 @@ wxBitmap::wxBitmap() wxBitmap::wxBitmap( int width, int height, int depth ) { - wxCHECK_RET( (width > 0) && (height > 0), "invalid bitmap size" ) - wxCHECK_RET( (depth > 0) || (depth == -1), "invalid bitmap depth" ) - - m_refData = new wxBitmapRefData(); + wxCHECK_RET( (width > 0) && (height > 0), wxT("invalid bitmap size") ) GdkWindow *parent = (GdkWindow*) &gdk_root_parent; + if (depth == -1) depth = gdk_window_get_visual( parent )->depth; + wxCHECK_RET( (depth == gdk_window_get_visual( parent )->depth) || + (depth == 1), wxT("invalid bitmap depth") ) + + m_refData = new wxBitmapRefData(); M_BMPDATA->m_mask = (wxMask *) NULL; - M_BMPDATA->m_pixmap = gdk_pixmap_new( parent, width, height, depth ); M_BMPDATA->m_width = width; M_BMPDATA->m_height = height; - M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth; + if (depth == 1) + { + M_BMPDATA->m_bitmap = gdk_pixmap_new( parent, width, height, 1 ); + M_BMPDATA->m_bpp = 1; + } + else + { + M_BMPDATA->m_pixmap = gdk_pixmap_new( parent, width, height, depth ); + M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth; + } if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); } wxBitmap::wxBitmap( const char **bits ) { - wxCHECK_RET( bits != NULL, "invalid bitmap data" ) + wxCHECK_RET( bits != NULL, wxT("invalid bitmap data") ) m_refData = new wxBitmapRefData(); @@ -143,7 +211,7 @@ wxBitmap::wxBitmap( const char **bits ) wxBitmap::wxBitmap( char **bits ) { - wxCHECK_RET( bits != NULL, "invalid bitmap data" ) + wxCHECK_RET( bits != NULL, wxT("invalid bitmap data") ) m_refData = new wxBitmapRefData(); @@ -152,7 +220,7 @@ wxBitmap::wxBitmap( char **bits ) M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( parent, &mask, NULL, (gchar **) bits ); - wxCHECK_RET( M_BMPDATA->m_pixmap, "couldn't create pixmap" ); + wxCHECK_RET( M_BMPDATA->m_pixmap, wxT("couldn't create pixmap") ); if (mask) { @@ -191,7 +259,7 @@ wxBitmap::wxBitmap( const char bits[], int width, int height, int WXUNUSED(depth M_BMPDATA->m_height = height; M_BMPDATA->m_bpp = 1; - wxCHECK_RET( M_BMPDATA->m_bitmap, "couldn't create bitmap" ); + wxCHECK_RET( M_BMPDATA->m_bitmap, wxT("couldn't create bitmap") ); if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); } @@ -218,42 +286,42 @@ bool wxBitmap::operator != ( const wxBitmap& bmp ) return m_refData != bmp.m_refData; } -bool wxBitmap::Ok(void) const +bool wxBitmap::Ok() const { return (m_refData != NULL); } -int wxBitmap::GetHeight(void) const +int wxBitmap::GetHeight() const { - wxCHECK_MSG( Ok(), -1, "invalid bitmap" ); + wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); return M_BMPDATA->m_height; } -int wxBitmap::GetWidth(void) const +int wxBitmap::GetWidth() const { - wxCHECK_MSG( Ok(), -1, "invalid bitmap" ); + wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); return M_BMPDATA->m_width; } -int wxBitmap::GetDepth(void) const +int wxBitmap::GetDepth() const { - wxCHECK_MSG( Ok(), -1, "invalid bitmap" ); + wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); return M_BMPDATA->m_bpp; } -wxMask *wxBitmap::GetMask(void) const +wxMask *wxBitmap::GetMask() const { - wxCHECK_MSG( Ok(), (wxMask *) NULL, "invalid bitmap" ); + wxCHECK_MSG( Ok(), (wxMask *) NULL, wxT("invalid bitmap") ); return M_BMPDATA->m_mask; } void wxBitmap::SetMask( wxMask *mask ) { - wxCHECK_RET( Ok(), "invalid bitmap" ); + wxCHECK_RET( Ok(), wxT("invalid bitmap") ); if (M_BMPDATA->m_mask) delete M_BMPDATA->m_mask; @@ -262,12 +330,12 @@ void wxBitmap::SetMask( wxMask *mask ) bool wxBitmap::SaveFile( const wxString &name, int type, wxPalette *WXUNUSED(palette) ) { - wxCHECK_MSG( Ok(), FALSE, "invalid bitmap" ); + wxCHECK_MSG( Ok(), FALSE, wxT("invalid bitmap") ); - if (type == wxBITMAP_TYPE_PNG) + // Try to save the bitmap via wxImage handlers: { wxImage image( *this ); - if (image.Ok()) return image.SaveFile( name, type ); + if (image.Ok()) return image.SaveFile( name, type ); } return FALSE; @@ -286,7 +354,7 @@ bool wxBitmap::LoadFile( const wxString &name, int type ) GdkBitmap *mask = (GdkBitmap*) NULL; GdkWindow *parent = (GdkWindow*) &gdk_root_parent; - M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm( parent, &mask, NULL, name ); + M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm( parent, &mask, NULL, name.fn_str() ); if (mask) { @@ -297,25 +365,18 @@ 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 = gdk_window_get_visual( parent )->depth; } - else if (type == wxBITMAP_TYPE_PNG) - { - wxImage image; - image.LoadFile( name, type ); - if (image.Ok()) *this = image.ConvertToBitmap(); - } - else if (type == wxBITMAP_TYPE_BMP) + else // try if wxImage can load it { wxImage image; - image.LoadFile( name, type ); + if (!image.LoadFile( name, type )) return FALSE; if (image.Ok()) *this = image.ConvertToBitmap(); + else return FALSE; } - else - return FALSE; return TRUE; } -wxPalette *wxBitmap::GetPalette(void) const +wxPalette *wxBitmap::GetPalette() const { if (!Ok()) return (wxPalette *) NULL; @@ -350,18 +411,16 @@ void wxBitmap::SetPixmap( GdkPixmap *pixmap ) M_BMPDATA->m_pixmap = pixmap; } -GdkPixmap *wxBitmap::GetPixmap(void) const +GdkPixmap *wxBitmap::GetPixmap() const { - wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, "invalid bitmap" ); + wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, wxT("invalid bitmap") ); return M_BMPDATA->m_pixmap; } -GdkBitmap *wxBitmap::GetBitmap(void) const +GdkBitmap *wxBitmap::GetBitmap() const { - wxCHECK_MSG( Ok(), (GdkBitmap *) NULL, "invalid bitmap" ); + wxCHECK_MSG( Ok(), (GdkBitmap *) NULL, wxT("invalid bitmap") ); return M_BMPDATA->m_bitmap; } - -