c - 在 xlib 和 cairo 中绘制具有透明度的图标

标签 c x11 cairo xlib pixmap

现在我已经有了我想要正确绘制它们的图标。 目前我正在使用 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/

相关文章:

c - 为什么导出的由另一个驱动程序修改的常量值未在原始驱动程序中更新

gcc - 编译/链接到开罗图书馆

c - 通过开罗表面绘画时清除 X 窗口的正确方法是什么

c - Gtk 问题(回调关闭,不应该;开罗不绘图;分隔符不出现)

c - Xlib 和 BadWindow

java - 是否可以从 Linux 中的 Eclipse RCP 初始屏幕中删除调整 handle 大小?

c - 我的 malloc 结构出现段错误 11

c - 终端仿真器通过 UART ATmega328p 从未知源接收字节

c - 使用 C 在终端的 printf 输出中获取一个奇怪的百分号

linux - 当焦点窗口最大化和离开最大化模式时接收信号