[英]draw icon with transparency in xlib and 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);
}
但图标没有任何透明度。 我找不到用互联网上的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()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.