mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-01-31 03:50:25 +01:00
util/region: add fractional region helpers
Signed-off-by: Loukas Agorgianitis <loukas@agorgianitis.com>
This commit is contained in:
parent
f6ee38c67e
commit
2ab8f41750
2 changed files with 73 additions and 0 deletions
|
|
@ -44,6 +44,31 @@ void wlr_region_scale(pixman_region32_t *dst, const pixman_region32_t *src,
|
|||
void wlr_region_scale_xy(pixman_region32_t *dst, const pixman_region32_t *src,
|
||||
float scale_x, float scale_y);
|
||||
|
||||
/**
|
||||
* Scale a fractional region by the specified factor.
|
||||
*
|
||||
* The resulting coordinates are rounded to nearest integer.
|
||||
*
|
||||
* Also see wlr_region_scalef_xy().
|
||||
*/
|
||||
void wlr_region_scalef(pixman_region32_t *dst, const pixman_region64f_t *src,
|
||||
float scale);
|
||||
|
||||
/**
|
||||
* Scale a region by the specified factors.
|
||||
*
|
||||
* The X and Y coordinates are scaled separately by scale_x and scale_y.
|
||||
*
|
||||
* The resulting coordinates are rounded to nearest integer.
|
||||
*/
|
||||
void wlr_region_scalef_xy(pixman_region32_t *dst, const pixman_region64f_t *src,
|
||||
float scale_x, float scale_y);
|
||||
|
||||
/**
|
||||
* Copy an integer region into a fractional region.
|
||||
*/
|
||||
void wlr_region64f_copy_from_region32(pixman_region64f_t *dst, const pixman_region32_t *src);
|
||||
|
||||
/**
|
||||
* Applies a transform to a region inside a box of size `width` x `height`.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -36,6 +36,54 @@ void wlr_region_scale_xy(pixman_region32_t *dst, const pixman_region32_t *src,
|
|||
free(dst_rects);
|
||||
}
|
||||
|
||||
void wlr_region_scalef(pixman_region32_t *dst, const pixman_region64f_t *src,
|
||||
float scale) {
|
||||
wlr_region_scalef_xy(dst, src, scale, scale);
|
||||
}
|
||||
|
||||
void wlr_region_scalef_xy(pixman_region32_t *dst, const pixman_region64f_t *src,
|
||||
float scale_x, float scale_y) {
|
||||
int nrects;
|
||||
const pixman_box64f_t *src_rects = pixman_region64f_rectangles(src, &nrects);
|
||||
|
||||
pixman_box32_t *dst_rects = malloc(nrects * sizeof(pixman_box32_t));
|
||||
if (dst_rects == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < nrects; ++i) {
|
||||
dst_rects[i].x1 = round(src_rects[i].x1 * scale_x);
|
||||
dst_rects[i].x2 = round(src_rects[i].x2 * scale_x);
|
||||
dst_rects[i].y1 = round(src_rects[i].y1 * scale_y);
|
||||
dst_rects[i].y2 = round(src_rects[i].y2 * scale_y);
|
||||
}
|
||||
|
||||
pixman_region32_fini(dst);
|
||||
pixman_region32_init_rects(dst, dst_rects, nrects);
|
||||
free(dst_rects);
|
||||
}
|
||||
|
||||
void wlr_region64f_copy_from_region32(pixman_region64f_t *dst, const pixman_region32_t *src) {
|
||||
int nrects;
|
||||
const pixman_box32_t *src_rects = pixman_region32_rectangles(src, &nrects);
|
||||
|
||||
pixman_box64f_t *dst_rects = malloc(nrects * sizeof(pixman_box64f_t));
|
||||
if (dst_rects == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < nrects; ++i) {
|
||||
dst_rects[i].x1 = src_rects[i].x1;
|
||||
dst_rects[i].x2 = src_rects[i].x2;
|
||||
dst_rects[i].y1 = src_rects[i].y1;
|
||||
dst_rects[i].y2 = src_rects[i].y2;
|
||||
}
|
||||
|
||||
pixman_region64f_fini(dst);
|
||||
pixman_region64f_init_rects(dst, dst_rects, nrects);
|
||||
free(dst_rects);
|
||||
}
|
||||
|
||||
void wlr_region_transform(pixman_region32_t *dst, const pixman_region32_t *src,
|
||||
enum wl_output_transform transform, int width, int height) {
|
||||
if (transform == WL_OUTPUT_TRANSFORM_NORMAL) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue