1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-1999 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
34 #include "gdkpixmap.h"
35 #include "gdkprivate.h"
48 GdkColormap *colormap;
53 gdk_win32_pixmap_destroy (GdkPixmap *pixmap)
55 GdkDrawablePrivate *private = (GdkDrawablePrivate *) pixmap;
57 GDK_NOTE (MISC, g_print ("gdk_win32_pixmap_destroy: %#x\n",
58 GDK_DRAWABLE_XID (pixmap)));
60 if (!DeleteObject (GDK_DRAWABLE_XID (pixmap)))
61 WIN32_GDI_FAILED ("DeleteObject");
63 gdk_xid_table_remove (GDK_DRAWABLE_XID (pixmap));
65 g_free (GDK_DRAWABLE_WIN32DATA (pixmap));
69 gdk_win32_pixmap_alloc (void)
71 GdkDrawable *drawable;
72 GdkDrawablePrivate *private;
74 static GdkDrawableClass klass;
75 static gboolean initialized = FALSE;
81 klass = _gdk_win32_drawable_class;
82 klass.destroy = gdk_win32_pixmap_destroy;
85 drawable = gdk_drawable_alloc ();
86 private = (GdkDrawablePrivate *) drawable;
88 private->klass = &klass;
89 private->klass_data = g_new (GdkDrawableWin32Data, 1);
90 private->window_type = GDK_DRAWABLE_PIXMAP;
96 gdk_pixmap_new (GdkWindow *window,
102 GdkDrawablePrivate *private;
104 BITMAPINFOHEADER bmiHeader;
106 WORD bmiIndices[256];
108 RGBQUAD bmiColors[256];
117 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
118 g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);
119 g_return_val_if_fail ((width != 0) && (height != 0), NULL);
122 window = gdk_parent_root;
124 if (GDK_DRAWABLE_DESTROYED (window))
128 depth = gdk_drawable_get_visual (window)->depth;
130 GDK_NOTE (MISC, g_print ("gdk_pixmap_new: %dx%dx%d\n",
131 width, height, depth));
133 pixmap = gdk_win32_pixmap_alloc ();
134 private = (GdkDrawablePrivate *) pixmap;
136 visual = gdk_drawable_get_visual (window);
138 if ((hdc = GetDC (GDK_DRAWABLE_XID (window))) == NULL)
140 WIN32_GDI_FAILED ("GetDC");
145 bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
146 bmi.bmiHeader.biWidth = width;
147 bmi.bmiHeader.biHeight = -height;
148 bmi.bmiHeader.biPlanes = 1;
150 bmi.bmiHeader.biBitCount = 16;
152 bmi.bmiHeader.biBitCount = depth;
155 bmi.bmiHeader.biCompression = BI_BITFIELDS;
158 bmi.bmiHeader.biCompression = BI_RGB;
159 bmi.bmiHeader.biSizeImage = 0;
160 bmi.bmiHeader.biXPelsPerMeter =
161 bmi.bmiHeader.biYPelsPerMeter = 0;
162 bmi.bmiHeader.biClrUsed = 0;
163 bmi.bmiHeader.biClrImportant = 0;
165 iUsage = DIB_RGB_COLORS;
168 bmi.u.bmiColors[0].rgbBlue =
169 bmi.u.bmiColors[0].rgbGreen =
170 bmi.u.bmiColors[0].rgbRed = 0x00;
171 bmi.u.bmiColors[0].rgbReserved = 0x00;
173 bmi.u.bmiColors[1].rgbBlue =
174 bmi.u.bmiColors[1].rgbGreen =
175 bmi.u.bmiColors[1].rgbRed = 0xFF;
176 bmi.u.bmiColors[1].rgbReserved = 0x00;
177 private->colormap = NULL;
181 private->colormap = ((GdkWindowPrivate *) window)->drawable.colormap;
182 if (private->colormap == NULL)
183 private->colormap = gdk_colormap_get_system ();
187 iUsage = DIB_PAL_COLORS;
188 for (i = 0; i < 256; i++)
189 bmi.u.bmiIndices[i] = i;
193 if (depth != visual->depth)
194 g_warning ("gdk_pixmap_new: depth %d doesn't match display depth %d",
195 depth, visual->depth);
199 bmi.u.bmiMasks[0] = visual->red_mask;
200 bmi.u.bmiMasks[1] = visual->green_mask;
201 bmi.u.bmiMasks[2] = visual->blue_mask;
206 if ((GDK_DRAWABLE_WIN32DATA (pixmap)->xid =
207 CreateDIBSection (hdc, (BITMAPINFO *) &bmi,
208 iUsage, (PVOID *) &bits, NULL, 0)) == NULL)
210 WIN32_GDI_FAILED ("CreateDIBSection");
211 ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
215 ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
217 GDK_NOTE (MISC, g_print ("... = %#x\n", GDK_DRAWABLE_XID (pixmap)));
219 private->width = width;
220 private->height = height;
222 gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap);
228 gdk_pixmap_create_on_shared_image (GdkImage **image_return,
236 GdkDrawablePrivate *private;
238 g_return_val_if_fail (window != NULL, NULL);
242 *image_return = gdk_image_bitmap_new (GDK_IMAGE_SHARED_PIXMAP, visual, width, height);
245 g_return_val_if_fail (depth == visual->depth, NULL);
246 *image_return = gdk_image_new (GDK_IMAGE_SHARED_PIXMAP, visual, width, height);
249 g_return_val_if_fail (*image_return != NULL, NULL);
251 pixmap = gdk_win32_pixmap_alloc ();
252 private = (GdkDrawablePrivate *) pixmap;
254 GDK_DRAWABLE_WIN32DATA (pixmap)->xid =
255 ((GdkImagePrivateWin32 *) *image_return)->ximage;
256 private->colormap = ((GdkWindowPrivate *) window)->drawable.colormap;
257 private->width = width;
258 private->height = height;
260 gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap);
263 g_print ("gdk_pixmap_create_on_shared_image: %dx%dx%d = %#x\n",
264 width, height, depth, GDK_DRAWABLE_XID (pixmap)));
269 static unsigned char mirror[256] = {
270 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
271 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
272 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
273 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
274 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
275 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
276 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
277 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
278 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
279 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
280 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
281 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
282 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
283 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
284 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
285 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
286 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
287 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
288 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
289 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
290 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
291 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
292 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
293 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
294 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
295 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
296 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
297 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
298 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
299 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
300 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
301 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
305 gdk_bitmap_create_from_data (GdkWindow *window,
311 GdkDrawablePrivate *private;
312 gint i, j, bpl, aligned_bpl;
315 g_return_val_if_fail (data != NULL, NULL);
316 g_return_val_if_fail ((width != 0) && (height != 0), NULL);
317 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
320 window = gdk_parent_root;
322 if (GDK_DRAWABLE_DESTROYED (window))
325 pixmap = gdk_win32_pixmap_alloc ();
326 private = (GdkDrawablePrivate *) pixmap;
328 private->width = width;
329 private->height = height;
331 bpl = ((width - 1) / 8 + 1);
332 aligned_bpl = ((bpl - 1) / 2 + 1) * 2;
333 bits = g_malloc (aligned_bpl * height);
334 for (i = 0; i < height; i++)
335 for (j = 0; j < bpl; j++)
336 bits[i*aligned_bpl + j] = mirror[(guchar) data[i*bpl + j]];
338 GDK_DRAWABLE_WIN32DATA (pixmap)->xid =
339 CreateBitmap (width, height, 1, 1, bits);
341 GDK_NOTE (MISC, g_print ("gdk_bitmap_create_from_data: %dx%d = %#x\n",
342 width, height, GDK_DRAWABLE_XID (pixmap)));
346 private->colormap = NULL;
347 gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap);
353 gdk_pixmap_create_from_data (GdkWindow *window,
361 /* Oh wow. I struggled with dozens of lines of code trying to get
362 * this right using a monochrome Win32 bitmap created from data, and
363 * a colour DIB section as the result, trying setting pens,
364 * background colors, whatnot and BitBlt:ing. Nope. Then finally I
365 * realized it's much easier to do it using gdk...:
368 GdkPixmap *result = gdk_pixmap_new (window, width, height, depth);
369 GdkPixmap *source = gdk_bitmap_create_from_data (window, data, width, height);
370 GdkGC *gc = gdk_gc_new (result);
371 gdk_gc_set_foreground (gc, fg);
372 gdk_gc_set_background (gc, bg);
373 gdk_draw_drawable (result, gc, source, 0, 0, 0, 0, width, height);
374 gdk_drawable_unref (source);
377 GDK_NOTE (MISC, g_print ("gdk_pixmap_create_from_data: %dx%dx%d = %#x\n",
378 width, height, depth,
379 GDK_DRAWABLE_XID (result)));
384 gdk_pixmap_seek_string (FILE *infile,
390 while (!feof (infile))
392 fscanf (infile, "%1023s", instr);
393 if (skip_comments == TRUE && strcmp (instr, "/*") == 0)
395 fscanf (infile, "%1023s", instr);
396 while (!feof (infile) && strcmp (instr, "*/") != 0)
397 fscanf (infile, "%1023s", instr);
398 fscanf(infile, "%1023s", instr);
400 if (strcmp (instr, str)==0)
408 gdk_pixmap_seek_char (FILE *infile,
413 while ((b = getc(infile)) != EOF)
415 if (c != b && b == '/')
420 else if (b == '*') /* we have a comment */
430 while (!(oldb == '*' && b == '/'));
440 gdk_pixmap_read_string (FILE *infile,
445 guint cnt = 0, bufsiz, ret = FALSE;
449 bufsiz = *buffer_size;
452 bufsiz = 10 * sizeof (gchar);
453 buf = g_new(gchar, bufsiz);
458 while (c != EOF && c != '"');
463 while ((c = getc(infile)) != EOF)
467 guint new_size = bufsiz * 2;
468 if (new_size > bufsiz)
473 buf = (gchar *) g_realloc (buf, bufsiz);
474 buf[bufsiz-1] = '\0';
488 buf[bufsiz-1] = '\0'; /* ensure null termination for errors */
490 *buffer_size = bufsiz;
495 gdk_pixmap_skip_whitespaces (gchar *buffer)
499 while (buffer[index] != 0 && (buffer[index] == 0x20 || buffer[index] == 0x09))
502 return &buffer[index];
506 gdk_pixmap_skip_string (gchar *buffer)
510 while (buffer[index] != 0 && buffer[index] != 0x20 && buffer[index] != 0x09)
513 return &buffer[index];
516 #define MAX_COLOR_LEN 120
519 gdk_pixmap_extract_color (gchar *buffer)
521 gint counter, numnames;
522 gchar *ptr = NULL, ch, temp[128];
523 gchar color[MAX_COLOR_LEN], *retcol;
529 if (buffer[counter] == 'c')
531 ch = buffer[counter + 1];
532 if (ch == 0x20 || ch == 0x09)
533 ptr = &buffer[counter + 1];
535 else if (buffer[counter] == 0)
541 ptr = gdk_pixmap_skip_whitespaces (ptr);
545 else if (ptr[0] == '#')
548 while (ptr[counter] != 0 &&
549 ((ptr[counter] >= '0' && ptr[counter] <= '9') ||
550 (ptr[counter] >= 'a' && ptr[counter] <= 'f') ||
551 (ptr[counter] >= 'A' && ptr[counter] <= 'F')))
554 retcol = g_new (gchar, counter+1);
555 strncpy (retcol, ptr, counter);
565 space = MAX_COLOR_LEN - 1;
568 sscanf (ptr, "%127s", temp);
570 if (((gint)ptr[0] == 0) ||
571 (strcmp ("s", temp) == 0) || (strcmp ("m", temp) == 0) ||
572 (strcmp ("g", temp) == 0) || (strcmp ("g4", temp) == 0))
583 strncat (color, temp, space);
584 space -= MIN (space, strlen (temp));
585 ptr = gdk_pixmap_skip_string (ptr);
586 ptr = gdk_pixmap_skip_whitespaces (ptr);
591 retcol = g_strdup (color);
605 gdk_xpm_destroy_notify (gpointer data)
607 _GdkPixmapInfo *info = (_GdkPixmapInfo *)data;
611 for (i=0; i<info->ncolors; i++)
613 color.pixel = info->pixels[i];
614 gdk_colormap_free_colors (info->colormap, &color, 1);
617 gdk_colormap_unref (info->colormap);
622 _gdk_pixmap_create_from_xpm (GdkWindow *window,
623 GdkColormap *colormap,
625 GdkColor *transparent_color,
626 gchar * (*get_buf) (enum buffer_op op,
630 GdkPixmap *pixmap = NULL;
631 GdkImage *image = NULL;
635 gint width, height, num_cols, cpp, n, ns, cnt, xcnt, ycnt, wbytes;
636 gchar *buffer, pixel_str[32];
638 _GdkPixmapColor *color = NULL, *fallbackcolor = NULL;
639 _GdkPixmapColor *colors = NULL;
641 GHashTable *color_hash = NULL;
642 _GdkPixmapInfo *color_info = NULL;
644 if ((window == NULL) && (colormap == NULL))
645 g_warning ("Creating pixmap from xpm with NULL window and colormap");
648 window = gdk_parent_root;
650 if (colormap == NULL)
652 colormap = gdk_drawable_get_colormap (window);
653 visual = gdk_drawable_get_visual (window);
656 visual = ((GdkColormapPrivate *)colormap)->visual;
658 buffer = (*get_buf) (op_header, handle);
662 sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);
665 g_warning ("Pixmap has more than 31 characters per color");
669 color_hash = g_hash_table_new (g_str_hash, g_str_equal);
671 if (transparent_color == NULL)
673 gdk_color_white (colormap, &tmp_color);
674 transparent_color = &tmp_color;
677 /* For pseudo-color and grayscale visuals, we have to remember
678 * the colors we allocated, so we can free them later.
680 if ((visual->type == GDK_VISUAL_PSEUDO_COLOR) ||
681 (visual->type == GDK_VISUAL_GRAYSCALE))
683 color_info = g_malloc (sizeof (_GdkPixmapInfo) +
684 sizeof(gulong) * (num_cols - 1));
685 color_info->ncolors = num_cols;
686 color_info->colormap = colormap;
687 gdk_colormap_ref (colormap);
690 name_buf = g_new (gchar, num_cols * (cpp+1));
691 colors = g_new (_GdkPixmapColor, num_cols);
693 for (cnt = 0; cnt < num_cols; cnt++)
697 buffer = (*get_buf) (op_cmap, handle);
701 color = &colors[cnt];
702 color->color_string = &name_buf [cnt * (cpp + 1)];
703 strncpy (color->color_string, buffer, cpp);
704 color->color_string[cpp] = 0;
705 buffer += strlen (color->color_string);
706 color->transparent = FALSE;
708 color_name = gdk_pixmap_extract_color (buffer);
710 if (color_name == NULL ||
711 gdk_color_parse (color_name, &color->color) == FALSE)
713 color->color = *transparent_color;
714 color->transparent = TRUE;
719 /* FIXME: The remaining slowness appears to happen in this
721 gdk_color_alloc (colormap, &color->color);
724 color_info->pixels[cnt] = color->color.pixel;
726 g_hash_table_insert (color_hash, color->color_string, color);
728 fallbackcolor = color;
732 image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);
736 /* The pixmap mask is just a bits pattern.
737 * Color 0 is used for background and 1 for foreground.
738 * We don't care about the colormap, we just need 0 and 1.
740 GdkColor mask_pattern;
742 *mask = gdk_pixmap_new (window, width, height, 1);
743 gc = gdk_gc_new (*mask);
745 mask_pattern.pixel = 0;
746 gdk_gc_set_foreground (gc, &mask_pattern);
747 gdk_draw_rectangle (*mask, gc, TRUE, 0, 0, -1, -1);
749 mask_pattern.pixel = 1;
750 gdk_gc_set_foreground (gc, &mask_pattern);
753 wbytes = width * cpp;
754 for (ycnt = 0; ycnt < height; ycnt++)
756 buffer = (*get_buf) (op_body, handle);
758 /* FIXME: this slows things down a little - it could be
759 * integrated into the strncpy below, perhaps. OTOH, strlen
762 if ((buffer == NULL) || strlen (buffer) < wbytes)
765 for (n = 0, cnt = 0, xcnt = 0; n < wbytes; n += cpp, xcnt++)
767 strncpy (pixel_str, &buffer[n], cpp);
771 color = g_hash_table_lookup (color_hash, pixel_str);
773 if (!color) /* screwed up XPM file */
774 color = fallbackcolor;
776 gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);
778 if (mask && color->transparent)
781 gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
786 if (mask && (cnt < xcnt))
787 gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
797 pixmap = gdk_pixmap_new (window, width, height, visual->depth);
800 gdk_drawable_set_data (pixmap, "gdk-xpm", color_info,
801 gdk_xpm_destroy_notify);
803 gc = gdk_gc_new (pixmap);
804 gdk_gc_set_foreground (gc, transparent_color);
805 gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
807 gdk_image_unref (image);
810 gdk_xpm_destroy_notify (color_info);
812 if (color_hash != NULL)
813 g_hash_table_destroy (color_hash);
818 if (name_buf != NULL)
834 file_buffer (enum buffer_op op, gpointer handle)
836 struct file_handle *h = handle;
841 if (gdk_pixmap_seek_string (h->infile, "XPM", FALSE) != TRUE)
844 if (gdk_pixmap_seek_char (h->infile,'{') != TRUE)
846 /* Fall through to the next gdk_pixmap_seek_char. */
849 gdk_pixmap_seek_char (h->infile, '"');
850 fseek (h->infile, -1, SEEK_CUR);
851 /* Fall through to the gdk_pixmap_read_string. */
854 gdk_pixmap_read_string (h->infile, &h->buffer, &h->buffer_size);
861 gdk_pixmap_colormap_create_from_xpm (GdkWindow *window,
862 GdkColormap *colormap,
864 GdkColor *transparent_color,
865 const gchar *filename)
867 struct file_handle h;
868 GdkPixmap *pixmap = NULL;
870 memset (&h, 0, sizeof (h));
871 h.infile = fopen (filename, "rb");
872 if (h.infile != NULL)
874 pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
885 gdk_pixmap_create_from_xpm (GdkWindow *window,
887 GdkColor *transparent_color,
888 const gchar *filename)
890 return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask,
891 transparent_color, filename);
902 mem_buffer (enum buffer_op op, gpointer handle)
904 struct mem_handle *h = handle;
910 if (h->data[h->offset])
911 return h->data[h->offset ++];
917 gdk_pixmap_colormap_create_from_xpm_d (GdkWindow *window,
918 GdkColormap *colormap,
920 GdkColor *transparent_color,
924 GdkPixmap *pixmap = NULL;
926 memset (&h, 0, sizeof (h));
928 pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
935 gdk_pixmap_create_from_xpm_d (GdkWindow *window,
937 GdkColor *transparent_color,
940 return gdk_pixmap_colormap_create_from_xpm_d (window, NULL, mask,
941 transparent_color, data);
945 gdk_pixmap_foreign_new (guint32 anid)
948 GdkDrawablePrivate *private;
951 unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret;
953 /* check to make sure we were passed something at
954 least a little sane */
955 g_return_val_if_fail((anid != 0), NULL);
957 /* set the pixmap to the passed in value */
958 xpixmap = (HBITMAP) anid;
960 /* get information about the BITMAP to fill in the structure for
962 GetBitmapDimensionEx (xpixmap, &size);
966 /* allocate a new gdk pixmap */
967 pixmap = gdk_win32_pixmap_alloc ();
968 private = (GdkDrawablePrivate *) pixmap;
970 GDK_DRAWABLE_WIN32DATA (pixmap)->xid = xpixmap;
971 private->colormap = NULL;
972 private->width = w_ret;
973 private->height = h_ret;
975 gdk_xid_table_insert(&GDK_DRAWABLE_XID (pixmap), pixmap);