在xlib和cairo中绘制具有透明度的图标

在xlib和cairo中绘制具有透明度的图标,c,x11,cairo,xlib,pixmap,C,X11,Cairo,Xlib,Pixmap,现在我已经有了图标,我想正确地绘制它们。 目前,我正在使用Cairo在窗口上绘制这些图像。 我有一个面具,图标是pixmap cairo_surface_t *image; cairo_surface_t *imask; cairo_surface_t *surface; cairo_t *csurface; surface = cairo_xlib_surface_create(display, d, DefaultVisual(display, screen), 400, 400); cs

现在我已经有了图标,我想正确地绘制它们。 目前,我正在使用Cairo在窗口上绘制这些图像。 我有一个面具,图标是pixmap

cairo_surface_t *image;
cairo_surface_t *imask;
cairo_surface_t *surface;
cairo_t *csurface;

surface = cairo_xlib_surface_create(display, d, DefaultVisual(display, screen), 400, 400);
csurface = cairo_create(surface);

Pixmap icon;
Pixmap mask;

//XWM Stuff ...
if(icon != 0)
{
   get_pixmap_geometry(display, icon, &width, &height, &depth);
   image = cairo_xlib_surface_create(display, icon, DefaultVisual(display, screen), width, height);
   cairo_set_source_surface(csurface, image, 0, 0);
   //How do I apply the mask?
   //I tried cairo_set_operator(csurface, CAIRO_OPERATOR_SOURCE);
   cairo_paint(csurface);
}
但是图标没有任何透明胶片。我在互联网上找不到解决这个问题的例子。只有一个复杂的方法,但它的记录太差,根本帮不上我的忙。 是否有人提供了一个链接或示例,说明如何使用透明胶片恢复原始图标?
提前感谢。

下面是一个来自awesome的示例,它将图标“变成”开罗曲面:

这使用xcb而不是Xlib,但您应该设法理解这一点。处理遮罩的部分从第1538行开始。基本上,将创建一个新的cairo曲面,并为其设置cairo上下文。源曲面是图标,遮罩通过
cairo\u mask\u surface
(“使用某些cairo曲面的alpha通道作为绘图操作的遮罩”)应用。您可以将此部分复制到代码中,这样就不必将图标绘制到临时曲面上

TL;DR:your
//如何应用遮罩?
的答案是:使用
cairo\u mask\u surface()
而不是
cairo\u paint()