linux

如何通过XRender实现Linux图形特效

小樊
35
2025-12-13 09:51:32
栏目: 智能运维

通过 XRender 在 Linux 上实现图形特效

一 环境准备与能力检测

二 最小可用示例 合成两张 ARGB32 位图

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

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

    int scr = DefaultScreen(dpy);
    Window root = RootWindow(dpy, scr);

    // 检查扩展
    int evb, errb;
    if (!XRenderQueryExtension(dpy, &evb, &errb)) {
        fprintf(stderr, "XRender 扩展不可用\n");
        XCloseDisplay(dpy);
        return 1;
    }

    // 创建两个 200x200 的 ARGB32 Pixmap 并填充颜色
    Pixmap pm1 = XCreatePixmap(dpy, root, 200, 200, 32);
    Pixmap pm2 = XCreatePixmap(dpy, root, 200, 200, 32);

    GC gc = XCreateGC(dpy, pm1, 0, NULL);
    XSetForeground(dpy, gc, 0xFF0000FF); // 蓝
    XFillRectangle(dpy, pm1, gc, 0, 0, 200, 200);
    XSetForeground(dpy, gc, 0x80FF0000); // 半透明红
    XFillRectangle(dpy, pm2, gc, 50, 50, 100, 100);
    XFreeGC(dpy, gc);

    // 将 Pixmap 包装为 Picture(ARGB32)
    XRenderPictureAttributes attrs = {0};
    Picture pic1 = XRenderCreatePictureFromPixmap(dpy, pm1, PictStandardARGB32, CPSubwindowMode, &attrs);
    Picture pic2 = XRenderCreatePictureFromPixmap(dpy, pm2, PictStandardARGB32, CPSubwindowMode, &attrs);

    // 合成:pic2 OVER pic1 → 目标为根窗口(直接显示)
    XRenderComposite(dpy, PictOpOver, pic2, None, XRenderCreatePictureFromDrawable(dpy, root, 0, &attrs),
                    0, 0, 0, 0, 50, 50, 100, 100);

    // 资源清理
    XRenderFreePicture(dpy, pic1);
    XRenderFreePicture(dpy, pic2);
    XFreePixmap(dpy, pm1);
    XFreePixmap(dpy, pm2);
    XCloseDisplay(dpy);
    return 0;
}

三 常见特效与实现要点

四 进阶与生态

0
看了该问题的人还看了