Blob Blame History Raw
From 7aa624ba01a89c23e25d7d67b3fd54b4a9ae4084 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@gmail.com>
Date: Mon, 8 Apr 2013 22:45:50 +0200
Subject: [PATCH] win32: free allocated gdi objects in 16bpp

In 16bpp, Gdk is creating hbitmap with CreateDIBSection() and a hdc with
CreateCompatibleDC(). Those 2 objects need to be released when the
pixmap is finalized.

https://bugzilla.gnome.org/show_bug.cgi?id=671538
---
 gdk/win32/gdkpixmap-win32.c | 7 +++++++
 gdk/win32/gdkpixmap-win32.h | 1 +
 2 files changed, 8 insertions(+)

diff --git a/gdk/win32/gdkpixmap-win32.c b/gdk/win32/gdkpixmap-win32.c
index 6d18ca4..53c6f3c 100644
--- a/gdk/win32/gdkpixmap-win32.c
+++ b/gdk/win32/gdkpixmap-win32.c
@@ -121,6 +121,11 @@ gdk_pixmap_impl_win32_finalize (GObject *object)
       /* Drop our reference */
       cairo_surface_destroy (drawable_impl->cairo_surface);
       drawable_impl->cairo_surface = NULL;
+
+      if (impl->is_allocated) {
+          GDI_CALL (DeleteDC, (drawable_impl->hdc));
+          DeleteObject (GDK_PIXMAP_HBITMAP (wrapper));
+      }
     }
 
   _gdk_win32_drawable_finish (GDK_DRAWABLE (object));
@@ -264,6 +269,8 @@ _gdk_pixmap_new (GdkDrawable *drawable,
       HWND hwnd;
       GdkVisual *visual;
 
+      pixmap_impl->is_allocated = TRUE;
+
       if (GDK_IS_WINDOW (drawable))
 	hwnd = GDK_WINDOW_HWND (drawable);
       else
diff --git a/gdk/win32/gdkpixmap-win32.h b/gdk/win32/gdkpixmap-win32.h
index fbeb28f..e9d965d 100644
--- a/gdk/win32/gdkpixmap-win32.h
+++ b/gdk/win32/gdkpixmap-win32.h
@@ -53,6 +53,7 @@ struct _GdkPixmapImplWin32
   gint height;
   guchar *bits;
   guint is_foreign : 1;
+  guint is_allocated : 1;
 };
  
 struct _GdkPixmapImplWin32Class 
-- 
1.8.1.1.439.g50a6b54