如何使用 Xlib/XRender 渲染缩放像素缓冲区
How to Render a Scaled Pixel Buffer with Xlib/XRender
启动时我分配:u32 *pixel_buffer = calloc(width * height, 4);
我希望将其渲染为 window 的当前宽度和高度。我的尝试:
- 使用
XCreateImage/XPutImage
在启动时正确呈现
window 尺寸与像素缓冲区的尺寸匹配。在
window resize 但是,缓冲区的内容不会缩放并且
多余的space用黑色填充(背景值
我为 window) 设置的像素
- 用
XPutImage
来一个Pixmap
。然后每次循环迭代,使用
XRenderCreatePicture
在这个 Pixmap
和 Window
上
XRenderComposite
他们。这只会产生黑屏。
有什么建议吗?
XPutImage(display, pixmap, default_gc, x_image,
0, 0, 0, 0, pixel_buffer_width, pixel_buffer_height);
Picture src_pict = XRenderCreatePicture(display, pixmap, pic_format, 0, &pic_attributes);
Picture dst_pict = XRenderCreatePicture(display, window, pic_format, 0, &pic_attributes);
double x_scale = pixel_buffer_width / window_width;
double y_scale = pixel_buffer_height / window_height;
XTransform transform_matrix = {{
{XDoubleToFixed(x_scale), XDoubleToFixed(0), XDoubleToFixed(0)},
{XDoubleToFixed(0), XDoubleToFixed(y_scale), XDoubleToFixed(0)},
{XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1.0)}
}};
XRenderSetPictureTransform(display, src_pict, &transform_matrix);
XRenderComposite(display, PictOpSrc, src_pict, 0, dst_pict,
0, 0, 0, 0, 0, 0,
window_width, window_height);
启动时我分配:u32 *pixel_buffer = calloc(width * height, 4);
我希望将其渲染为 window 的当前宽度和高度。我的尝试:
- 使用
XCreateImage/XPutImage
在启动时正确呈现 window 尺寸与像素缓冲区的尺寸匹配。在 window resize 但是,缓冲区的内容不会缩放并且 多余的space用黑色填充(背景值 我为 window) 设置的像素
- 用
XPutImage
来一个Pixmap
。然后每次循环迭代,使用XRenderCreatePicture
在这个Pixmap
和Window
上XRenderComposite
他们。这只会产生黑屏。
有什么建议吗?
XPutImage(display, pixmap, default_gc, x_image,
0, 0, 0, 0, pixel_buffer_width, pixel_buffer_height);
Picture src_pict = XRenderCreatePicture(display, pixmap, pic_format, 0, &pic_attributes);
Picture dst_pict = XRenderCreatePicture(display, window, pic_format, 0, &pic_attributes);
double x_scale = pixel_buffer_width / window_width;
double y_scale = pixel_buffer_height / window_height;
XTransform transform_matrix = {{
{XDoubleToFixed(x_scale), XDoubleToFixed(0), XDoubleToFixed(0)},
{XDoubleToFixed(0), XDoubleToFixed(y_scale), XDoubleToFixed(0)},
{XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1.0)}
}};
XRenderSetPictureTransform(display, src_pict, &transform_matrix);
XRenderComposite(display, PictOpSrc, src_pict, 0, dst_pict,
0, 0, 0, 0, 0, 0,
window_width, window_height);