diff options
author | Alexander Orzechowski <alex@ozal.ski> | 2023-11-30 19:55:12 -0500 |
---|---|---|
committer | Alexander Orzechowski <alex@ozal.ski> | 2023-11-30 19:55:12 -0500 |
commit | 4c6caa7c48d887fb4292a08f898af83d9954d571 (patch) | |
tree | 52aef9a12546f680183f3cf25015c9c2104253f6 | |
parent | a165261f7f099475547b54bafd78a4465728a5cd (diff) |
wlr_texture: Introduce wlr_texture_read_pixels
-rw-r--r-- | include/wlr/render/interface.h | 2 | ||||
-rw-r--r-- | include/wlr/render/wlr_texture.h | 17 | ||||
-rw-r--r-- | render/wlr_texture.c | 9 |
3 files changed, 28 insertions, 0 deletions
diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index e8191ac2..e9159b79 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -52,6 +52,8 @@ void wlr_renderer_init(struct wlr_renderer *renderer, struct wlr_texture_impl { bool (*update_from_buffer)(struct wlr_texture *texture, struct wlr_buffer *buffer, const pixman_region32_t *damage); + bool (*read_pixels)(struct wlr_texture *texture, + const struct wlr_texture_read_pixels_options *options); void (*destroy)(struct wlr_texture *texture); }; diff --git a/include/wlr/render/wlr_texture.h b/include/wlr/render/wlr_texture.h index 87ed993f..c24cfaa9 100644 --- a/include/wlr/render/wlr_texture.h +++ b/include/wlr/render/wlr_texture.h @@ -13,6 +13,7 @@ #include <stdint.h> #include <wayland-server-core.h> #include <wlr/render/dmabuf.h> +#include <wlr/util/box.h> struct wlr_buffer; struct wlr_renderer; @@ -25,6 +26,22 @@ struct wlr_texture { struct wlr_renderer *renderer; }; +struct wlr_texture_read_pixels_options { + /** Memory location to read pixels into */ + void *data; + /** Format used for writing the pixel data */ + uint32_t format; + /** Stride in bytes for the data */ + uint32_t stride; + /** Destination offsets */ + uint32_t dst_x, dst_y; + /** Source box of the texture to read from. If empty, the full texture is assumed. */ + const struct wlr_box src_box; +}; + +bool wlr_texture_read_pixels(struct wlr_texture *texture, + const struct wlr_texture_read_pixels_options *options); + /** * Create a new texture from raw pixel data. `stride` is in bytes. The returned * texture is mutable. diff --git a/render/wlr_texture.c b/render/wlr_texture.c index 8c003cfb..be10f20a 100644 --- a/render/wlr_texture.c +++ b/render/wlr_texture.c @@ -26,6 +26,15 @@ void wlr_texture_destroy(struct wlr_texture *texture) { } } +bool wlr_texture_read_pixels(struct wlr_texture *texture, + const struct wlr_texture_read_pixels_options *options) { + if (!texture->impl->read_pixels) { + return false; + } + + return texture->impl->read_pixels(texture, options); +} + struct wlr_texture *wlr_texture_from_pixels(struct wlr_renderer *renderer, uint32_t fmt, uint32_t stride, uint32_t width, uint32_t height, const void *data) { |