现在我已经有了我想要正确绘制它们的图标。 目前我正在使用开罗在窗户上绘制这些图像。 我有一个掩码,图标为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);
}
但图标没有透明度。我找不到用互联网上的cairo来解决这个问题的例子。只有一种复杂的方式,但它的记录非常严重,根本无法帮助我。 有人有关于如何使用透明胶片恢复原始图标的链接或示例吗? 提前谢谢。
答案 0 :(得分:3)
以下是令人敬畏的例子,它将图标“转变”为一个cairo表面:https://github.com/awesomeWM/awesome/blob/430f4fab15bb101b4af9fadbebb9a9bfa47ba9de/objects/client.c#L1501
这使用xcb而不是Xlib,但你应该设法仍然理解这一点。处理掩码的部分从第1538行开始。基本上,创建一个新的cairo表面并为其设置一个cairo上下文。源表面是图标,掩码通过cairo_mask_surface
应用(“使用某些cairo表面的alpha通道作为绘图操作的掩码”)。您只需将此部分复制到代码中,这样就不必将图标绘制到临时表面。
TL; DR://How do I apply the mask?
的答案是:使用cairo_mask_surface()
代替cairo_paint()
。