在X11中使用XCB绘制透明颜色的图像

问题描述 投票:0回答:1

我正在使用 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_);

这就是图像,我期望发生什么,以及正在发生什么:

x11 xcb
1个回答
0
投票

我仍然将其作为答案发布的一半答案(如果有人愿意,他们可以为此添加一个工作示例,但该问题已经没有工作示例):

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
将像素图绘制到目标窗口。

© www.soinside.com 2019 - 2024. All rights reserved.