Linux XRender API 使用指南
一 环境准备与可用性检查
sudo apt-get install libxrender-dev;在 Fedora 使用 sudo dnf install libXrender-devel;在 Arch 使用 sudo pacman -S libxrender。编译时链接 -lXrender。xdpyinfo | grep "X Render" 或 xprop -root | grep RENDER,若输出包含 X Render/RENDER 表示启用。XRenderQueryExtension(display, &event_base, &error_base) 判断扩展是否存在。二 核心概念与渲染管线
XRenderCreatePicture 为目标创建 Picture(指定格式与属性);XRenderComposite 执行合成(支持缩放、变换、透明度);三 常见操作与示例
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <stdio.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!dpy) { fprintf(stderr, "Cannot open display\n"); return 1; }
int evb, errb;
if (!XRenderQueryExtension(dpy, &evb, &errb)) {
fprintf(stderr, "XRender extension not available\n");
XCloseDisplay(dpy); return 1;
}
int scr = DefaultScreen(dpy);
Window win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
0, 0, 320, 240, 1,
BlackPixel(dpy, scr), WhitePixel(dpy, scr));
XMapWindow(dpy, win);
// 为目标窗口创建 Picture(使用 ARGB32 便于透明/抗锯齿)
XRenderPictureAttributes pa = {0};
Picture dst = XRenderCreatePicture(dpy, win, PictStandardARGB32, &pa, 0);
// 创建一个同尺寸的 ARGB32 Pixmap 作为源
Pixmap src_pm = XCreatePixmap(dpy, win, 320, 240, 32);
Picture src = XRenderCreatePictureFromPixmap(dpy, src_pm, PictStandardARGB32, &pa, 0);
// 清源为不透明红(示例用,实际可上传位图)
GC gc = XCreateGC(dpy, src_pm, 0, NULL);
XSetForeground(dpy, gc, 0xFFFF0000); // ARGB: 不透明红
XFillRectangle(dpy, src_pm, gc, 0, 0, 320, 240);
XFreeGC(dpy, gc);
// 将源合成到目标(PictOpOver 实现 alpha 混合)
XRenderComposite(dpy, PictOpOver, src, None, dst,
0, 0, 0, 0, 0, 0, 320, 240);
XFlush(dpy);
// 资源释放
XRenderFreePicture(dpy, src);
XRenderFreePicture(dpy, dst);
XFreePixmap(dpy, src_pm);
XCloseDisplay(dpy);
return 0;
}
XRenderQueryExtension:运行时检查扩展是否可用。XRenderCreatePicture / XRenderCreatePictureFromPixmap / XRenderCreatePictureFromDrawable:创建 Picture,格式常用 PictStandardARGB32。XRenderComposite:核心合成;参数顺序为 display, op, src, mask, dst, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height。XRenderFreePicture:释放 Picture。gcc xrender_demo.c -o xrender_demo -lX11 -lXrender。四 性能优化与注意事项
antialias = True,并在需要时使用带抗锯齿的线条/形状绘制接口。五 故障排查与进阶
xdpyinfo | grep "X Render" 或 xprop -root | grep RENDER 确认;程序内用 XRenderQueryExtension 捕获失败并给出友好提示。