commit 5d32737
shrub
·
2026-09-02 14:40:45 +0000 UTC
parent 361fa39
allow transparency in screenshots
1 files changed,
+19,
-6
+19,
-6
1@@ -2076,12 +2076,25 @@ compositor_render_to_shm(struct screen *screen)
2
3 if (src &&
4 (wld_capabilities(swc.shm->renderer, src) & WLD_CAPABILITY_READ)) {
5- int32_t x = view->base.geometry.x - screen->base.geometry.x;
6- int32_t y = view->base.geometry.y - screen->base.geometry.y;
7-
8- wld_copy_rectangle(swc.shm->renderer, src, x, y, 0, 0,
9- view->base.geometry.width,
10- view->base.geometry.height);
11+ const struct swc_rectangle *geom = &view->base.geometry;
12+ int32_t src_x = view->window ? view->buffer_offset_x : 0;
13+ int32_t src_y = view->window ? view->buffer_offset_y : 0;
14+ int32_t dst_x = geom->x - src_x - screen->base.geometry.x;
15+ int32_t dst_y = geom->y - src_y - screen->base.geometry.y;
16+ pixman_region32_t source_region;
17+
18+ pixman_region32_init_rect(&source_region, src_x, src_y, geom->width,
19+ geom->height);
20+ pixman_region32_intersect_rect(&source_region, &source_region, 0, 0,
21+ src->width, src->height);
22+ if (src->format == WLD_FORMAT_ARGB8888) {
23+ wld_blend_region(swc.shm->renderer, src, dst_x, dst_y,
24+ &source_region);
25+ } else {
26+ wld_copy_region(swc.shm->renderer, src, dst_x, dst_y,
27+ &source_region);
28+ }
29+ pixman_region32_fini(&source_region);
30 }
31
32 if ((view->border.outwidth > 0 || view->border.inwidth > 0) &&