linux

如何在Linux中使用Xrender进行渲染

小樊
38
2025-12-31 01:05:25
栏目: 智能运维

在 Linux 中使用 XRender 进行渲染

一 环境准备与验证

二 最小示例 创建 Picture 并进行合成

#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    Display *dpy = XOpenDisplay(NULL);
    if (!dpy) { fprintf(stderr, "无法打开显示\n"); return 1; }

    int major, minor;
    if (!XRenderQueryVersion(dpy, &major, &minor)) {
        fprintf(stderr, "XRender 不可用\n");
        return 1;
    }
    printf("XRender 版本: %d.%d\n", major, minor);

    int scr = DefaultScreen(dpy);
    Visual *vis = DefaultVisual(dpy, scr);
    Colormap cmap = DefaultColormap(dpy, scr);

    // 找一个带 Alpha 的 PictFormat(常见为 PictStandardARGB32)
    XRenderPictFormat *fmt = XRenderFindVisualFormat(dpy, vis);
    if (!fmt) {
        fprintf(stderr, "未找到 PictFormat\n");
        return 1;
    }

    // 创建一个窗口并为其创建 Picture
    Window win = XCreateSimpleWindow(dpy, RootWindow(dpy, scr),
                                     100, 100, 320, 240, 1,
                                     BlackPixel(dpy, scr), WhitePixel(dpy, scr));
    XMapWindow(dpy, win);

    Picture pic = XRenderCreatePicture(dpy, win, fmt, 0, NULL);
    if (!pic) {
        fprintf(stderr, "创建 Picture 失败\n");
        return 1;
    }

    // 清屏为半透明黑(预乘 ARGB:0x80000000)
    XRenderColor clear = { .red = 0, .green = 0, .blue = 0, .alpha = 0x8000 };
    XRenderFillRectangle(dpy, PictOpSrc, pic, &clear, 0, 0, 320, 240);

    // 演示:用一个不透明的矩形叠加(PictOpOver 合成)
    XRenderColor rect = { .red = 0xffff, .green = 0, .blue = 0, .alpha = 0xffff };
    XRenderFillRectangle(dpy, PictOpOver, pic, &rect, 120, 80, 80, 80);

    XFlush(dpy);
    sleep(5);  // 便于观察

    XRenderFreePicture(dpy, pic);
    XDestroyWindow(dpy, win);
    XCloseDisplay(dpy);
    return 0;
}

三 透明与合成进阶

四 桌面环境启用与性能优化

五 常见故障排查

0
看了该问题的人还看了