【问题标题】:draw icon with transparency in xlib and cairo在 xlib 和 cairo 中绘制具有透明度的图标
【发布时间】:2016-04-22 06:25:02
【问题描述】:

现在我已经有了想要正确绘制它们的图标。 目前我正在使用 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 解决这个问题的例子。只有一种复杂的方法,但它的记录非常糟糕,根本对我没有帮助。 有人有链接或示例说明如何使用透明胶片恢复原始图标吗? 提前谢谢你。

【问题讨论】:

    标签: c x11 cairo xlib pixmap


    【解决方案1】:

    这是一个来自 awesome 的示例,它将图标“变成” 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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多