XRender 是 X Window System 的一个扩展(X Rendering Extension),主要用于抗锯齿、半透明、图像合成、渐变、变形等高质量 2D 渲染。它通常和 Xlib / XCB 一起使用,也被 Cairo、Qt、GTK 等图形库在底层调用。
下面从 概念 → 基本使用流程 → 示例代码 → 常见问题 给你一个实用说明。
XRender 不是“绘图 API 大全”,而是:
⚠️ 注意:
Display *dpy = XOpenDisplay(NULL);
int event_base, error_base;
if (!XRenderQueryExtension(dpy, &event_base, &error_base)) {
fprintf(stderr, "XRender not supported\n");
return -1;
}
XRender 渲染必须指定 像素格式
XRenderPictFormat *fmt =
XRenderFindVisualFormat(dpy, DefaultVisual(dpy, 0));
Picture 是 XRender 的核心概念
Picture pic = XRenderCreatePicture(
dpy,
window,
fmt,
0, NULL
);
XRenderColor color;
color.red = 0xffff;
color.green = 0x0000;
color.blue = 0x0000;
color.alpha = 0x8000; // 半透明
XRenderFillRectangle(
dpy,
PictOpOver, // 合成操作(覆盖+alpha)
pic,
&color,
100, 100, // x, y
200, 100 // width, height
);
XRenderComposite(
dpy,
PictOpOver,
src_picture,
None,
dst_picture,
0, 0, // src x/y
0, 0, // mask x/y
x, y, // dst x/y
w, h
);
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
int main() {
Display *dpy = XOpenDisplay(NULL);
Window win = XCreateSimpleWindow(
dpy, RootWindow(dpy, 0),
0, 0, 400, 300, 0,
BlackPixel(dpy, 0),
WhitePixel(dpy, 0)
);
XMapWindow(dpy, win);
XRenderPictFormat *fmt =
XRenderFindVisualFormat(dpy, DefaultVisual(dpy, 0));
Picture pic = XRenderCreatePicture(dpy, win, fmt, 0, NULL);
XRenderColor c = {0xffff, 0x0000, 0x0000, 0x8000};
XRenderFillRectangle(dpy, PictOpOver, pic, &c, 50, 50, 200, 100);
XFlush(dpy);
sleep(5);
return 0;
}
编译:
gcc xrender_demo.c -lX11 -lXrender -o xrender_demo
| 功能 | API |
|---|---|
| 填充 | XRenderFillRectangle |
| 合成 | XRenderComposite |
| 梯形 | XRenderFillTrapezoids |
| 渐变 | XRenderCreateLinearGradient |
| 变换 | XRenderSetPictureTransform |
| 裁剪 | XRenderSetPictureClipRectangles |
你 不一定直接写 XRender:
cairo_xlib_surface_create() → 内部用 XRenderQPainter → X11 后端用 XRender如果你只是做应用界面,用 Cairo 更简单。
❌ 忘了 XRenderFindVisualFormat
❌ alpha 没设对(0x0000 是全透明)
❌ 窗口没有 32位视觉(透明失败)
❌ 在 Wayland 下 XRender 基本不用
我可以继续帮你:
你现在是 学习 X11 底层,还是 做某个具体效果?