]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/image.cpp
fixed memory leaks
[wxWidgets.git] / src / common / image.cpp
index 38d807f19eab147e8021b73ca1cecce0c3364e57..58dec0c3b65742abf452d68a6a371191db29235f 100644 (file)
@@ -857,7 +857,7 @@ wxBitmap wxImage::ConvertToBitmap() const
     if( HasMask() )
     {
         hbitmap = ::CreateBitmap( (WORD)width, (WORD)bmpHeight, 1, 1, NULL );
-        ::SelectObject( memdc, hbitmap);
+        HGDIOBJ hbmpOld = ::SelectObject( memdc, hbitmap);
         if( numDIB == 1 )   height = bmpHeight;
         else                height = sizeLimit/bytePerLine;
         lpDIBh->bmiHeader.biHeight = (DWORD)(-height);
@@ -917,10 +917,11 @@ wxBitmap wxImage::ConvertToBitmap() const
         wxMask *mask = new wxMask( bitmap, colour );
         bitmap.SetMask( mask );
         */
+
+        ::SelectObject( memdc, hbmpOld );
     }
 
     // free allocated resources
-    ::SelectObject( memdc, 0 );
     ::DeleteDC( memdc );
     ::ReleaseDC(NULL, hdc);
     free(lpDIBh);
@@ -1290,6 +1291,8 @@ wxImage::wxImage( const wxBitmap &bitmap )
 #include <gdk/gdkrgb.h>
 #endif
 
+extern GtkWidget *wxRootWindow;
+
 wxBitmap wxImage::ConvertToMonoBitmap( unsigned char red, unsigned char green, unsigned char blue )
 {
     wxBitmap bitmap;
@@ -1302,16 +1305,19 @@ wxBitmap wxImage::ConvertToMonoBitmap( unsigned char red, unsigned char green, u
     bitmap.SetHeight( height );
     bitmap.SetWidth( width );
 
-    bitmap.SetBitmap( gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 ) );
+    bitmap.SetBitmap( gdk_pixmap_new( wxRootWindow->window, width, height, 1 ) );
     
     bitmap.SetDepth( 1 );
 
+    GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window );
+    wxASSERT( visual );
+    
     // Create picture image
 
     unsigned char *data_data = (unsigned char*)malloc( ((width >> 3)+8) * height );
     
     GdkImage *data_image =
-        gdk_image_new_bitmap( gdk_visual_get_system(), data_data, width, height );
+        gdk_image_new_bitmap( visual, data_data, width, height );
 
     // Create mask image
 
@@ -1321,10 +1327,10 @@ wxBitmap wxImage::ConvertToMonoBitmap( unsigned char red, unsigned char green, u
     {
         unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height );
 
-        mask_image =  gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height );
+        mask_image =  gdk_image_new_bitmap( visual, mask_data, width, height );
 
         wxMask *mask = new wxMask();
-        mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
+        mask->m_bitmap = gdk_pixmap_new( wxRootWindow->window, width, height, 1 );
 
         bitmap.SetMask( mask );
     }
@@ -1400,12 +1406,13 @@ wxBitmap wxImage::ConvertToBitmap() const
     bitmap.SetHeight( height );
     bitmap.SetWidth( width );
 
-    bitmap.SetPixmap( gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, -1 ) );
+    bitmap.SetPixmap( gdk_pixmap_new( wxRootWindow->window, width, height, -1 ) );
 
-     // Retrieve depth
+    // Retrieve depth
 
-    GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
-    if (visual == NULL) visual = gdk_visual_get_system();
+    GdkVisual *visual = gdk_window_get_visual( wxRootWindow->window );
+    wxASSERT( visual );
+    
     int bpp = visual->depth;
 
     bitmap.SetDepth( bpp );
@@ -1445,7 +1452,7 @@ wxBitmap wxImage::ConvertToBitmap() const
     // Create picture image
 
     GdkImage *data_image =
-        gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), width, height );
+        gdk_image_new( GDK_IMAGE_FASTEST, visual, width, height );
 
     // Create mask image
 
@@ -1455,10 +1462,10 @@ wxBitmap wxImage::ConvertToBitmap() const
     {
         unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height );
 
-        mask_image =  gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height );
+        mask_image =  gdk_image_new_bitmap( visual, mask_data, width, height );
 
         wxMask *mask = new wxMask();
-        mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
+        mask->m_bitmap = gdk_pixmap_new( wxRootWindow->window, width, height, 1 );
 
         bitmap.SetMask( mask );
     }
@@ -1470,7 +1477,6 @@ wxBitmap wxImage::ConvertToBitmap() const
 
     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;
         else if ((visual->red_mask > visual->blue_mask) && (visual->blue_mask > visual->green_mask))  b_o = RGB;
         else if ((visual->blue_mask > visual->red_mask) && (visual->red_mask > visual->green_mask))   b_o = BRG;
@@ -1646,7 +1652,7 @@ wxImage::wxImage( const wxBitmap &bitmap )
     {
         GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
 
-        if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
+        if (visual == NULL) visual = gdk_window_get_visual( wxRootWindow->window );
         bpp = visual->depth;
         if (bpp == 16) bpp = visual->red_prec + visual->green_prec + visual->blue_prec;
         red_shift_right = visual->red_shift;