mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-02-05 04:06:11 -05:00
Merge branch 'read-pixels-roi' into 'master'
render: Add region of interest to wlr_texture_read_pixels_options See merge request wlroots/wlroots!4667
This commit is contained in:
commit
cff6e5f218
3 changed files with 19 additions and 2 deletions
|
|
@ -37,6 +37,8 @@ struct wlr_texture_read_pixels_options {
|
|||
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;
|
||||
/** Region of interest within source box. If NULL, the full region is assumed to be of interest. */
|
||||
struct pixman_region32 *roi;
|
||||
};
|
||||
|
||||
bool wlr_texture_read_pixels(struct wlr_texture *texture,
|
||||
|
|
|
|||
|
|
@ -214,7 +214,19 @@ static bool gles2_texture_read_pixels(struct wlr_texture *wlr_texture,
|
|||
// Under these particular conditions, we can read the pixels with only
|
||||
// one glReadPixels call
|
||||
|
||||
glReadPixels(src.x, src.y, src.width, src.height, fmt->gl_format, fmt->gl_type, p);
|
||||
int y_offset = 0;
|
||||
int src_height = src.height;
|
||||
int data_offset = 0;
|
||||
if (options->roi) {
|
||||
struct pixman_box32 *ext =
|
||||
pixman_region32_extents(options->roi);
|
||||
y_offset = ext->y1;
|
||||
src_height = ext->y2 - ext->y1;
|
||||
data_offset = y_offset * options->stride;
|
||||
}
|
||||
|
||||
glReadPixels(src.x, src.y + y_offset, src.width, src_height,
|
||||
fmt->gl_format, fmt->gl_type, p + data_offset);
|
||||
} else {
|
||||
// Unfortunately GLES2 doesn't support GL_PACK_ROW_LENGTH, so we have to read
|
||||
// the lines out row by row
|
||||
|
|
|
|||
|
|
@ -107,9 +107,12 @@ static bool texture_read_pixels(struct wlr_texture *wlr_texture,
|
|||
pixman_image_t *dst = pixman_image_create_bits_no_clear(fmt,
|
||||
src.width, src.height, p, options->stride);
|
||||
|
||||
if (options->roi) {
|
||||
pixman_image_set_clip_region32(dst, options->roi);
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue