mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 11:32:04 +00:00
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:
parent
1a5cba5df5
commit
556e7694de
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user