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/.
35 #include "gdkprivate.h"
47 GdkColormap *colormap;
52 gdk_pixmap_new (GdkWindow *window,
58 GdkWindowPrivate *private;
59 GdkWindowPrivate *window_private;
61 BITMAPINFOHEADER bmiHeader;
65 RGBQUAD bmiColors[256];
74 g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);
75 g_return_val_if_fail ((width != 0) && (height != 0), NULL);
78 window = (GdkWindow*) &gdk_root_parent;
80 window_private = (GdkWindowPrivate*) window;
81 if (window_private->destroyed)
85 depth = gdk_window_get_visual (window)->depth;
87 GDK_NOTE (MISC, g_print ("gdk_pixmap_new: %dx%dx%d\n", width, height, depth));
89 private = g_new0 (GdkWindowPrivate, 1);
90 pixmap = (GdkPixmap*) private;
92 private->window_type = GDK_WINDOW_PIXMAP;
94 visual = gdk_window_get_visual (window);
99 if ((private->xwindow =
100 CreateBitmap (width, height, 1, 1, NULL)) == NULL)
102 g_warning ("gdk_pixmap_new: CreateBitmap failed");
107 private->colormap = NULL;
111 if (depth != visual->depth)
112 g_warning ("gdk_pixmap_new: depth %d doesn't match display depth %d",
113 depth, visual->depth);
115 if ((hdc = GetDC (window_private->xwindow)) == NULL)
117 g_warning ("gdk_pixmap_new: GetDC failed");
122 if ((private->xwindow =
123 CreateCompatibleBitmap (hdc, width, height)) == NULL)
125 g_warning ("gdk_pixmap_new: %dx%d CreateCompatibleBitmap failed",
127 ReleaseDC (window_private->xwindow, hdc);
132 ReleaseDC (window_private->xwindow, hdc);
134 private->colormap = window_private->colormap;
135 if (private->colormap == NULL)
136 private->colormap = gdk_colormap_get_system ();
140 if ((hdc = GetDC (window_private->xwindow)) == NULL)
142 g_warning ("gdk_pixmap_new: GetDC failed");
147 bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
148 bmi.bmiHeader.biWidth = width;
149 bmi.bmiHeader.biHeight = -height;
150 bmi.bmiHeader.biPlanes = 1;
152 bmi.bmiHeader.biBitCount = 16;
154 bmi.bmiHeader.biBitCount = depth;
157 bmi.bmiHeader.biCompression = BI_BITFIELDS;
160 bmi.bmiHeader.biCompression = BI_RGB;
161 bmi.bmiHeader.biSizeImage = 0;
162 bmi.bmiHeader.biXPelsPerMeter =
163 bmi.bmiHeader.biYPelsPerMeter = 0;
164 bmi.bmiHeader.biClrUsed = 0;
165 bmi.bmiHeader.biClrImportant = 0;
167 iUsage = DIB_RGB_COLORS;
170 bmi.u.bmiColors[0].rgbBlue =
171 bmi.u.bmiColors[0].rgbGreen =
172 bmi.u.bmiColors[0].rgbRed = 0x00;
173 bmi.u.bmiColors[0].rgbReserved = 0x00;
175 bmi.u.bmiColors[1].rgbBlue =
176 bmi.u.bmiColors[1].rgbGreen =
177 bmi.u.bmiColors[1].rgbRed = 0xFF;
178 bmi.u.bmiColors[1].rgbReserved = 0x00;
179 private->colormap = NULL;
183 private->colormap = window_private->colormap;
184 if (private->colormap == NULL)
185 private->colormap = gdk_colormap_get_system ();
189 iUsage = DIB_PAL_COLORS;
190 for (i = 0; i < 256; i++)
191 bmi.u.bmiIndices[i] = i;
195 if (depth != visual->depth)
196 g_warning ("gdk_pixmap_new: depth %d doesn't match display depth %d",
197 depth, visual->depth);
201 bmi.u.bmiMasks[0] = visual->red_mask;
202 bmi.u.bmiMasks[1] = visual->green_mask;
203 bmi.u.bmiMasks[2] = visual->blue_mask;
208 if ((private->xwindow =
209 CreateDIBSection (hdc, (BITMAPINFO *) &bmi,
210 iUsage, &bits, NULL, 0)) == NULL)
212 g_warning ("gdk_pixmap_new: CreateDIBSection failed: %d", GetLastError ());
213 ReleaseDC (window_private->xwindow, hdc);
217 ReleaseDC (window_private->xwindow, hdc);
221 GDK_NOTE (MISC, g_print ("... = %#x\n", private->xwindow));
223 private->parent = NULL;
226 private->width = width;
227 private->height = height;
228 private->resize_count = 0;
229 private->ref_count = 1;
230 private->destroyed = 0;
232 gdk_xid_table_insert (&private->xwindow, pixmap);
238 gdk_pixmap_create_on_shared_image (GdkImage **image_return,
246 GdkImagePrivate *image_private;
247 GdkWindowPrivate *private;
248 GdkWindowPrivate *window_private;
250 g_return_val_if_fail (window != NULL, NULL);
252 window_private = (GdkWindowPrivate *) window;
255 *image_return = gdk_image_bitmap_new (GDK_IMAGE_SHARED_PIXMAP, visual, width, height);
258 g_return_val_if_fail (depth == visual->depth, NULL);
259 *image_return = gdk_image_new (GDK_IMAGE_SHARED_PIXMAP, visual, width, height);
262 g_return_val_if_fail (*image_return != NULL, NULL);
264 image_private = (GdkImagePrivate *) *image_return;
266 private = g_new0 (GdkWindowPrivate, 1);
267 pixmap = (GdkPixmap*) private;
269 private->xwindow = image_private->ximage;
270 private->window_type = GDK_WINDOW_PIXMAP;
271 private->colormap = window_private->colormap;
272 private->parent = NULL;
275 private->width = width;
276 private->height = height;
277 private->resize_count = 0;
278 private->ref_count = 1;
279 private->destroyed = 0;
281 gdk_xid_table_insert (&private->xwindow, pixmap);
284 g_print ("gdk_pixmap_create_on_shared_image: %dx%dx%d = %#x\n",
285 width, height, depth, private->xwindow));
290 static unsigned char mirror[256] = {
291 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
292 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
293 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
294 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
295 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
296 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
297 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
298 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
299 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
300 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
301 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
302 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
303 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
304 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
305 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
306 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
307 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
308 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
309 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
310 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
311 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
312 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
313 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
314 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
315 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
316 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
317 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
318 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
319 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
320 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
321 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
322 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
326 gdk_bitmap_create_from_data (GdkWindow *window,
332 GdkWindowPrivate *private;
333 GdkWindowPrivate *window_private;
334 gint i, j, bpl, aligned_bpl;
337 g_return_val_if_fail (data != NULL, NULL);
338 g_return_val_if_fail ((width != 0) && (height != 0), NULL);
341 window = (GdkWindow*) &gdk_root_parent;
343 window_private = (GdkWindowPrivate*) window;
344 if (window_private->destroyed)
347 private = g_new0 (GdkWindowPrivate, 1);
348 pixmap = (GdkPixmap*) private;
350 private->parent = NULL;
351 private->window_type = GDK_WINDOW_PIXMAP;
354 private->width = width;
355 private->height = height;
356 private->resize_count = 0;
357 private->ref_count = 1;
358 private->destroyed = FALSE;
360 bpl = ((width - 1) / 8 + 1);
361 aligned_bpl = ((bpl - 1) / 2 + 1) * 2;
362 bits = g_malloc (aligned_bpl * height);
363 for (i = 0; i < height; i++)
364 for (j = 0; j < bpl; j++)
365 bits[i*aligned_bpl + j] = mirror[(guchar) data[i*bpl + j]];
366 private->xwindow = CreateBitmap (width, height, 1, 1, bits);
368 GDK_NOTE (MISC, g_print ("gdk_bitmap_create_from_data: %dx%d = %#x\n",
369 width, height, private->xwindow));
373 private->colormap = NULL;
374 gdk_xid_table_insert (&private->xwindow, pixmap);
380 gdk_pixmap_create_from_data (GdkWindow *window,
388 /* Oh wow. I struggled with dozens of lines of code trying to get
389 * this right using a monochrome Win32 bitmap created from data, and
390 * a colour DIB section as the result, trying setting pens,
391 * background colors, whatnot and BitBlt:ing. Nope. Then finally I
392 * realized it's much easier to do it using gdk...:
395 GdkPixmap *result = gdk_pixmap_new (window, width, height, depth);
396 GdkPixmap *source = gdk_bitmap_create_from_data (window, data, width, height);
397 GdkGC *gc = gdk_gc_new (result);
398 gdk_gc_set_foreground (gc, fg);
399 gdk_gc_set_background (gc, bg);
400 gdk_draw_pixmap (result, gc, source, 0, 0, 0, 0, width, height);
401 gdk_pixmap_unref (source);
404 GDK_NOTE (MISC, g_print ("gdk_pixmap_create_from_data: %dx%dx%d = %#x\n",
405 width, height, depth,
406 ((GdkPixmapPrivate *) result)->xwindow));
411 gdk_pixmap_seek_string (FILE *infile,
417 while (!feof (infile))
419 fscanf (infile, "%1023s", instr);
420 if (skip_comments == TRUE && strcmp (instr, "/*") == 0)
422 fscanf (infile, "%1023s", instr);
423 while (!feof (infile) && strcmp (instr, "*/") != 0)
424 fscanf (infile, "%1023s", instr);
425 fscanf(infile, "%1023s", instr);
427 if (strcmp (instr, str)==0)
435 gdk_pixmap_seek_char (FILE *infile,
440 while ((b = getc(infile)) != EOF)
442 if (c != b && b == '/')
447 else if (b == '*') /* we have a comment */
457 while (!(oldb == '*' && b == '/'));
467 gdk_pixmap_read_string (FILE *infile,
472 guint cnt = 0, bufsiz, ret = FALSE;
476 bufsiz = *buffer_size;
479 bufsiz = 10 * sizeof (gchar);
480 buf = g_new(gchar, bufsiz);
485 while (c != EOF && c != '"');
490 while ((c = getc(infile)) != EOF)
494 guint new_size = bufsiz * 2;
495 if (new_size > bufsiz)
500 buf = (gchar *) g_realloc (buf, bufsiz);
501 buf[bufsiz-1] = '\0';
515 buf[bufsiz-1] = '\0'; /* ensure null termination for errors */
517 *buffer_size = bufsiz;
522 gdk_pixmap_skip_whitespaces (gchar *buffer)
526 while (buffer[index] != 0 && (buffer[index] == 0x20 || buffer[index] == 0x09))
529 return &buffer[index];
533 gdk_pixmap_skip_string (gchar *buffer)
537 while (buffer[index] != 0 && buffer[index] != 0x20 && buffer[index] != 0x09)
540 return &buffer[index];
543 #define MAX_COLOR_LEN 120
546 gdk_pixmap_extract_color (gchar *buffer)
548 gint counter, numnames;
549 gchar *ptr = NULL, ch, temp[128];
550 gchar color[MAX_COLOR_LEN], *retcol;
556 if (buffer[counter] == 'c')
558 ch = buffer[counter + 1];
559 if (ch == 0x20 || ch == 0x09)
560 ptr = &buffer[counter + 1];
562 else if (buffer[counter] == 0)
568 ptr = gdk_pixmap_skip_whitespaces (ptr);
572 else if (ptr[0] == '#')
575 while (ptr[counter] != 0 &&
576 ((ptr[counter] >= '0' && ptr[counter] <= '9') ||
577 (ptr[counter] >= 'a' && ptr[counter] <= 'f') ||
578 (ptr[counter] >= 'A' && ptr[counter] <= 'F')))
581 retcol = g_new (gchar, counter+1);
582 strncpy (retcol, ptr, counter);
592 space = MAX_COLOR_LEN - 1;
595 sscanf (ptr, "%127s", temp);
597 if (((gint)ptr[0] == 0) ||
598 (strcmp ("s", temp) == 0) || (strcmp ("m", temp) == 0) ||
599 (strcmp ("g", temp) == 0) || (strcmp ("g4", temp) == 0))
610 strncat (color, temp, space);
611 space -= MIN (space, strlen (temp));
612 ptr = gdk_pixmap_skip_string (ptr);
613 ptr = gdk_pixmap_skip_whitespaces (ptr);
618 retcol = g_strdup (color);
632 gdk_xpm_destroy_notify (gpointer data)
634 _GdkPixmapInfo *info = (_GdkPixmapInfo *)data;
638 for (i=0; i<info->ncolors; i++)
640 color.pixel = info->pixels[i];
641 gdk_colormap_free_colors (info->colormap, &color, 1);
644 gdk_colormap_unref (info->colormap);
649 _gdk_pixmap_create_from_xpm (GdkWindow *window,
650 GdkColormap *colormap,
652 GdkColor *transparent_color,
653 gchar * (*get_buf) (enum buffer_op op,
657 GdkPixmap *pixmap = NULL;
658 GdkImage *image = NULL;
662 gint width, height, num_cols, cpp, n, ns, cnt, xcnt, ycnt, wbytes;
663 gchar *buffer, pixel_str[32];
665 _GdkPixmapColor *color = NULL, *fallbackcolor = NULL;
666 _GdkPixmapColor *colors = NULL;
668 GHashTable *color_hash = NULL;
669 _GdkPixmapInfo *color_info = NULL;
671 if ((window == NULL) && (colormap == NULL))
672 g_warning ("Creating pixmap from xpm with NULL window and colormap");
675 window = (GdkWindow *)&gdk_root_parent;
677 if (colormap == NULL)
679 colormap = gdk_window_get_colormap (window);
680 visual = gdk_window_get_visual (window);
683 visual = ((GdkColormapPrivate *)colormap)->visual;
685 buffer = (*get_buf) (op_header, handle);
689 sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);
692 g_warning ("Pixmap has more than 31 characters per color");
696 color_hash = g_hash_table_new (g_str_hash, g_str_equal);
698 if (transparent_color == NULL)
700 gdk_color_white (colormap, &tmp_color);
701 transparent_color = &tmp_color;
704 /* For pseudo-color and grayscale visuals, we have to remember
705 * the colors we allocated, so we can free them later.
707 if ((visual->type == GDK_VISUAL_PSEUDO_COLOR) ||
708 (visual->type == GDK_VISUAL_GRAYSCALE))
710 color_info = g_malloc (sizeof (_GdkPixmapInfo) +
711 sizeof(gulong) * (num_cols - 1));
712 color_info->ncolors = num_cols;
713 color_info->colormap = colormap;
714 gdk_colormap_ref (colormap);
717 name_buf = g_new (gchar, num_cols * (cpp+1));
718 colors = g_new (_GdkPixmapColor, num_cols);
720 for (cnt = 0; cnt < num_cols; cnt++)
724 buffer = (*get_buf) (op_cmap, handle);
728 color = &colors[cnt];
729 color->color_string = &name_buf [cnt * (cpp + 1)];
730 strncpy (color->color_string, buffer, cpp);
731 color->color_string[cpp] = 0;
732 buffer += strlen (color->color_string);
733 color->transparent = FALSE;
735 color_name = gdk_pixmap_extract_color (buffer);
737 if (color_name == NULL ||
738 gdk_color_parse (color_name, &color->color) == FALSE)
740 color->color = *transparent_color;
741 color->transparent = TRUE;
746 /* FIXME: The remaining slowness appears to happen in this
748 gdk_color_alloc (colormap, &color->color);
751 color_info->pixels[cnt] = color->color.pixel;
753 g_hash_table_insert (color_hash, color->color_string, color);
755 fallbackcolor = color;
759 image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);
763 /* The pixmap mask is just a bits pattern.
764 * Color 0 is used for background and 1 for foreground.
765 * We don't care about the colormap, we just need 0 and 1.
767 GdkColor mask_pattern;
769 *mask = gdk_pixmap_new (window, width, height, 1);
770 gc = gdk_gc_new (*mask);
772 mask_pattern.pixel = 0;
773 gdk_gc_set_foreground (gc, &mask_pattern);
774 gdk_draw_rectangle (*mask, gc, TRUE, 0, 0, -1, -1);
776 mask_pattern.pixel = 1;
777 gdk_gc_set_foreground (gc, &mask_pattern);
780 wbytes = width * cpp;
781 for (ycnt = 0; ycnt < height; ycnt++)
783 buffer = (*get_buf) (op_body, handle);
785 /* FIXME: this slows things down a little - it could be
786 * integrated into the strncpy below, perhaps. OTOH, strlen
789 if ((buffer == NULL) || strlen (buffer) < wbytes)
792 for (n = 0, cnt = 0, xcnt = 0; n < wbytes; n += cpp, xcnt++)
794 strncpy (pixel_str, &buffer[n], cpp);
798 color = g_hash_table_lookup (color_hash, pixel_str);
800 if (!color) /* screwed up XPM file */
801 color = fallbackcolor;
803 gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);
805 if (mask && color->transparent)
808 gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
813 if (mask && (cnt < xcnt))
814 gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
824 pixmap = gdk_pixmap_new (window, width, height, visual->depth);
827 gdk_drawable_set_data (pixmap, "gdk-xpm", color_info,
828 gdk_xpm_destroy_notify);
830 gc = gdk_gc_new (pixmap);
831 gdk_gc_set_foreground (gc, transparent_color);
832 gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
834 gdk_image_destroy (image);
837 gdk_xpm_destroy_notify (color_info);
839 if (color_hash != NULL)
840 g_hash_table_destroy (color_hash);
845 if (name_buf != NULL)
861 file_buffer (enum buffer_op op, gpointer handle)
863 struct file_handle *h = handle;
868 if (gdk_pixmap_seek_string (h->infile, "XPM", FALSE) != TRUE)
871 if (gdk_pixmap_seek_char (h->infile,'{') != TRUE)
873 /* Fall through to the next gdk_pixmap_seek_char. */
876 gdk_pixmap_seek_char (h->infile, '"');
877 fseek (h->infile, -1, SEEK_CUR);
878 /* Fall through to the gdk_pixmap_read_string. */
881 gdk_pixmap_read_string (h->infile, &h->buffer, &h->buffer_size);
888 gdk_pixmap_colormap_create_from_xpm (GdkWindow *window,
889 GdkColormap *colormap,
891 GdkColor *transparent_color,
892 const gchar *filename)
894 struct file_handle h;
895 GdkPixmap *pixmap = NULL;
897 memset (&h, 0, sizeof (h));
898 h.infile = fopen (filename, "rb");
899 if (h.infile != NULL)
901 pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
912 gdk_pixmap_create_from_xpm (GdkWindow *window,
914 GdkColor *transparent_color,
915 const gchar *filename)
917 return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask,
918 transparent_color, filename);
929 mem_buffer (enum buffer_op op, gpointer handle)
931 struct mem_handle *h = handle;
937 if (h->data[h->offset])
938 return h->data[h->offset ++];
944 gdk_pixmap_colormap_create_from_xpm_d (GdkWindow *window,
945 GdkColormap *colormap,
947 GdkColor *transparent_color,
951 GdkPixmap *pixmap = NULL;
953 memset (&h, 0, sizeof (h));
955 pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
962 gdk_pixmap_create_from_xpm_d (GdkWindow *window,
964 GdkColor *transparent_color,
967 return gdk_pixmap_colormap_create_from_xpm_d (window, NULL, mask,
968 transparent_color, data);
972 gdk_pixmap_foreign_new (guint32 anid)
975 GdkWindowPrivate *window_private;
976 GdkWindowPrivate *private;
979 unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret;
981 /* check to make sure we were passed something at
982 least a little sane */
983 g_return_val_if_fail((anid != 0), NULL);
985 /* set the pixmap to the passed in value */
986 xpixmap = (HBITMAP) anid;
987 /* get the root window */
988 window_private = &gdk_root_parent;
990 /* get information about the BITMAP to fill in the structure for
992 GetBitmapDimensionEx (xpixmap, &size);
996 /* allocate a new gdk pixmap */
997 private = g_new(GdkWindowPrivate, 1);
998 pixmap = (GdkPixmap *)private;
1000 private->window_type = GDK_WINDOW_PIXMAP;
1001 private->xwindow = xpixmap;
1002 private->colormap = NULL;
1003 private->parent = NULL;
1006 private->width = w_ret;
1007 private->height = h_ret;
1008 private->resize_count = 0;
1009 private->ref_count = 1;
1010 private->destroyed = 0;
1012 gdk_xid_table_insert(&private->xwindow, pixmap);
1018 gdk_pixmap_ref (GdkPixmap *pixmap)
1020 GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
1021 g_return_val_if_fail (pixmap != NULL, NULL);
1023 private->ref_count += 1;
1028 gdk_pixmap_unref (GdkPixmap *pixmap)
1030 GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
1031 g_return_if_fail(pixmap != NULL);
1033 private->ref_count -= 1;
1035 GDK_NOTE (MISC, g_print ("gdk_pixmap_unref: %#x %d%s\n",
1036 private->xwindow, private->ref_count,
1037 (private->ref_count == 0 ? " freeing" : "")));
1039 if (private->ref_count == 0)
1041 if (!DeleteObject (private->xwindow))
1042 g_warning ("gdk_pixmap_unref: DeleteObject failed");
1043 gdk_xid_table_remove (private->xwindow);
1044 g_dataset_destroy (private);
1050 gdk_bitmap_ref (GdkBitmap *bitmap)
1052 return (GdkBitmap *)gdk_pixmap_ref ((GdkPixmap *)bitmap);
1056 gdk_bitmap_unref (GdkBitmap *bitmap)
1058 gdk_pixmap_unref ((GdkPixmap *)bitmap);