diff options
author | Alexander Orzechowski <alex@ozal.ski> | 2023-11-30 19:55:51 -0500 |
---|---|---|
committer | Alexander Orzechowski <alex@ozal.ski> | 2023-11-30 19:55:51 -0500 |
commit | e85e8bc3249aeb0eebbde1debee51a5941aa08b4 (patch) | |
tree | 597839b98614d2f80f4bac3873b181dfdab58833 | |
parent | 4c6caa7c48d887fb4292a08f898af83d9954d571 (diff) |
wlr_texture: Introduce wlr_texture_read_pixels_options helpers
-rw-r--r-- | include/wlr/render/interface.h | 6 | ||||
-rw-r--r-- | render/wlr_texture.c | 26 |
2 files changed, 32 insertions, 0 deletions
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 <string.h> #include <wlr/render/interface.h> #include <wlr/render/wlr_texture.h> +#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) { |