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

时间:2016-01-16 20:23:25

标签: c x11 cairo xlib pixmap

现在我已经有了我想要正确绘制它们的图标。 目前我正在使用开罗在窗户上绘制这些图像。 我有一个掩码,图标为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来解决这个问题的例子。只有一种复杂的方式,但它的记录非常严重,根本无法帮助我。 有人有关于如何使用透明胶片恢复原始图标的链接或示例吗? 提前谢谢。

1 个答案:

答案 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()