繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM