在开始使用XRender前,需确保系统已安装相关库并启用扩展。
sudo apt-get install libxrender-dev,CentOS/RHEL使用sudo yum install libXrender-devel)。xdpyinfo | grep "X Render",若输出包含“X Render”,则表示扩展已启用;或使用xprop -root | grep RENDER确认。在C/C++程序中,需包含XRender头文件,并链接-lX11 -lXrender库:
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
编译时添加链接选项:gcc your_program.c -o output -lX11 -lXrender。
使用Xlib打开显示连接,创建窗口并映射到屏幕:
Display *display = XOpenDisplay(NULL);
if (!display) {
fprintf(stderr, "Cannot open display\n");
return 1;
}
int screen = DefaultScreen(display);
Window root = RootWindow(display, screen);
Window window = XCreateSimpleWindow(display, root, 0, 0, 800, 600, 1,
BlackPixel(display, screen), WhitePixel(display, screen));
XMapWindow(display, window);
XFlush(display);
Picture是XRender的核心对象,代表可渲染的图像或窗口。需指定视觉格式(如PictStandardARGB32)和属性:
XRenderPictureAttributes pa;
pa.repeat = True; // 允许图像重复
Picture picture = XRenderCreatePicture(display, window, PictStandardARGB32, &pa);
将图像数据加载到Pixmap,创建对应的Picture对象,再合成到目标窗口:
// 假设image_data是预加载的ARGB32格式图像数据(width=100, height=100)
Pixmap pixmap = XCreatePixmap(display, window, 100, 100, 32);
XImage *image = XCreateImage(display, DefaultVisual(display, screen), 32, ZPixmap, 0,
(char*)image_data, 100, 100, 32, 0);
Picture source_picture = XRenderCreatePicture(display, pixmap, PictStandardARGB32, NULL);
// 合成图像到窗口(PictOpOver表示源图像覆盖目标图像)
XRenderComposite(display, PictOpOver, source_picture, None, window,
0, 0, 0, 0, 0, 0, 100, 100);
XFlush(display);
程序结束时,释放所有创建的对象:
XDestroyPicture(display, source_picture);
XFreePixmap(display, pixmap);
XDestroyWindow(display, window);
XCloseDisplay(display);
使用XRenderScalePicture调整图像尺寸:
XRenderPictureAttributes pa_scale;
pa_scale.scale_x = 0.5; // 宽度缩放为50%
pa_scale.scale_y = 0.5; // 高度缩放为50%
Picture scaled_picture = XRenderScalePicture(source_picture, 0.5, 0.5, &pa_scale);
XRenderComposite(display, PictOpOver, scaled_picture, None, window,
0, 0, 0, 0, 0, 0, 50, 50); // 绘制缩放后的图像
XDestroyPicture(display, scaled_picture);
通过XRenderCreateLinearGradient创建线性渐变,绘制带渐变的矩形:
XRenderGradientAttributes grad_attr;
grad_attr.type = GradientLinear;
grad_attr.x0 = 10; grad_attr.y0 = 10; // 渐变起点
grad_attr.x1 = 110; grad_attr.y1 = 110; // 渐变终点
grad_attr.colors[0] = 0xFFFF0000; // 红色(起始色)
grad_attr.colors[1] = 0xFF00FF00; // 绿色(结束色)
grad_attr.nColors = 2;
Picture gradient = XRenderCreatePicture(display, None, PictStandardARGB32, &grad_attr);
XRectangle rect = {10, 10, 100, 100};
XRenderComposite(display, PictOpOver, gradient, None, window,
0, 0, 0, 0, rect.x, rect.y, rect.width, rect.height);
XDestroyPicture(display, gradient);
XRenderComposite调用),减少函数调用次数。XRenderPictureAttributes(如重复、透明度)应缓存,避免重复创建。DRI驱动),提升渲染速度。XRenderCreatePicture是否返回NULL),避免程序崩溃。Picture、Pixmap等对象,防止内存泄漏。PictStandardARGB32)与窗口或图像的视觉格式一致,否则可能导致渲染错误。