aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/util/region.h9
-rw-r--r--rootston/output.c8
-rw-r--r--util/meson.build2
-rw-r--r--util/region.c29
4 files changed, 45 insertions, 3 deletions
diff --git a/include/wlr/util/region.h b/include/wlr/util/region.h
new file mode 100644
index 00000000..416adbf2
--- /dev/null
+++ b/include/wlr/util/region.h
@@ -0,0 +1,9 @@
+#ifndef WLR_UTIL_REGION_H
+#define WLR_UTIL_REGION_H
+
+#include <pixman.h>
+
+void wlr_region_scale(pixman_region32_t *dst, pixman_region32_t *src,
+ float scale);
+
+#endif
diff --git a/rootston/output.c b/rootston/output.c
index 2283ad16..5f08edf1 100644
--- a/rootston/output.c
+++ b/rootston/output.c
@@ -8,6 +8,7 @@
#include <wlr/types/wlr_xdg_shell_v6.h>
#include <wlr/render/matrix.h>
#include <wlr/util/log.h>
+#include <wlr/util/region.h>
#include "rootston/server.h"
#include "rootston/output.h"
#include "rootston/config.h"
@@ -186,7 +187,7 @@ static void render_surface(struct wlr_surface *surface, double lx, double ly,
return;
}
- // TODO: output scale, output transform support
+ // TODO: output transform support
pixman_region32_t damage;
pixman_region32_init(&damage);
pixman_region32_union_rect(&damage, &damage, box.x, box.y,
@@ -257,7 +258,7 @@ static void render_decorations(struct roots_view *view,
struct wlr_box box;
get_decoration_box(view, output, &box);
- // TODO: output scale, output transform support
+ // TODO: output transform support
pixman_region32_t damage;
pixman_region32_init(&damage);
pixman_region32_union_rect(&damage, &damage, box.x, box.y,
@@ -583,10 +584,11 @@ static void damage_from_surface(struct wlr_surface *surface,
return;
}
- // TODO: output scale, output transform support
+ // TODO: output transform support
pixman_region32_t damage;
pixman_region32_init(&damage);
pixman_region32_copy(&damage, &surface->current->surface_damage);
+ wlr_region_scale(&damage, &damage, output->wlr_output->scale);
pixman_region32_translate(&damage, box.x, box.y);
pixman_region32_union(&output->damage, &output->damage, &damage);
pixman_region32_fini(&damage);
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);
+}