diff options
Diffstat (limited to 'render/pixman')
-rw-r--r-- | render/pixman/renderer.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/render/pixman/renderer.c b/render/pixman/renderer.c index e3715b60..2c92e662 100644 --- a/render/pixman/renderer.c +++ b/render/pixman/renderer.c @@ -89,7 +89,34 @@ static void texture_destroy(struct wlr_texture *wlr_texture) { free(texture); } +static bool texture_read_pixels(struct wlr_texture *wlr_texture, + const struct wlr_texture_read_pixels_options *options) { + struct wlr_pixman_texture *texture = get_texture(wlr_texture); + + struct wlr_box src; + wlr_texture_read_pixels_options_get_src_box(options, wlr_texture, &src); + + pixman_format_code_t fmt = get_pixman_format_from_drm(options->format); + if (fmt == 0) { + wlr_log(WLR_ERROR, "Cannot read pixels: unsupported pixel format"); + return false; + } + + void *p = wlr_texture_read_pixel_options_get_data(options); + + pixman_image_t *dst = pixman_image_create_bits_no_clear(fmt, + src.width, src.height, p, options->stride); + + pixman_image_composite32(PIXMAN_OP_SRC, texture->image, NULL, dst, + src.x, src.y, 0, 0, 0, 0, src.width, src.height); + + pixman_image_unref(dst); + + return true; +} + static const struct wlr_texture_impl texture_impl = { + .read_pixels = texture_read_pixels, .destroy = texture_destroy, }; |