iconcache: Avoid xrender picture formats when creating cairo surface

If an application provides its window icon via wmhints, then mutter
loads the pixmap specified by the application into a cairo xlib surface. When
creating the surface it specifies the visual, indirectly, via an XRender
picture format.

This is suboptimal, since XRender picture formats don't have a way to specify
16bpp depth, which an application may be using.

In particular, applications are likely to use 16bpp depth pixmaps for their
icons, if the video card offers a 16bpp framebuffer/root window.

This commit drops the XRender middleman, and just tells cairo a visual to use
directly.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/715
This commit is contained in:
Ray Strode 2019-08-05 14:39:21 -04:00 committed by Jonas Ådahl
parent 1a5cba5df5
commit 556e7694de

View File

@ -288,34 +288,12 @@ get_pixmap_geometry (MetaX11Display *x11_display,
*d = depth; *d = depth;
} }
static int
standard_pict_format_for_depth (int depth)
{
switch (depth)
{
case 1:
return PictStandardA1;
case 24:
return PictStandardRGB24;
case 32:
return PictStandardARGB32;
default:
g_assert_not_reached ();
}
return 0;
}
static XRenderPictFormat *
pict_format_for_depth (Display *xdisplay, int depth)
{
return XRenderFindStandardFormat (xdisplay, standard_pict_format_for_depth (depth));
}
static cairo_surface_t * static cairo_surface_t *
surface_from_pixmap (Display *xdisplay, Pixmap xpixmap, surface_from_pixmap (Display *xdisplay, Pixmap xpixmap,
int width, int height) int width, int height)
{ {
Window root_return; Window root_return;
XVisualInfo visual_info;
int x_ret, y_ret; int x_ret, y_ret;
unsigned int w_ret, h_ret, bw_ret, depth_ret; unsigned int w_ret, h_ret, bw_ret, depth_ret;
@ -323,8 +301,12 @@ surface_from_pixmap (Display *xdisplay, Pixmap xpixmap,
&x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret)) &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
return NULL; return NULL;
return cairo_xlib_surface_create_with_xrender_format (xdisplay, xpixmap, DefaultScreenOfDisplay (xdisplay), if (!XMatchVisualInfo (xdisplay, DefaultScreen (xdisplay),
pict_format_for_depth (xdisplay, depth_ret), w_ret, h_ret); depth_ret, TrueColor, &visual_info))
return NULL;
return cairo_xlib_surface_create (xdisplay, xpixmap, visual_info.visual,
w_ret, h_ret);
} }
static gboolean static gboolean