]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/bitmap.cpp
Integrated fixes from latest UNIX version.
[wxWidgets.git] / src / gtk / bitmap.cpp
index 4f5ad6a77057bf7b0f46941dd0731a09777488ce..033071565ef845fdc622e3258135bef48b7be14c 100644 (file)
 #include "wx/dcmemory.h"
 #include "wx/app.h"
 
 #include "wx/dcmemory.h"
 #include "wx/app.h"
 
+#ifdef __WXGTK20__
+    // need this to get gdk_image_new_bitmap()
+    #define GDK_ENABLE_BROKEN
+#endif
+
 #include <gdk/gdk.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
 
 #include <gdk/gdk.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
 
-#if (GTK_MINOR_VERSION > 0)
-#include <gdk/gdkrgb.h>
-#endif
+#ifdef __WXGTK20__
+    #include <gdk/gdkimage.h>
+#else // GTK+ 1.2
+    #include <gdk/gdkrgb.h>
+#endif // GTK+ 2.0/1.2
 
 extern void gdk_wx_draw_bitmap     (GdkDrawable  *drawable,
                           GdkGC               *gc,
 
 extern void gdk_wx_draw_bitmap     (GdkDrawable  *drawable,
                           GdkGC               *gc,
@@ -89,7 +96,7 @@ bool wxMask::Create( const wxBitmap& bitmap,
         m_bitmap = (GdkBitmap*) NULL;
     }
 
         m_bitmap = (GdkBitmap*) NULL;
     }
 
-    wxImage image( bitmap );
+    wxImage image = bitmap.ConvertToImage();
     if (!image.Ok()) return FALSE;
 
     m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, image.GetWidth(), image.GetHeight(), 1 );
     if (!image.Ok()) return FALSE;
 
     m_bitmap = gdk_pixmap_new( wxGetRootWindow()->window, image.GetWidth(), image.GetHeight(), 1 );
@@ -300,6 +307,8 @@ bool wxBitmap::Create( int width, int height, int depth )
 
 bool wxBitmap::CreateFromXpm( const char **bits )
 {
 
 bool wxBitmap::CreateFromXpm( const char **bits )
 {
+    UnRef();
+
     wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid bitmap data") )
 
     GdkVisual *visual = wxTheApp->GetGdkVisual();
     wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid bitmap data") )
 
     GdkVisual *visual = wxTheApp->GetGdkVisual();
@@ -319,14 +328,16 @@ bool wxBitmap::CreateFromXpm( const char **bits )
     }
 
     gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
     }
 
     gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
-
-    M_BMPDATA->m_bpp = visual->depth;  // ?
+    
+    M_BMPDATA->m_bpp = visual->depth;  // Can we get a different depth from create_from_xpm_d() ?
 
     return TRUE;
 }
 
 bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
 {
 
     return TRUE;
 }
 
 bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
 {
+    UnRef();
+
     wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") )
     wxCHECK_MSG( depth == -1 || depth == 1, FALSE, wxT("invalid bitmap depth") )
 
     wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") )
     wxCHECK_MSG( depth == -1 || depth == 1, FALSE, wxT("invalid bitmap depth") )
 
@@ -346,7 +357,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
         SetBitmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ) );
 
         SetDepth( 1 );
         SetBitmap( gdk_pixmap_new( wxGetRootWindow()->window, width, height, 1 ) );
 
         SetDepth( 1 );
-
+        
         GdkVisual *visual = wxTheApp->GetGdkVisual();
 
         // Create picture image
         GdkVisual *visual = wxTheApp->GetGdkVisual();
 
         // Create picture image
@@ -446,7 +457,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
         int bpp = visual->depth;
 
         SetDepth( bpp );
         int bpp = visual->depth;
 
         SetDepth( bpp );
-
+        
         if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
         if (bpp < 8) bpp = 8;
 
         if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
         if (bpp < 8) bpp = 8;
 
@@ -510,7 +521,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
         if (bpp > 8)
         {
             if ((visual->red_mask > visual->green_mask) && (visual->green_mask > visual->blue_mask))      b_o = RGB;
         if (bpp > 8)
         {
             if ((visual->red_mask > visual->green_mask) && (visual->green_mask > visual->blue_mask))      b_o = RGB;
-            else if ((visual->red_mask > visual->blue_mask) && (visual->blue_mask > visual->green_mask))  b_o = RGB;
+            else if ((visual->red_mask > visual->blue_mask) && (visual->blue_mask > visual->green_mask))  b_o = RBG;
             else if ((visual->blue_mask > visual->red_mask) && (visual->red_mask > visual->green_mask))   b_o = BRG;
             else if ((visual->blue_mask > visual->green_mask) && (visual->green_mask > visual->red_mask)) b_o = BGR;
             else if ((visual->green_mask > visual->red_mask) && (visual->red_mask > visual->blue_mask))   b_o = GRB;
             else if ((visual->blue_mask > visual->red_mask) && (visual->red_mask > visual->green_mask))   b_o = BRG;
             else if ((visual->blue_mask > visual->green_mask) && (visual->green_mask > visual->red_mask)) b_o = BGR;
             else if ((visual->green_mask > visual->red_mask) && (visual->red_mask > visual->blue_mask))   b_o = GRB;
@@ -691,7 +702,7 @@ wxImage wxBitmap::ConvertToImage() const
 
     image.Create( GetWidth(), GetHeight() );
     char unsigned *data = image.GetData();
 
     image.Create( GetWidth(), GetHeight() );
     char unsigned *data = image.GetData();
-
+    
     if (!data)
     {
         gdk_image_destroy( gdk_image );
     if (!data)
     {
         gdk_image_destroy( gdk_image );
@@ -803,6 +814,7 @@ wxImage wxBitmap::ConvertToImage() const
 }
 
 wxBitmap::wxBitmap( const wxBitmap& bmp )
 }
 
 wxBitmap::wxBitmap( const wxBitmap& bmp )
+    : wxGDIObject()
 {
     Ref( bmp );
 }
 {
     Ref( bmp );
 }
@@ -940,7 +952,7 @@ bool wxBitmap::SaveFile( const wxString &name, int type, wxPalette *WXUNUSED(pal
 
     // Try to save the bitmap via wxImage handlers:
     {
 
     // Try to save the bitmap via wxImage handlers:
     {
-        wxImage image( *this );
+        wxImage image = ConvertToImage();
         if (image.Ok()) return image.SaveFile( name, type );
     }
 
         if (image.Ok()) return image.SaveFile( name, type );
     }
 
@@ -977,7 +989,8 @@ bool wxBitmap::LoadFile( const wxString &name, int type )
     {
         wxImage image;
         if (!image.LoadFile( name, type )) return FALSE;
     {
         wxImage image;
         if (!image.LoadFile( name, type )) return FALSE;
-        if (image.Ok()) *this = image.ConvertToBitmap();
+        if (image.Ok())
+            *this = wxBitmap(image);
         else return FALSE;
     }
 
         else return FALSE;
     }