diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index e9159b79..29a78f92 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -93,4 +93,10 @@ float wlr_render_texture_options_get_alpha(const struct wlr_render_texture_optio void wlr_render_rect_options_get_box(const struct wlr_render_rect_options *options, const struct wlr_buffer *buffer, struct wlr_box *box); +void wlr_texture_read_pixels_options_get_src_box( + const struct wlr_texture_read_pixels_options *options, + const struct wlr_texture *texture, struct wlr_box *box); +void *wlr_texture_read_pixel_options_get_data( + const struct wlr_texture_read_pixels_options *options); + #endif diff --git a/render/wlr_texture.c b/render/wlr_texture.c index be10f20a..3496305f 100644 --- a/render/wlr_texture.c +++ b/render/wlr_texture.c @@ -4,6 +4,7 @@ #include #include #include +#include "render/pixel_format.h" #include "types/wlr_buffer.h" void wlr_texture_init(struct wlr_texture *texture, struct wlr_renderer *renderer, @@ -26,6 +27,31 @@ void wlr_texture_destroy(struct wlr_texture *texture) { } } +void wlr_texture_read_pixels_options_get_src_box( + const struct wlr_texture_read_pixels_options *options, + const struct wlr_texture *texture, struct wlr_box *box) { + if (wlr_box_empty(&options->src_box)) { + *box = (struct wlr_box){ + .x = 0, + .y = 0, + .width = texture->width, + .height = texture->height, + }; + return; + } + + *box = options->src_box; +} + +void *wlr_texture_read_pixel_options_get_data( + const struct wlr_texture_read_pixels_options *options) { + const struct wlr_pixel_format_info *fmt = drm_get_pixel_format_info(options->format); + + return (char *)options->data + + pixel_format_info_min_stride(fmt, options->dst_x) + + options->dst_y * options->stride; +} + bool wlr_texture_read_pixels(struct wlr_texture *texture, const struct wlr_texture_read_pixels_options *options) { if (!texture->impl->read_pixels) {