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_pixmap_new (GdkWindow *window,
59 GdkDrawablePrivate *private;
60 GdkWindowPrivate *window_private;
62 BITMAPINFOHEADER bmiHeader;
66 RGBQUAD bmiColors[256];
75 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
76 g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);
77 g_return_val_if_fail ((width != 0) && (height != 0), NULL);
80 window = (GdkWindow*) gdk_root_parent;
82 if (GDK_DRAWABLE_DESTROYED (window))
84 window_private = (GdkWindowPrivate*) window;
87 depth = gdk_drawable_get_visual (window)->depth;
89 GDK_NOTE (MISC, g_print ("gdk_pixmap_new: %dx%dx%d\n",
90 width, height, depth));
92 private = g_new0 (GdkDrawablePrivate, 1);
93 pixmap = (GdkPixmap*) private;
95 private->window_type = GDK_DRAWABLE_PIXMAP;
97 visual = gdk_drawable_get_visual (window);
99 if ((hdc = GetDC (GDK_DRAWABLE_XID (window))) == NULL)
101 g_warning ("gdk_pixmap_new: GetDC failed");
106 bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
107 bmi.bmiHeader.biWidth = width;
108 bmi.bmiHeader.biHeight = -height;
109 bmi.bmiHeader.biPlanes = 1;
111 bmi.bmiHeader.biBitCount = 16;
113 bmi.bmiHeader.biBitCount = depth;
116 bmi.bmiHeader.biCompression = BI_BITFIELDS;
119 bmi.bmiHeader.biCompression = BI_RGB;
120 bmi.bmiHeader.biSizeImage = 0;
121 bmi.bmiHeader.biXPelsPerMeter =
122 bmi.bmiHeader.biYPelsPerMeter = 0;
123 bmi.bmiHeader.biClrUsed = 0;
124 bmi.bmiHeader.biClrImportant = 0;
126 iUsage = DIB_RGB_COLORS;
129 bmi.u.bmiColors[0].rgbBlue =
130 bmi.u.bmiColors[0].rgbGreen =
131 bmi.u.bmiColors[0].rgbRed = 0x00;
132 bmi.u.bmiColors[0].rgbReserved = 0x00;
134 bmi.u.bmiColors[1].rgbBlue =
135 bmi.u.bmiColors[1].rgbGreen =
136 bmi.u.bmiColors[1].rgbRed = 0xFF;
137 bmi.u.bmiColors[1].rgbReserved = 0x00;
138 private->colormap = NULL;
142 private->colormap = window_private->drawable.colormap;
143 if (private->colormap == NULL)
144 private->colormap = gdk_colormap_get_system ();
148 iUsage = DIB_PAL_COLORS;
149 for (i = 0; i < 256; i++)
150 bmi.u.bmiIndices[i] = i;
154 if (depth != visual->depth)
155 g_warning ("gdk_pixmap_new: depth %d doesn't match display depth %d",
156 depth, visual->depth);
160 bmi.u.bmiMasks[0] = visual->red_mask;
161 bmi.u.bmiMasks[1] = visual->green_mask;
162 bmi.u.bmiMasks[2] = visual->blue_mask;
167 if ((private->xwindow =
168 CreateDIBSection (hdc, (BITMAPINFO *) &bmi,
169 iUsage, (PVOID *) &bits, NULL, 0)) == NULL)
171 g_warning ("gdk_pixmap_new: CreateDIBSection failed: %d", GetLastError ());
172 ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
176 ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
178 GDK_NOTE (MISC, g_print ("... = %#x\n", private->xwindow));
180 private->width = width;
181 private->height = height;
182 private->ref_count = 1;
183 private->destroyed = 0;
185 gdk_xid_table_insert (&private->xwindow, pixmap);
191 gdk_pixmap_create_on_shared_image (GdkImage **image_return,
199 GdkImagePrivate *image_private;
200 GdkDrawablePrivate *private;
201 GdkWindowPrivate *window_private;
203 g_return_val_if_fail (window != NULL, NULL);
205 window_private = (GdkWindowPrivate *) window;
208 *image_return = gdk_image_bitmap_new (GDK_IMAGE_SHARED_PIXMAP, visual, width, height);
211 g_return_val_if_fail (depth == visual->depth, NULL);
212 *image_return = gdk_image_new (GDK_IMAGE_SHARED_PIXMAP, visual, width, height);
215 g_return_val_if_fail (*image_return != NULL, NULL);
217 image_private = (GdkImagePrivate *) *image_return;
219 private = g_new0 (GdkDrawablePrivate, 1);
220 pixmap = (GdkPixmap*) private;
222 private->xwindow = image_private->ximage;
223 private->window_type = GDK_DRAWABLE_PIXMAP;
224 private->colormap = window_private->drawable.colormap;
225 private->width = width;
226 private->height = height;
227 private->ref_count = 1;
228 private->destroyed = 0;
230 gdk_xid_table_insert (&private->xwindow, pixmap);
233 g_print ("gdk_pixmap_create_on_shared_image: %dx%dx%d = %#x\n",
234 width, height, depth, private->xwindow));
239 static unsigned char mirror[256] = {
240 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
241 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
242 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
243 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
244 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
245 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
246 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
247 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
248 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
249 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
250 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
251 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
252 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
253 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
254 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
255 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
256 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
257 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
258 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
259 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
260 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
261 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
262 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
263 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
264 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
265 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
266 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
267 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
268 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
269 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
270 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
271 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
275 gdk_bitmap_create_from_data (GdkWindow *window,
281 GdkDrawablePrivate *private;
282 gint i, j, bpl, aligned_bpl;
285 g_return_val_if_fail (data != NULL, NULL);
286 g_return_val_if_fail ((width != 0) && (height != 0), NULL);
287 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
290 window = (GdkWindow*) gdk_root_parent;
292 if (GDK_DRAWABLE_DESTROYED (window))
295 private = g_new0 (GdkDrawablePrivate, 1);
296 pixmap = (GdkPixmap*) private;
298 private->window_type = GDK_DRAWABLE_PIXMAP;
299 private->width = width;
300 private->height = height;
301 private->ref_count = 1;
302 private->destroyed = FALSE;
304 bpl = ((width - 1) / 8 + 1);
305 aligned_bpl = ((bpl - 1) / 2 + 1) * 2;
306 bits = g_malloc (aligned_bpl * height);
307 for (i = 0; i < height; i++)
308 for (j = 0; j < bpl; j++)
309 bits[i*aligned_bpl + j] = mirror[(guchar) data[i*bpl + j]];
310 private->xwindow = CreateBitmap (width, height, 1, 1, bits);
312 GDK_NOTE (MISC, g_print ("gdk_bitmap_create_from_data: %dx%d = %#x\n",
313 width, height, private->xwindow));
317 private->colormap = NULL;
318 gdk_xid_table_insert (&private->xwindow, pixmap);
324 gdk_pixmap_create_from_data (GdkWindow *window,
332 /* Oh wow. I struggled with dozens of lines of code trying to get
333 * this right using a monochrome Win32 bitmap created from data, and
334 * a colour DIB section as the result, trying setting pens,
335 * background colors, whatnot and BitBlt:ing. Nope. Then finally I
336 * realized it's much easier to do it using gdk...:
339 GdkPixmap *result = gdk_pixmap_new (window, width, height, depth);
340 GdkPixmap *source = gdk_bitmap_create_from_data (window, data, width, height);
341 GdkGC *gc = gdk_gc_new (result);
342 gdk_gc_set_foreground (gc, fg);
343 gdk_gc_set_background (gc, bg);
344 gdk_draw_pixmap (result, gc, source, 0, 0, 0, 0, width, height);
345 gdk_pixmap_unref (source);
348 GDK_NOTE (MISC, g_print ("gdk_pixmap_create_from_data: %dx%dx%d = %#x\n",
349 width, height, depth,
350 GDK_DRAWABLE_XID (result)));
355 gdk_pixmap_seek_string (FILE *infile,
361 while (!feof (infile))
363 fscanf (infile, "%1023s", instr);
364 if (skip_comments == TRUE && strcmp (instr, "/*") == 0)
366 fscanf (infile, "%1023s", instr);
367 while (!feof (infile) && strcmp (instr, "*/") != 0)
368 fscanf (infile, "%1023s", instr);
369 fscanf(infile, "%1023s", instr);
371 if (strcmp (instr, str)==0)
379 gdk_pixmap_seek_char (FILE *infile,
384 while ((b = getc(infile)) != EOF)
386 if (c != b && b == '/')
391 else if (b == '*') /* we have a comment */
401 while (!(oldb == '*' && b == '/'));
411 gdk_pixmap_read_string (FILE *infile,
416 guint cnt = 0, bufsiz, ret = FALSE;
420 bufsiz = *buffer_size;
423 bufsiz = 10 * sizeof (gchar);
424 buf = g_new(gchar, bufsiz);
429 while (c != EOF && c != '"');
434 while ((c = getc(infile)) != EOF)
438 guint new_size = bufsiz * 2;
439 if (new_size > bufsiz)
444 buf = (gchar *) g_realloc (buf, bufsiz);
445 buf[bufsiz-1] = '\0';
459 buf[bufsiz-1] = '\0'; /* ensure null termination for errors */
461 *buffer_size = bufsiz;
466 gdk_pixmap_skip_whitespaces (gchar *buffer)
470 while (buffer[index] != 0 && (buffer[index] == 0x20 || buffer[index] == 0x09))
473 return &buffer[index];
477 gdk_pixmap_skip_string (gchar *buffer)
481 while (buffer[index] != 0 && buffer[index] != 0x20 && buffer[index] != 0x09)
484 return &buffer[index];
487 #define MAX_COLOR_LEN 120
490 gdk_pixmap_extract_color (gchar *buffer)
492 gint counter, numnames;
493 gchar *ptr = NULL, ch, temp[128];
494 gchar color[MAX_COLOR_LEN], *retcol;
500 if (buffer[counter] == 'c')
502 ch = buffer[counter + 1];
503 if (ch == 0x20 || ch == 0x09)
504 ptr = &buffer[counter + 1];
506 else if (buffer[counter] == 0)
512 ptr = gdk_pixmap_skip_whitespaces (ptr);
516 else if (ptr[0] == '#')
519 while (ptr[counter] != 0 &&
520 ((ptr[counter] >= '0' && ptr[counter] <= '9') ||
521 (ptr[counter] >= 'a' && ptr[counter] <= 'f') ||
522 (ptr[counter] >= 'A' && ptr[counter] <= 'F')))
525 retcol = g_new (gchar, counter+1);
526 strncpy (retcol, ptr, counter);
536 space = MAX_COLOR_LEN - 1;
539 sscanf (ptr, "%127s", temp);
541 if (((gint)ptr[0] == 0) ||
542 (strcmp ("s", temp) == 0) || (strcmp ("m", temp) == 0) ||
543 (strcmp ("g", temp) == 0) || (strcmp ("g4", temp) == 0))
554 strncat (color, temp, space);
555 space -= MIN (space, strlen (temp));
556 ptr = gdk_pixmap_skip_string (ptr);
557 ptr = gdk_pixmap_skip_whitespaces (ptr);
562 retcol = g_strdup (color);
576 gdk_xpm_destroy_notify (gpointer data)
578 _GdkPixmapInfo *info = (_GdkPixmapInfo *)data;
582 for (i=0; i<info->ncolors; i++)
584 color.pixel = info->pixels[i];
585 gdk_colormap_free_colors (info->colormap, &color, 1);
588 gdk_colormap_unref (info->colormap);
593 _gdk_pixmap_create_from_xpm (GdkWindow *window,
594 GdkColormap *colormap,
596 GdkColor *transparent_color,
597 gchar * (*get_buf) (enum buffer_op op,
601 GdkPixmap *pixmap = NULL;
602 GdkImage *image = NULL;
606 gint width, height, num_cols, cpp, n, ns, cnt, xcnt, ycnt, wbytes;
607 gchar *buffer, pixel_str[32];
609 _GdkPixmapColor *color = NULL, *fallbackcolor = NULL;
610 _GdkPixmapColor *colors = NULL;
612 GHashTable *color_hash = NULL;
613 _GdkPixmapInfo *color_info = NULL;
615 if ((window == NULL) && (colormap == NULL))
616 g_warning ("Creating pixmap from xpm with NULL window and colormap");
619 window = (GdkWindow *) gdk_root_parent;
621 if (colormap == NULL)
623 colormap = gdk_window_get_colormap (window);
624 visual = gdk_window_get_visual (window);
627 visual = ((GdkColormapPrivate *)colormap)->visual;
629 buffer = (*get_buf) (op_header, handle);
633 sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);
636 g_warning ("Pixmap has more than 31 characters per color");
640 color_hash = g_hash_table_new (g_str_hash, g_str_equal);
642 if (transparent_color == NULL)
644 gdk_color_white (colormap, &tmp_color);
645 transparent_color = &tmp_color;
648 /* For pseudo-color and grayscale visuals, we have to remember
649 * the colors we allocated, so we can free them later.
651 if ((visual->type == GDK_VISUAL_PSEUDO_COLOR) ||
652 (visual->type == GDK_VISUAL_GRAYSCALE))
654 color_info = g_malloc (sizeof (_GdkPixmapInfo) +
655 sizeof(gulong) * (num_cols - 1));
656 color_info->ncolors = num_cols;
657 color_info->colormap = colormap;
658 gdk_colormap_ref (colormap);
661 name_buf = g_new (gchar, num_cols * (cpp+1));
662 colors = g_new (_GdkPixmapColor, num_cols);
664 for (cnt = 0; cnt < num_cols; cnt++)
668 buffer = (*get_buf) (op_cmap, handle);
672 color = &colors[cnt];
673 color->color_string = &name_buf [cnt * (cpp + 1)];
674 strncpy (color->color_string, buffer, cpp);
675 color->color_string[cpp] = 0;
676 buffer += strlen (color->color_string);
677 color->transparent = FALSE;
679 color_name = gdk_pixmap_extract_color (buffer);
681 if (color_name == NULL ||
682 gdk_color_parse (color_name, &color->color) == FALSE)
684 color->color = *transparent_color;
685 color->transparent = TRUE;
690 /* FIXME: The remaining slowness appears to happen in this
692 gdk_color_alloc (colormap, &color->color);
695 color_info->pixels[cnt] = color->color.pixel;
697 g_hash_table_insert (color_hash, color->color_string, color);
699 fallbackcolor = color;
703 image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);
707 /* The pixmap mask is just a bits pattern.
708 * Color 0 is used for background and 1 for foreground.
709 * We don't care about the colormap, we just need 0 and 1.
711 GdkColor mask_pattern;
713 *mask = gdk_pixmap_new (window, width, height, 1);
714 gc = gdk_gc_new (*mask);
716 mask_pattern.pixel = 0;
717 gdk_gc_set_foreground (gc, &mask_pattern);
718 gdk_draw_rectangle (*mask, gc, TRUE, 0, 0, -1, -1);
720 mask_pattern.pixel = 1;
721 gdk_gc_set_foreground (gc, &mask_pattern);
724 wbytes = width * cpp;
725 for (ycnt = 0; ycnt < height; ycnt++)
727 buffer = (*get_buf) (op_body, handle);
729 /* FIXME: this slows things down a little - it could be
730 * integrated into the strncpy below, perhaps. OTOH, strlen
733 if ((buffer == NULL) || strlen (buffer) < wbytes)
736 for (n = 0, cnt = 0, xcnt = 0; n < wbytes; n += cpp, xcnt++)
738 strncpy (pixel_str, &buffer[n], cpp);
742 color = g_hash_table_lookup (color_hash, pixel_str);
744 if (!color) /* screwed up XPM file */
745 color = fallbackcolor;
747 gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);
749 if (mask && color->transparent)
752 gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
757 if (mask && (cnt < xcnt))
758 gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
768 pixmap = gdk_pixmap_new (window, width, height, visual->depth);
771 gdk_drawable_set_data (pixmap, "gdk-xpm", color_info,
772 gdk_xpm_destroy_notify);
774 gc = gdk_gc_new (pixmap);
775 gdk_gc_set_foreground (gc, transparent_color);
776 gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
778 gdk_image_destroy (image);
781 gdk_xpm_destroy_notify (color_info);
783 if (color_hash != NULL)
784 g_hash_table_destroy (color_hash);
789 if (name_buf != NULL)
805 file_buffer (enum buffer_op op, gpointer handle)
807 struct file_handle *h = handle;
812 if (gdk_pixmap_seek_string (h->infile, "XPM", FALSE) != TRUE)
815 if (gdk_pixmap_seek_char (h->infile,'{') != TRUE)
817 /* Fall through to the next gdk_pixmap_seek_char. */
820 gdk_pixmap_seek_char (h->infile, '"');
821 fseek (h->infile, -1, SEEK_CUR);
822 /* Fall through to the gdk_pixmap_read_string. */
825 gdk_pixmap_read_string (h->infile, &h->buffer, &h->buffer_size);
832 gdk_pixmap_colormap_create_from_xpm (GdkWindow *window,
833 GdkColormap *colormap,
835 GdkColor *transparent_color,
836 const gchar *filename)
838 struct file_handle h;
839 GdkPixmap *pixmap = NULL;
841 memset (&h, 0, sizeof (h));
842 h.infile = fopen (filename, "rb");
843 if (h.infile != NULL)
845 pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
856 gdk_pixmap_create_from_xpm (GdkWindow *window,
858 GdkColor *transparent_color,
859 const gchar *filename)
861 return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask,
862 transparent_color, filename);
873 mem_buffer (enum buffer_op op, gpointer handle)
875 struct mem_handle *h = handle;
881 if (h->data[h->offset])
882 return h->data[h->offset ++];
888 gdk_pixmap_colormap_create_from_xpm_d (GdkWindow *window,
889 GdkColormap *colormap,
891 GdkColor *transparent_color,
895 GdkPixmap *pixmap = NULL;
897 memset (&h, 0, sizeof (h));
899 pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
906 gdk_pixmap_create_from_xpm_d (GdkWindow *window,
908 GdkColor *transparent_color,
911 return gdk_pixmap_colormap_create_from_xpm_d (window, NULL, mask,
912 transparent_color, data);
916 gdk_pixmap_foreign_new (guint32 anid)
919 GdkDrawablePrivate *private;
920 GdkWindowPrivate *window_private;
923 unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret;
925 /* check to make sure we were passed something at
926 least a little sane */
927 g_return_val_if_fail((anid != 0), NULL);
929 /* set the pixmap to the passed in value */
930 xpixmap = (HBITMAP) anid;
931 /* get the root window */
932 window_private = gdk_root_parent;
934 /* get information about the BITMAP to fill in the structure for
936 GetBitmapDimensionEx (xpixmap, &size);
940 /* allocate a new gdk pixmap */
941 private = g_new (GdkDrawablePrivate, 1);
942 pixmap = (GdkPixmap *)private;
944 private->window_type = GDK_DRAWABLE_PIXMAP;
945 private->xwindow = xpixmap;
946 private->colormap = NULL;
947 private->width = w_ret;
948 private->height = h_ret;
949 private->ref_count = 1;
950 private->destroyed = 0;
952 gdk_xid_table_insert(&private->xwindow, pixmap);
958 gdk_pixmap_ref (GdkPixmap *pixmap)
960 GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap;
961 g_return_val_if_fail (pixmap != NULL, NULL);
962 g_return_val_if_fail (GDK_IS_PIXMAP (private), NULL);
964 private->ref_count += 1;
969 gdk_pixmap_unref (GdkPixmap *pixmap)
971 GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap;
972 g_return_if_fail (pixmap != NULL);
973 g_return_if_fail (GDK_IS_PIXMAP (private));
974 g_return_if_fail (private->ref_count > 0);
976 private->ref_count -= 1;
978 GDK_NOTE (MISC, g_print ("gdk_pixmap_unref: %#x %d%s\n",
979 private->xwindow, private->ref_count,
980 (private->ref_count == 0 ? " freeing" : "")));
982 if (private->ref_count == 0)
984 if (!DeleteObject (private->xwindow))
985 g_warning ("gdk_pixmap_unref: DeleteObject failed");
986 gdk_xid_table_remove (private->xwindow);
987 g_dataset_destroy (private);
993 gdk_bitmap_ref (GdkBitmap *bitmap)
995 return (GdkBitmap *)gdk_pixmap_ref ((GdkPixmap *)bitmap);
999 gdk_bitmap_unref (GdkBitmap *bitmap)
1001 gdk_pixmap_unref ((GdkPixmap *)bitmap);