diff options
author | Tor Lillqvist <tml@novell.com> | 2005-06-04 21:43:03 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 2005-06-04 21:43:03 +0000 |
commit | d42fa02bc3242701e7d5a9dca44e128c24a30d6d (patch) | |
tree | e957c054a25cc18d49933b841bb5c30b71bc76b9 /gdk/win32 | |
parent | 3dde36383184d094f7bc84384112414b6372963e (diff) | |
download | gdk-pixbuf-d42fa02bc3242701e7d5a9dca44e128c24a30d6d.tar.gz |
gdk/win32/gdkcursor-win32.c gdk/win32/gdkwindow-win32.c Support
2005-06-04 Tor Lillqvist <tml@novell.com>
* gdk/win32/gdkcursor-win32.c
* gdk/win32/gdkwindow-win32.c
* gdk/win32/gdkprivate-win32.h: Support full-colour cursors.
Support cursors with alpha on XP. Use code in common with the
support for alpha icons that already was present. (#306101, Tim
Evans)
Diffstat (limited to 'gdk/win32')
-rw-r--r-- | gdk/win32/gdkcursor-win32.c | 389 | ||||
-rw-r--r-- | gdk/win32/gdkprivate-win32.h | 9 | ||||
-rw-r--r-- | gdk/win32/gdkwindow-win32.c | 220 |
3 files changed, 318 insertions, 300 deletions
diff --git a/gdk/win32/gdkcursor-win32.c b/gdk/win32/gdkcursor-win32.c index c3b3fe473..5aea41780 100644 --- a/gdk/win32/gdkcursor-win32.c +++ b/gdk/win32/gdkcursor-win32.c @@ -26,6 +26,35 @@ #include "xcursors.h" +#if defined(__MINGW32__) || (defined(_MSC_VER) && (WINVER < 0x0500)) +typedef struct { + DWORD bV5Size; + LONG bV5Width; + LONG bV5Height; + WORD bV5Planes; + WORD bV5BitCount; + DWORD bV5Compression; + DWORD bV5SizeImage; + LONG bV5XPelsPerMeter; + LONG bV5YPelsPerMeter; + DWORD bV5ClrUsed; + DWORD bV5ClrImportant; + DWORD bV5RedMask; + DWORD bV5GreenMask; + DWORD bV5BlueMask; + DWORD bV5AlphaMask; + DWORD bV5CSType; + CIEXYZTRIPLE bV5Endpoints; + DWORD bV5GammaRed; + DWORD bV5GammaGreen; + DWORD bV5GammaBlue; + DWORD bV5Intent; + DWORD bV5ProfileData; + DWORD bV5ProfileSize; + DWORD bV5Reserved; +} BITMAPV5HEADER; +#endif + static HCURSOR _gdk_win32_data_to_wcursor (GdkCursorType cursor_type) { @@ -85,12 +114,25 @@ _gdk_win32_data_to_wcursor (GdkCursorType cursor_type) return rv; } +static GdkCursor* +_gdk_win32_cursor_new_from_hcursor (HCURSOR hcursor, GdkCursorType cursor_type) +{ + GdkCursorPrivate *private; + GdkCursor *cursor; + + private = g_new (GdkCursorPrivate, 1); + private->hcursor = hcursor; + cursor = (GdkCursor*) private; + cursor->type = cursor_type; + cursor->ref_count = 1; + + return cursor; +} + GdkCursor* gdk_cursor_new_for_display (GdkDisplay *display, GdkCursorType cursor_type) { - GdkCursorPrivate *private; - GdkCursor *cursor; HCURSOR hcursor; g_return_val_if_fail (display == gdk_display_get_default (), NULL); @@ -103,13 +145,7 @@ gdk_cursor_new_for_display (GdkDisplay *display, GDK_NOTE (MISC, g_print ("gdk_cursor_new_for_display: %d: %p\n", cursor_type, hcursor)); - private = g_new (GdkCursorPrivate, 1); - private->hcursor = hcursor; - cursor = (GdkCursor*) private; - cursor->type = cursor_type; - cursor->ref_count = 1; - - return cursor; + return _gdk_win32_cursor_new_from_hcursor (hcursor, cursor_type); } static gboolean @@ -128,8 +164,6 @@ gdk_cursor_new_from_pixmap (GdkPixmap *source, gint x, gint y) { - GdkCursorPrivate *private; - GdkCursor *cursor; GdkPixmapImplWin32 *source_impl, *mask_impl; guchar *source_bits, *mask_bits; gint source_bpl, mask_bpl; @@ -285,13 +319,7 @@ gdk_cursor_new_from_pixmap (GdkPixmap *source, g_free (xor_mask); g_free (and_mask); - private = g_new (GdkCursorPrivate, 1); - private->hcursor = hcursor; - cursor = (GdkCursor*) private; - cursor->type = GDK_CURSOR_IS_PIXMAP; - cursor->ref_count = 1; - - return cursor; + return _gdk_win32_cursor_new_from_hcursor (hcursor, GDK_CURSOR_IS_PIXMAP); } void @@ -326,71 +354,17 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, gint x, gint y) { - /* FIXME: Use alpha if supported */ - - GdkCursor *cursor; - GdkPixmap *pixmap, *mask; - guint width, height, n_channels, rowstride, i, j; - guint8 *data, *mask_data, *pixels; - GdkColor fg = { 0, 0, 0, 0 }; - GdkColor bg = { 0, 0xffff, 0xffff, 0xffff }; - GdkScreen *screen; + HCURSOR hcursor; g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); + g_return_val_if_fail (0 <= x && x < gdk_pixbuf_get_width (pixbuf), NULL); + g_return_val_if_fail (0 <= y && y < gdk_pixbuf_get_height (pixbuf), NULL); - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); - - g_return_val_if_fail (0 <= x && x < width, NULL); - g_return_val_if_fail (0 <= y && y < height, NULL); - - n_channels = gdk_pixbuf_get_n_channels (pixbuf); - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - pixels = gdk_pixbuf_get_pixels (pixbuf); - - data = g_new0 (guint8, (width + 7) / 8 * height); - mask_data = g_new0 (guint8, (width + 7) / 8 * height); - - for (j = 0; j < height; j++) - { - guint8 *src = pixels + j * rowstride; - guint8 *d = data + (width + 7) / 8 * j; - guint8 *md = mask_data + (width + 7) / 8 * j; - - for (i = 0; i < width; i++) - { - if (src[1] < 0x80) - *d |= 1 << (i % 8); - - if (n_channels == 3 || src[3] >= 0x80) - *md |= 1 << (i % 8); - - src += n_channels; - if (i % 8 == 7) - { - d++; - md++; - } - } - } - - screen = gdk_display_get_default_screen (display); - pixmap = gdk_bitmap_create_from_data (gdk_screen_get_root_window (screen), - data, width, height); - - mask = gdk_bitmap_create_from_data (gdk_screen_get_root_window (screen), - mask_data, width, height); - - cursor = gdk_cursor_new_from_pixmap (pixmap, mask, &fg, &bg, x, y); - - g_object_unref (pixmap); - g_object_unref (mask); - - g_free (data); - g_free (mask_data); - - return cursor; + hcursor = _gdk_win32_pixbuf_to_hcursor (pixbuf, x, y); + if (!hcursor) + return NULL; + return _gdk_win32_cursor_new_from_hcursor (hcursor, GDK_CURSOR_IS_PIXMAP); } gboolean @@ -398,8 +372,7 @@ gdk_display_supports_cursor_alpha (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - /* FIXME */ - return FALSE; + return _gdk_win32_pixbuf_to_hicon_supports_alpha (); } gboolean @@ -407,8 +380,7 @@ gdk_display_supports_cursor_color (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - /* FIXME */ - return FALSE; + return TRUE; } guint @@ -431,3 +403,254 @@ gdk_display_get_maximal_cursor_size (GdkDisplay *display, if (height) *height = GetSystemMetrics (SM_CYCURSOR); } + + +/* Convert a pixbuf to an HICON (or HCURSOR). Supports alpha under + * Windows XP, thresholds alpha otherwise. Also used from + * gdkwindow-win32.c for creating application icons. + */ + +static HBITMAP +create_alpha_bitmap (gint width, gint height, guchar **outdata) +{ + BITMAPV5HEADER bi; + HDC hdc; + HBITMAP hBitmap; + + ZeroMemory (&bi, sizeof (BITMAPV5HEADER)); + bi.bV5Size = sizeof (BITMAPV5HEADER); + bi.bV5Width = width; + bi.bV5Height = height; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_BITFIELDS; + /* The following mask specification specifies a supported 32 BPP + * alpha format for Windows XP (BGRA format). + */ + bi.bV5RedMask = 0x00FF0000; + bi.bV5GreenMask = 0x0000FF00; + bi.bV5BlueMask = 0x000000FF; + bi.bV5AlphaMask = 0xFF000000; + + /* Create the DIB section with an alpha channel. */ + hdc = GetDC (NULL); + if (!hdc) + { + WIN32_GDI_FAILED ("GetDC"); + return NULL; + } + hBitmap = CreateDIBSection (hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, + (PVOID *) outdata, NULL, (DWORD)0); + if (hBitmap == NULL) + WIN32_GDI_FAILED ("CreateDIBSection"); + ReleaseDC (NULL, hdc); + + return hBitmap; +} + +static HBITMAP +create_color_bitmap (gint width, gint height, guchar **outdata) +{ + BITMAPV4HEADER bi; + HDC hdc; + HBITMAP hBitmap; + + ZeroMemory (&bi, sizeof (BITMAPV4HEADER)); + bi.bV4Size = sizeof (BITMAPV4HEADER); + bi.bV4Width = width; + bi.bV4Height = height; + bi.bV4Planes = 1; + bi.bV4BitCount = 24; + bi.bV4V4Compression = BI_RGB; + + hdc = GetDC (NULL); + if (!hdc) + { + WIN32_GDI_FAILED ("GetDC"); + return NULL; + } + hBitmap = CreateDIBSection (hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, + (PVOID *) outdata, NULL, (DWORD)0); + if (hBitmap == NULL) + WIN32_GDI_FAILED ("CreateDIBSection"); + ReleaseDC (NULL, hdc); + + return hBitmap; +} + +static gboolean +pixbuf_to_hbitmaps_alpha_winxp (GdkPixbuf *pixbuf, + HBITMAP *color, + HBITMAP *mask) +{ + /* Based on code from + * http://www.dotnet247.com/247reference/msgs/13/66301.aspx + */ + HBITMAP hColorBitmap, hMaskBitmap; + guchar *indata, *inrow; + guchar *outdata, *outrow; + gint width, height, i, j, rowstride; + + width = gdk_pixbuf_get_width (pixbuf); /* width of icon */ + height = gdk_pixbuf_get_height (pixbuf); /* height of icon */ + + hColorBitmap = create_alpha_bitmap (width, height, &outdata); + if (!hColorBitmap) + return FALSE; + hMaskBitmap = CreateBitmap (width, height, 1, 1, NULL); + if (!hMaskBitmap) + { + DeleteObject (hColorBitmap); + return FALSE; + } + + /* rows are always aligned on 4-byte boundarys, but here our pixels are always 4 bytes */ + indata = gdk_pixbuf_get_pixels (pixbuf); + rowstride = gdk_pixbuf_get_rowstride (pixbuf); + for (j=0; j<height; j++) + { + outrow = outdata + 4*j*width; + inrow = indata + (height-j-1)*rowstride; + for (i=0; i<width; i++) + { + outrow[4*i+0] = inrow[4*i+2]; + outrow[4*i+1] = inrow[4*i+1]; + outrow[4*i+2] = inrow[4*i+0]; + outrow[4*i+3] = inrow[4*i+3]; + } + } + + if (color) *color = hColorBitmap; + if (mask) *mask = hMaskBitmap; + + return TRUE; +} + +static gboolean +pixbuf_to_hbitmaps_normal (GdkPixbuf *pixbuf, + HBITMAP *color, + HBITMAP *mask) +{ + /* Based on code from + * http://www.dotnet247.com/247reference/msgs/13/66301.aspx + */ + HBITMAP hColorBitmap, hMaskBitmap; + guchar *indata, *inrow; + guchar *colordata, *colorrow, *maskdata, *maskrow; + gint width, height, i, j, rowstride, nc, bmstride; + gboolean has_alpha; + + width = gdk_pixbuf_get_width (pixbuf); /* width of icon */ + height = gdk_pixbuf_get_height (pixbuf); /* height of icon */ + + hColorBitmap = create_color_bitmap (width, height, &colordata); + if (!hColorBitmap) + return FALSE; + hMaskBitmap = create_color_bitmap (width, height, &maskdata); + if (!hMaskBitmap) + { + DeleteObject (hColorBitmap); + return FALSE; + } + + /* rows are always aligned on 4-byte boundarys */ + bmstride = width * 3; + if (bmstride % 4 != 0) + bmstride += 4 - (bmstride % 4); + + indata = gdk_pixbuf_get_pixels (pixbuf); + rowstride = gdk_pixbuf_get_rowstride (pixbuf); + nc = gdk_pixbuf_get_n_channels (pixbuf); + has_alpha = gdk_pixbuf_get_has_alpha (pixbuf); + + for (j=0; j<height; j++) + { + colorrow = colordata + j*bmstride; + maskrow = maskdata + j*bmstride; + inrow = indata + (height-j-1)*rowstride; + for (i=0; i<width; i++) + { + if (has_alpha && inrow[nc*i+3] < 128) + { + colorrow[3*i+0] = colorrow[3*i+1] = colorrow[3*i+2] = 0; + maskrow[3*i+0] = maskrow[3*i+1] = maskrow[3*i+2] = 255; + } + else + { + colorrow[3*i+0] = inrow[nc*i+2]; + colorrow[3*i+1] = inrow[nc*i+1]; + colorrow[3*i+2] = inrow[nc*i+0]; + maskrow[3*i+0] = maskrow[3*i+1] = maskrow[3*i+2] = 0; + } + } + } + + if (color) *color = hColorBitmap; + if (mask) *mask = hMaskBitmap; + + return TRUE; +} + +static HICON +pixbuf_to_hicon (GdkPixbuf *pixbuf, + gboolean is_icon, + gint x, + gint y) +{ + ICONINFO ii; + HICON icon; + gboolean success; + + if (pixbuf == NULL) + return NULL; + + if (_gdk_win32_pixbuf_to_hicon_supports_alpha() && gdk_pixbuf_get_has_alpha (pixbuf)) + success = pixbuf_to_hbitmaps_alpha_winxp (pixbuf, &ii.hbmColor, &ii.hbmMask); + else + success = pixbuf_to_hbitmaps_normal (pixbuf, &ii.hbmColor, &ii.hbmMask); + + if (!success) + return NULL; + + ii.fIcon = is_icon; + ii.xHotspot = x; + ii.yHotspot = y; + icon = CreateIconIndirect (&ii); + DeleteObject (ii.hbmColor); + DeleteObject (ii.hbmMask); + return icon; +} + +HICON +_gdk_win32_pixbuf_to_hicon (GdkPixbuf *pixbuf) +{ + return pixbuf_to_hicon (pixbuf, TRUE, 0, 0); +} + +HICON +_gdk_win32_pixbuf_to_hcursor (GdkPixbuf *pixbuf, + gint x_hotspot, + gint y_hotspot) +{ + return pixbuf_to_hicon (pixbuf, FALSE, x_hotspot, y_hotspot); +} + +gboolean +_gdk_win32_pixbuf_to_hicon_supports_alpha (void) +{ + static gboolean is_win_xp=FALSE, is_win_xp_checked=FALSE; + + if (!is_win_xp_checked) + { + OSVERSIONINFO version; + + is_win_xp_checked = TRUE; + memset (&version, 0, sizeof (version)); + version.dwOSVersionInfoSize = sizeof (version); + is_win_xp = GetVersionEx (&version) + && version.dwPlatformId == VER_PLATFORM_WIN32_NT + && (version.dwMajorVersion > 5 + || (version.dwMajorVersion == 5 && version.dwMinorVersion >= 1)); + } + return is_win_xp; +} diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h index 6c5a9112f..a2764a2b9 100644 --- a/gdk/win32/gdkprivate-win32.h +++ b/gdk/win32/gdkprivate-win32.h @@ -510,6 +510,15 @@ extern HGLOBAL _delayed_rendering_data; HGLOBAL _gdk_win32_selection_convert_to_dib (HGLOBAL hdata, GdkAtom target); +/* Convert a pixbuf to an HICON (or HCURSOR). Supports alpha under + * Windows XP, thresholds alpha otherwise. + */ +HICON _gdk_win32_pixbuf_to_hicon (GdkPixbuf *pixbuf); +HICON _gdk_win32_pixbuf_to_hcursor (GdkPixbuf *pixbuf, + gint x_hotspot, + gint y_hotspot); +gboolean _gdk_win32_pixbuf_to_hicon_supports_alpha (void); + /* Initialization */ void _gdk_windowing_window_init (void); void _gdk_root_window_size_init (void); diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 53b4d63a0..150f7beed 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -37,34 +37,7 @@ #include "gdkprivate-win32.h" #include "gdkinput-win32.h" -#if defined __MINGW32__ || (WINVER < 0x0500) -typedef struct { - DWORD bV5Size; - LONG bV5Width; - LONG bV5Height; - WORD bV5Planes; - WORD bV5BitCount; - DWORD bV5Compression; - DWORD bV5SizeImage; - LONG bV5XPelsPerMeter; - LONG bV5YPelsPerMeter; - DWORD bV5ClrUsed; - DWORD bV5ClrImportant; - DWORD bV5RedMask; - DWORD bV5GreenMask; - DWORD bV5BlueMask; - DWORD bV5AlphaMask; - DWORD bV5CSType; - CIEXYZTRIPLE bV5Endpoints; - DWORD bV5GammaRed; - DWORD bV5GammaGreen; - DWORD bV5GammaBlue; - DWORD bV5Intent; - DWORD bV5ProfileData; - DWORD bV5ProfileSize; - DWORD bV5Reserved; -} BITMAPV5HEADER; - +#if defined(_MSC_VER) && (WINVER < 0x0500) #define GetAncestor(hwnd,what) _gdk_win32_get_ancestor_parent(hwnd) static HWND @@ -2406,193 +2379,6 @@ gdk_window_set_focus_on_map (GdkWindow *window, private->focus_on_map = focus_on_map; } -static HICON -pixbuf_to_hicon_alpha_winxp (GdkWindow *window, - GdkPixbuf *pixbuf) -{ - /* Based on code from - * http://www.dotnet247.com/247reference/msgs/13/66301.aspx - */ - HDC hdc; - BITMAPV5HEADER bi; - HBITMAP hBitmap, hMonoBitmap; - guchar *indata, *inrow; - guchar *outdata, *outrow; - HICON hAlphaIcon = NULL; - ICONINFO ii; - gint width, height, i, j, rowstride; - - if (pixbuf == NULL) - return NULL; - - width = gdk_pixbuf_get_width (pixbuf); /* width of icon */ - height = gdk_pixbuf_get_height (pixbuf); /* height of icon */ - - ZeroMemory (&bi, sizeof (BITMAPV5HEADER)); - bi.bV5Size = sizeof (BITMAPV5HEADER); - bi.bV5Width = width; - bi.bV5Height = height; - bi.bV5Planes = 1; - bi.bV5BitCount = 32; - bi.bV5Compression = BI_BITFIELDS; - /* The following mask specification specifies a supported 32 BPP - * alpha format for Windows XP (BGRA format). - */ - bi.bV5RedMask = 0x00FF0000; - bi.bV5GreenMask = 0x0000FF00; - bi.bV5BlueMask = 0x000000FF; - bi.bV5AlphaMask = 0xFF000000; - - /* Create the DIB section with an alpha channel. */ - hdc = GetDC (NULL); - hBitmap = CreateDIBSection (hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, - (void **)&outdata, NULL, (DWORD)0); - ReleaseDC (NULL, hdc); - - /* Draw something on the DIB section */ - indata = gdk_pixbuf_get_pixels (pixbuf); - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - for (j=0; j<height; j++) - { - outrow = outdata + 4*j*width; - inrow = indata + (height-j-1)*rowstride; - for (i=0; i<width; i++) - { - outrow[4*i+0] = inrow[4*i+2]; - outrow[4*i+1] = inrow[4*i+1]; - outrow[4*i+2] = inrow[4*i+0]; - outrow[4*i+3] = inrow[4*i+3]; - } - } - - /* Create an empty mask bitmap */ - hMonoBitmap = CreateBitmap (width, height, 1, 1, NULL); - - ii.fIcon = TRUE; - ii.xHotspot = 0; - ii.yHotspot = 0; - ii.hbmMask = hMonoBitmap; - ii.hbmColor = hBitmap; - - /* Create the alpha cursor with the alpha DIB section */ - hAlphaIcon = CreateIconIndirect (&ii); - - GDI_CALL (DeleteObject, (hBitmap)); - GDI_CALL (DeleteObject, (hMonoBitmap)); - - return hAlphaIcon; -} - -static HICON -pixbuf_to_hicon_normal (GdkWindow *window, - GdkPixbuf *pixbuf) -{ - GdkPixmap *pixmap; - GdkBitmap *mask; - HBITMAP hbmmask = NULL; - ICONINFO ii; - HICON hIcon; - gint w = 0, h = 0; - - if (pixbuf == NULL) - return NULL; - - /* create a normal icon with a bitmap mask */ - w = gdk_pixbuf_get_width (pixbuf); - h = gdk_pixbuf_get_height (pixbuf); - gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf, - gdk_drawable_get_colormap (window), - &pixmap, - &mask, - 128); - - /* we need the inverted mask for the XOR op */ - { - HDC hdc1 = CreateCompatibleDC (NULL); - HBITMAP hbmold1; - - hbmmask = CreateCompatibleBitmap (hdc1, w, h); - hbmold1 = SelectObject (hdc1, hbmmask); - if (mask) - { - HDC hdc2 = CreateCompatibleDC (NULL); - HBITMAP hbmold2 = SelectObject (hdc2, GDK_PIXMAP_HBITMAP (mask)); - GDI_CALL (BitBlt, (hdc1, 0,0,w,h, hdc2, 0,0, NOTSRCCOPY)); - GDI_CALL (SelectObject, (hdc2, hbmold2)); - GDI_CALL (DeleteDC, (hdc2)); - } - else - { - RECT rect; - GetClipBox (hdc1, &rect); - GDI_CALL (FillRect, (hdc1, &rect, GetStockObject (BLACK_BRUSH))); - } - GDI_CALL (SelectObject, (hdc1, hbmold1)); - GDI_CALL (DeleteDC, (hdc1)); - } - - ii.fIcon = TRUE; - ii.xHotspot = ii.yHotspot = 0; /* ignored for icons */ - ii.hbmMask = hbmmask; - ii.hbmColor = GDK_PIXMAP_HBITMAP (pixmap); - hIcon = CreateIconIndirect (&ii); - if (!hIcon) - WIN32_API_FAILED ("CreateIconIndirect"); - GDI_CALL (DeleteObject, (hbmmask)); - -#if 0 /* to debug pixmap and mask setting */ - { - static int num = 0; - GdkPixbuf* pixbuf = NULL; - char name[256]; - - pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0, w, h); - if (pixbuf) - { - num = (num + 1) % 999; /* restrict maximim number */ - sprintf (name, "c:\\temp\\ico%03dpixm.png", num); - gdk_pixbuf_save (pixbuf, name, "png", NULL, NULL); - gdk_pixbuf_unref (pixbuf); - } - } -#endif - - if (pixmap) - g_object_unref (pixmap); - if (mask) - g_object_unref (mask); - - return hIcon; -} - -static HICON -pixbuf_to_hicon (GdkWindow *window, - GdkPixbuf *pixbuf) -{ - static gboolean is_win_xp=FALSE, is_win_xp_checked=FALSE; - - if (!is_win_xp_checked) - { - OSVERSIONINFO version; - - is_win_xp_checked = TRUE; - memset (&version, 0, sizeof (version)); - version.dwOSVersionInfoSize = sizeof (version); - is_win_xp = GetVersionEx (&version) - && version.dwPlatformId == VER_PLATFORM_WIN32_NT - && (version.dwMajorVersion > 5 - || (version.dwMajorVersion == 5 && version.dwMinorVersion >= 1)); - } - - if (pixbuf == NULL) - return NULL; - - if (is_win_xp && gdk_pixbuf_get_has_alpha (pixbuf)) - return pixbuf_to_hicon_alpha_winxp (window, pixbuf); - else - return pixbuf_to_hicon_normal (window, pixbuf); -} - void gdk_window_set_icon_list (GdkWindow *window, GList *pixbufs) @@ -2656,8 +2442,8 @@ gdk_window_set_icon_list (GdkWindow *window, } /* Create the icons */ - big_hicon = pixbuf_to_hicon (window, big_pixbuf); - small_hicon = pixbuf_to_hicon (window, small_pixbuf); + big_hicon = _gdk_win32_pixbuf_to_hicon (big_pixbuf); + small_hicon = _gdk_win32_pixbuf_to_hicon (small_pixbuf); /* Set the icons */ SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG, |