#else
#if defined HAVE_XRENDER && (RENDER_MAJOR > 0 || (RENDER_MINOR >= 2))
if (respect_alpha_background
- && FRAME_DISPLAY_INFO (f)->n_planes == 32
+ && FRAME_DISPLAY_INFO (f)->alpha_bits
&& FRAME_CHECK_XR_VERSION (f, 0, 2))
{
x_xr_ensure_picture (f);
#else
#if defined HAVE_XRENDER && (RENDER_MAJOR > 0 || (RENDER_MINOR >= 2))
if (respect_alpha_background
- && FRAME_DISPLAY_INFO (f)->n_planes == 32
+ && FRAME_DISPLAY_INFO (f)->alpha_bits
&& FRAME_CHECK_XR_VERSION (f, 0, 2))
{
x_xr_ensure_picture (f);
colors[i].green = (g * gmult) >> 16;
colors[i].blue = (b * bmult) >> 16;
}
-
- if (FRAME_DISPLAY_INFO (f)->n_planes == 32)
- {
- for (i = 0; i < ncolors; ++i)
- colors[i].pixel |= ((unsigned long) 0xFF << 24);
- }
return;
}
}
XQueryColors (FRAME_X_DISPLAY (f), FRAME_X_COLORMAP (f), colors, ncolors);
-
- if (FRAME_DISPLAY_INFO (f)->n_planes == 32)
- {
- for (i = 0; i < ncolors; ++i)
- colors[i].pixel |= ((unsigned long) 0xFF << 24);
- }
}
/* Store F's background color into *BGCOLOR. */
gamma_correct (f, color);
- if (dpyinfo->red_bits > 0)
+ if (dpyinfo->red_bits > 0
+ && (dpyinfo->n_planes != 32
+ || dpyinfo->alpha_bits > 0))
{
color->pixel = x_make_truecolor_pixel (dpyinfo,
color->red,
reset_mouse_highlight (&dpyinfo->mouse_highlight);
- /* See if we can construct pixel values from RGB values. */
- if (dpyinfo->visual->class == TrueColor)
+#ifdef HAVE_XRENDER
+ int event_base, error_base;
+ dpyinfo->xrender_supported_p
+ = XRenderQueryExtension (dpyinfo->display, &event_base, &error_base);
+
+ if (dpyinfo->xrender_supported_p)
{
- get_bits_and_offset (dpyinfo->visual->red_mask,
- &dpyinfo->red_bits, &dpyinfo->red_offset);
- get_bits_and_offset (dpyinfo->visual->blue_mask,
- &dpyinfo->blue_bits, &dpyinfo->blue_offset);
- get_bits_and_offset (dpyinfo->visual->green_mask,
- &dpyinfo->green_bits, &dpyinfo->green_offset);
+ if (!XRenderQueryVersion (dpyinfo->display, &dpyinfo->xrender_major,
+ &dpyinfo->xrender_minor))
+ dpyinfo->xrender_supported_p = false;
+ else
+ dpyinfo->pict_format = XRenderFindVisualFormat (dpyinfo->display,
+ dpyinfo->visual);
}
+#endif
/* See if a private colormap is requested. */
if (dpyinfo->visual == DefaultVisualOfScreen (dpyinfo->screen))
dpyinfo->cmap = XCreateColormap (dpyinfo->display, dpyinfo->root_window,
dpyinfo->visual, AllocNone);
+ /* See if we can construct pixel values from RGB values. */
+ if (dpyinfo->visual->class == TrueColor)
+ {
+ get_bits_and_offset (dpyinfo->visual->red_mask,
+ &dpyinfo->red_bits, &dpyinfo->red_offset);
+ get_bits_and_offset (dpyinfo->visual->blue_mask,
+ &dpyinfo->blue_bits, &dpyinfo->blue_offset);
+ get_bits_and_offset (dpyinfo->visual->green_mask,
+ &dpyinfo->green_bits, &dpyinfo->green_offset);
+
+#ifdef HAVE_XRENDER
+ if (dpyinfo->pict_format)
+ {
+ get_bits_and_offset (((unsigned long) dpyinfo->pict_format->direct.alphaMask
+ << dpyinfo->pict_format->direct.alpha),
+ &dpyinfo->alpha_bits, &dpyinfo->alpha_offset);
+ }
+ else
+#endif
+ {
+ XColor xc;
+ unsigned long alpha_mask;
+ xc.red = 65535;
+ xc.green = 65535;
+ xc.blue = 65535;
+
+ if (XAllocColor (dpyinfo->display,
+ dpyinfo->cmap, &xc) != 0)
+ {
+ alpha_mask = xc.pixel & ~(dpyinfo->visual->red_mask
+ | dpyinfo->visual->blue_mask
+ | dpyinfo->visual->green_mask);
+
+ if (alpha_mask)
+ get_bits_and_offset (alpha_mask, &dpyinfo->alpha_bits,
+ &dpyinfo->alpha_offset);
+ }
+ }
+ }
+
#ifdef HAVE_XDBE
dpyinfo->supports_xdbe = false;
int xdbe_major;
}
#endif
-#ifdef HAVE_XRENDER
- int event_base, error_base;
- dpyinfo->xrender_supported_p
- = XRenderQueryExtension (dpyinfo->display, &event_base, &error_base);
-
- if (dpyinfo->xrender_supported_p)
- {
- if (!XRenderQueryVersion (dpyinfo->display, &dpyinfo->xrender_major,
- &dpyinfo->xrender_minor))
- dpyinfo->xrender_supported_p = false;
- else
- dpyinfo->pict_format = XRenderFindVisualFormat (dpyinfo->display,
- dpyinfo->visual);
- }
-#endif
-
#ifdef HAVE_XFIXES
int xfixes_event_base, xfixes_error_base;
dpyinfo->xfixes_supported_p
int ncolor_cells;
/* Bits and shifts to use to compose pixel values on TrueColor visuals. */
- int red_bits, blue_bits, green_bits;
- int red_offset, blue_offset, green_offset;
+ int red_bits, blue_bits, green_bits, alpha_bits;
+ int red_offset, blue_offset, green_offset, alpha_offset;
/* The type of window manager we have. If we move FRAME_OUTER_WINDOW
to x/y 0/0, some window managers (type A) puts the window manager
pg = (g >> (16 - dpyinfo->green_bits)) << dpyinfo->green_offset;
pb = (b >> (16 - dpyinfo->blue_bits)) << dpyinfo->blue_offset;
- if (dpyinfo->n_planes == 32)
- pa = ((unsigned long) 0xFF << 24);
+ if (dpyinfo->alpha_bits)
+ pa = (((unsigned long) 0xffff >> (16 - dpyinfo->alpha_bits))
+ << dpyinfo->alpha_offset);
+ else
+ pa = 0;
/* Assemble the pixel color. */
return pr | pg | pb | pa;