在 xlib 和 cairo 中绘制具有透明度的图标
draw icon with transparency in xlib and cairo
现在我已经有了图标,我想正确地绘制它们。
目前我正在使用 Cairo 在 window 上绘制这些图像。
我有一个遮罩和像素图的图标。
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 解决这个问题的例子。只有一种复杂的方法,但它的记录非常糟糕,对我根本没有帮助。
有人有 link 或示例来说明如何使用透明胶片恢复原始图标吗?
提前谢谢你。
这是一个来自 awesome 的例子,它 "turns" 图标变成了 cairo 表面:https://github.com/awesomeWM/awesome/blob/430f4fab15bb101b4af9fadbebb9a9bfa47ba9de/objects/client.c#L1501
这里使用的是 xcb 而不是 Xlib,但你应该还是能理解这一点。处理掩码的部分从第 1538 行开始。基本上,创建了一个新的 cairo 表面并为其设置了 cairo 上下文。源表面是图标,通过 cairo_mask_surface
("use the alpha channel of some cairo surface as the mask of a drawing operation") 应用遮罩。您可以将这部分复制到您的代码中,这样您就不必将图标绘制到临时表面。
TL;DR:您的 //How do I apply the mask?
的答案是:使用 cairo_mask_surface()
而不是 cairo_paint()
。
现在我已经有了图标,我想正确地绘制它们。 目前我正在使用 Cairo 在 window 上绘制这些图像。 我有一个遮罩和像素图的图标。
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 解决这个问题的例子。只有一种复杂的方法,但它的记录非常糟糕,对我根本没有帮助。 有人有 link 或示例来说明如何使用透明胶片恢复原始图标吗? 提前谢谢你。
这是一个来自 awesome 的例子,它 "turns" 图标变成了 cairo 表面:https://github.com/awesomeWM/awesome/blob/430f4fab15bb101b4af9fadbebb9a9bfa47ba9de/objects/client.c#L1501
这里使用的是 xcb 而不是 Xlib,但你应该还是能理解这一点。处理掩码的部分从第 1538 行开始。基本上,创建了一个新的 cairo 表面并为其设置了 cairo 上下文。源表面是图标,通过 cairo_mask_surface
("use the alpha channel of some cairo surface as the mask of a drawing operation") 应用遮罩。您可以将这部分复制到您的代码中,这样您就不必将图标绘制到临时表面。
TL;DR:您的 //How do I apply the mask?
的答案是:使用 cairo_mask_surface()
而不是 cairo_paint()
。