我正在使用 X11 的 xcb 库。我将具有透明颜色的图像从 PNG 加载到像素图中,并尝试在窗口中绘制它。但是,当我使用
xcb_copy_area
绘制时,透明颜色并不透明。
我认为一种可能的方法是从图像创建蒙版,然后将图像与蒙版一起应用。但我不知道该怎么做,而且这方面的文档非常稀疏。
我想知道是否有人可以为我提供一个示例或解释如何做到这一点。
编辑:我被要求添加问题的照片以及我正在使用的代码。就这样:
// load PNG
int w, h;
int comp;
uint8_t* data = stbi_load_from_memory((stbi_uc const *) df.data.data(), (int) df.data.length(),
&w, &h, &comp, 4);
// organize pixels
unsigned* dp = (unsigned*) data;
for(size_t i = 0, len = w * h; i < len; i++) {
dp[i] = dp[i] & 0xff00ff00 | ((dp[i] >> 16) & 0xFF) | ((dp[i] << 16) & 0xFF0000);
}
// create image
xcb_gcontext_t gc = xcb_generate_id(dpy_);
xcb_pixmap_t px = xcb_generate_id(dpy_);
xcb_create_pixmap(dpy_, scr_->root_depth, px, scr_->root, w, h);
xcb_create_gc(dpy_, gc, px, 0, nullptr);
xcb_image_t* image = xcb_image_create_native(dpy_, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP, scr_->root_depth, (uint8_t *) dp, w * h * 4, (uint8_t *) dp);
xcb_image_put(dpy_, px, gc, image, 0, 0, 0);
xcb_image_destroy(image);
xcb_free_gc(dpy_, gc);
// paste pixmap
xcb_copy_area(dpy_, px, id, gc_, 0, 0, 50, 50, w, h);
xcb_flush(dpy_);
这就是图像,我期望发生什么,以及正在发生什么:
我仍然将其作为答案发布的一半答案(如果有人愿意,他们可以为此添加一个工作示例,但该问题已经没有工作示例):
Core X11 只能做二元透明度,即 0% 和 100% 不透明度。
任何更多的事情都需要渲染扩展。其文档的随机 Google 结果是 https://www.x.org/releases/X11R7.5/doc/renderproto/renderproto.txt。它的
Composite
请求可以绘制涉及透明度的东西。
要实际使用它,您需要找到您想要使用的“图片格式”。我建议从文档第 7 节中搜索“标准 PictFormats”之一。 ARGB8 格式可能是一个不错的选择。然后,您创建一个具有正确深度的像素图(在 ARGB8 示例中为 32),将图像上传到其中,为像素图和目标窗口创建图片,最后可以使用
xcb_render_composite
将像素图绘制到目标窗口。