Linux XRender API 接口概览
一 核心概念与能力
二 环境准备与编译链接
xdpyinfo | grep XRender,若输出包含 “X Render” 表示支持。sudo apt-get install libxrender-devsudo yum install libXrender-devel#include <X11/extensions/Xrender.h>-lXrenderXOpenDisplay → 选择屏幕/根窗口 → 创建 Picture(设置格式与属性)→ 使用 XRenderComposite 进行绘制/合成 → XFlush/XCloseDisplay 清理。三 关键数据结构与枚举
repeat:是否重复填充(如纹理平铺)clip_mask:裁剪掩码(限制绘制区域)antialias:是否启用抗锯齿(用于直线/多边形等)PictStandardARGB32:带 Alpha 的 32 位像素格式PictStandardRGB24:24 位 RGB 格式PictOpOver:Alpha 混合的 over 操作PictOpSrc:直接覆盖PictOpClear:清空为目标“0”XRenderPictureAttributes 实例并传递给 XRenderCreatePicture 以创建带指定格式与属性的 Picture。四 常用 API 接口与用途
XRenderQueryExtension / XRenderQueryVersion:查询扩展是否可用与版本号XRenderFindVisualFormat:根据 Visual 查找对应的 XRenderPictFormatXRenderCreatePicture:为 Drawable(如 Pixmap、Window)创建 Picture,可传入 XRenderPictureAttributesXRenderFreePicture:释放 PictureXRenderComposite:执行 2D 合成/绘制
XRenderComposite(display, op, src, mask, dst, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height);XRenderSetPictureClipRectangles / XRenderSetPictureClipMask:设置裁剪区域/掩码XRenderFillRectangles / XRenderCompositeTriStrip / XRenderCompositeTriFan:绘制矩形、三角形条带/扇等基元XRenderQueryFilters / XRenderSetPictureFilter:查询/设置 滤镜(如缩放时的滤波方式)XRenderQueryPictFormats:查询服务器支持的像素格式集合五 最小示例与注意事项
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <stdlib.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!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);
// 假设已有 ARGB32 数据:data[4 * w * h],步长 4 字节
int w = 320, h = 240;
unsigned char *data = malloc(w * h * 4);
if (!data) { XCloseDisplay(dpy); return 1; }
// TODO: 填充 data(例如 memset 或解码图像)
// 创建可绘制的 Pixmap 并写入图像数据
Pixmap pm = XCreatePixmap(dpy, win, w, h, 32);
GC gc = XCreateGC(dpy, pm, 0, NULL);
XImage *img = XCreateImage(dpy, DefaultVisual(dpy, scr), 32, ZPixmap, 0,
(char*)data, w, h, 32, 0);
XPutImage(dpy, pm, gc, img, 0, 0, 0, 0, w, h);
XFreeGC(dpy, gc);
XDestroyImage(img);
// 为窗口与 Pixmap 创建 Picture(ARGB32)
XRenderPictureAttributes pa = {0};
Picture src_pic = XRenderCreatePicture(dpy, pm, PictStandardARGB32, &pa);
Picture dst_pic = XRenderCreatePicture(dpy, win, PictStandardARGB32, &pa);
// 将源图像覆盖到窗口(PictOpSrc 为直接覆盖)
XRenderComposite(dpy, PictOpSrc, src_pic, None, dst_pic,
0, 0, 0, 0, 0, 0, w, h);
XFlush(dpy);
// 资源释放
XRenderFreePicture(dpy, src_pic);
XRenderFreePicture(dpy, dst_pic);
XFreePixmap(dpy, pm);
free(data);
XCloseDisplay(dpy);
return 0;
}
gcc demo.c -o demo -lX11 -lXrenderXRenderQueryFilters/XRenderSetPictureFilter 查询与设置。xdpyinfo 确认扩展可用,并在目标设备上实测验证。