aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-01-25 19:15:20 +0100
committeremersion <contact@emersion.fr>2018-01-25 19:15:20 +0100
commit4223fbc76330f000a209c0f03426fd3867f21057 (patch)
tree8a012bd174e3fbb1922e2e69c5e7feccd0c8973a /util
parent3f96427d0854ef38ee295724ebd36dcb74c0659c (diff)
rootston: damage tracking scale support
Diffstat (limited to 'util')
-rw-r--r--util/meson.build2
-rw-r--r--util/region.c29
2 files changed, 31 insertions, 0 deletions
diff --git a/util/meson.build b/util/meson.build
index 21930693..6796f818 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -3,6 +3,8 @@ lib_wlr_util = static_library(
files(
'log.c',
'os-compatibility.c',
+ 'region.c',
),
include_directories: wlr_inc,
+ dependencies: [pixman],
)
diff --git a/util/region.c b/util/region.c
new file mode 100644
index 00000000..da66d92c
--- /dev/null
+++ b/util/region.c
@@ -0,0 +1,29 @@
+#include <stdlib.h>
+#include <math.h>
+#include <wlr/util/region.h>
+
+void wlr_region_scale(pixman_region32_t *dst, pixman_region32_t *src,
+ float scale) {
+ if (scale == 1) {
+ pixman_region32_copy(dst, src);
+ return;
+ }
+
+ int nrects;
+ pixman_box32_t *src_rects = pixman_region32_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 = floor(src_rects[i].x1 * scale);
+ dst_rects[i].x2 = ceil(src_rects[i].x2 * scale);
+ dst_rects[i].y1 = floor(src_rects[i].y1 * scale);
+ dst_rects[i].y2 = ceil(src_rects[i].y2 * scale);
+ }
+
+ pixman_region32_fini(dst);
+ pixman_region32_init_rects(dst, dst_rects, nrects);
+}