现在我已经有了我想要正确绘制它们的图标。 目前我正在使用 Cairo 在窗口上绘制这些图像。 我有一个蒙版和像素图图标。
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 解决此问题的示例。只有一种复杂的方法,但它的记录非常糟糕,对我根本没有帮助。 有人有关于如何恢复原始图标及其透明度的链接或示例吗? 预先感谢您。
最佳答案
这是一个来自 Awesome 的示例,它将图标“变成”开罗表面: https://github.com/awesomeWM/awesome/blob/430f4fab15bb101b4af9fadbebb9a9bfa47ba9de/objects/client.c#L1501
它使用 xcb 而不是 Xlib,但您应该设法仍然理解这一点。处理 mask 的部分从第 1538 行开始。基本上,创建一个新的 cairo 表面并为其设置 cairo 上下文。源表面是图标,蒙版通过 cairo_mask_surface
应用。 (“使用某些 cairo 表面的 alpha channel 作为绘图操作的 mask ”)。您只需将此部分复制到您的代码中,这样您就不必将图标绘制到临时表面上。
TL;DR:您的 //How do I apply the mask?
的答案是:使用cairo_mask_surface()
而不是cairo_paint()
.
关于c - 在 xlib 和 cairo 中绘制具有透明度的图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34831744/