- GdkPixbuf *mask_buf = xg_get_pixbuf_from_pixmap (f, mask);
- guchar *pixels = gdk_pixbuf_get_pixels (icon_buf);
- guchar *mask_pixels = gdk_pixbuf_get_pixels (mask_buf);
- int rowstride = gdk_pixbuf_get_rowstride (icon_buf);
- int mask_rowstride = gdk_pixbuf_get_rowstride (mask_buf);
- int y;
-
- for (y = 0; y < height; ++y)
- {
- guchar *iconptr, *maskptr;
- int x;
-
- iconptr = pixels + y * rowstride;
- maskptr = mask_pixels + y * mask_rowstride;
-
- for (x = 0; x < width; ++x)
- {
- /* In a bitmap, RGB is either 255/255/255 or 0/0/0. Checking
- just R is sufficient. */
- if (maskptr[0] == 0)
- iconptr[3] = 0; /* 0, 1, 2 is R, G, B. 3 is alpha. */
-
- iconptr += rowstride/width;
- maskptr += mask_rowstride/width;
- }
- }
+ XImage *xmm = (! mask ? 0
+ : XGetImage (FRAME_X_DISPLAY (f), mask, 0, 0,
+ width, height, ~0, XYPixmap));
+ icon_buf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+ if (icon_buf)
+ {
+ guchar *pixels = gdk_pixbuf_get_pixels (icon_buf);
+ int rowjunkwidth = gdk_pixbuf_get_rowstride (icon_buf) - width * 4;
+ for (int y = 0; y < height; y++, pixels += rowjunkwidth)
+ for (int x = 0; x < width; x++)
+ {
+ unsigned long rgb = XGetPixel (xim, x, y);
+ *pixels++ = (rgb >> 16) & 255;
+ *pixels++ = (rgb >> 8) & 255;
+ *pixels++ = rgb & 255;
+ *pixels++ = xmm && !XGetPixel (xmm, x, y) ? 0 : 255;
+ }
+ }