aboutsummaryrefslogtreecommitdiff
path: root/render/pixman
diff options
context:
space:
mode:
Diffstat (limited to 'render/pixman')
-rw-r--r--render/pixman/renderer.c27
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,
};