]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/bitmap.cpp
* Fixed a memory leak in wxThread
[wxWidgets.git] / src / gtk / bitmap.cpp
index 24abc0cbc40d451cc7f91572cb628c35bf936957..476a09919fec79fcb657e508e39af4f929508e31 100644 (file)
@@ -117,6 +117,29 @@ wxBitmap::wxBitmap( int width, int height, int depth )
     if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
 
+wxBitmap::wxBitmap( const char **bits )
+{
+    wxCHECK_RET( bits != NULL, "invalid bitmap data" )
+  
+    m_refData = new wxBitmapRefData();
+
+    GdkBitmap *mask = (GdkBitmap*) NULL;
+    GdkWindow *parent = (GdkWindow*) &gdk_root_parent;
+  
+    M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( parent, &mask, NULL, (gchar **) bits );
+    
+    if (mask)
+    {
+        M_BMPDATA->m_mask = new wxMask();
+        M_BMPDATA->m_mask->m_bitmap = mask;
+    }
+  
+    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;  // ?
+    if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
+}
+  
 wxBitmap::wxBitmap( char **bits )
 {
     wxCHECK_RET( bits != NULL, "invalid bitmap data" )
@@ -137,7 +160,6 @@ wxBitmap::wxBitmap( char **bits )
     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;  // ?
-   
     if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
   
@@ -205,33 +227,21 @@ bool wxBitmap::Ok(void) const
   
 int wxBitmap::GetHeight(void) const
 {
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return -1;
-    }
+    wxCHECK_MSG( Ok(), -1, "invalid bitmap" );
 
     return M_BMPDATA->m_height;
 }
 
 int wxBitmap::GetWidth(void) const
 {
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return -1;
-    }
+    wxCHECK_MSG( Ok(), -1, "invalid bitmap" );
   
     return M_BMPDATA->m_width;
 }
 
 int wxBitmap::GetDepth(void) const
 {
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return -1;
-    }
+    wxCHECK_MSG( Ok(), -1, "invalid bitmap" );
   
     return M_BMPDATA->m_bpp;
 }
@@ -265,22 +275,14 @@ void wxBitmap::SetDepth( int depth )
 
 wxMask *wxBitmap::GetMask(void) const
 {
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return (wxMask *) NULL;
-    }
+    wxCHECK_MSG( Ok(), (wxMask *) NULL, "invalid bitmap" );
   
     return M_BMPDATA->m_mask;
 }
 
 void wxBitmap::SetMask( wxMask *mask )
 {
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return;
-    }
+    wxCHECK_RET( Ok(), "invalid bitmap" );
   
     if (M_BMPDATA->m_mask) delete M_BMPDATA->m_mask;
   
@@ -289,11 +291,7 @@ void wxBitmap::SetMask( wxMask *mask )
 
 bool wxBitmap::SaveFile( const wxString &name, int type, wxPalette *WXUNUSED(palette) )
 {
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return FALSE;
-    }
+    wxCHECK_MSG( Ok(), FALSE, "invalid bitmap" );
   
     if (type == wxBITMAP_TYPE_PNG)
     {
@@ -349,27 +347,20 @@ bool wxBitmap::LoadFile( const wxString &name, int type )
 wxPalette *wxBitmap::GetPalette(void) const
 {
     if (!Ok()) return (wxPalette *) NULL;
+    
     return M_BMPDATA->m_palette;
 }
 
 GdkPixmap *wxBitmap::GetPixmap(void) const
 {
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return (GdkPixmap *) NULL;
-    }
+    wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, "invalid bitmap" );
   
     return M_BMPDATA->m_pixmap;
 }
   
 GdkBitmap *wxBitmap::GetBitmap(void) const
 {
-    if (!Ok())
-    {
-      wxFAIL_MSG( "invalid bitmap" );
-      return (GdkBitmap *) NULL;
-    }
+    wxCHECK_MSG( Ok(), (GdkBitmap *) NULL, "invalid bitmap" );
   
     return M_BMPDATA->m_bitmap;
 }
@@ -411,17 +402,18 @@ wxBitmap::wxBitmap( const wxImage &image )
   
     // Retrieve depth  
   
-    M_BMPDATA->m_bpp = data_image->depth;
-  
-    int render_depth = 8;
-    if (M_BMPDATA->m_bpp > 8) render_depth = M_BMPDATA->m_bpp;
-  
+    GdkVisual *visual = gdk_window_get_visual( M_BMPDATA->m_pixmap );
+    if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
+    int bpp = visual->depth;
+    if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
+    if (bpp < 8) bpp = 8;
+    
     // Render
 
     enum byte_order { RGB, RBG, BRG, BGR, GRB, GBR };
     byte_order b_o = RGB;
   
-    if (render_depth >= 24)
+    if (bpp >= 24)
     {
         GdkVisual *visual = gdk_visual_get_system();
         if ((visual->red_mask > visual->green_mask) && (visual->green_mask > visual->blue_mask))      b_o = RGB;
@@ -452,13 +444,13 @@ wxBitmap::wxBitmap( const wxImage &image )
        
            if (image.HasMask())
            {
-               if ((r == r_mask) && (b = b_mask) && (g = g_mask))
-                   gdk_image_put_pixel( mask_image, x, y, 0 );
-               else
+               if ((r == r_mask) && (b == b_mask) && (g == g_mask))
                    gdk_image_put_pixel( mask_image, x, y, 1 );
+               else
+                   gdk_image_put_pixel( mask_image, x, y, 0 );
            }
        
-           switch (render_depth)
+           switch (bpp)
            {
                case 8:
                {
@@ -538,11 +530,7 @@ wxImage wxBitmap::ConvertToImage() const
 {
     wxImage image;
 
-    if (!Ok())
-    {
-        wxFAIL_MSG( "invalid bitmap" );
-        return image;
-    }
+    wxCHECK_MSG( Ok(), image, "invalid bitmap" );
   
     GdkImage *gdk_image = gdk_image_get( M_BMPDATA->m_pixmap, 0, 0, M_BMPDATA->m_width, M_BMPDATA->m_height );
   
@@ -554,7 +542,8 @@ wxImage wxBitmap::ConvertToImage() const
     GdkVisual *visual = gdk_window_get_visual( M_BMPDATA->m_pixmap );
     if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
     int bpp = visual->depth;
-  
+    if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
+
     GdkColormap *cmap = gtk_widget_get_default_colormap();
   
     long pos = 0;