commit b541f39
shrub
·
2026-08-13 13:34:25 +0000 UTC
parent caeb604
let clients blend
1 files changed,
+26,
-2
+26,
-2
1@@ -301,8 +301,32 @@ repaint_view(struct target *target, struct compositor_view *view,
2 pixman_region32_translate(&buffer_damage,
3 -geom->x + view->buffer_offset_x,
4 -geom->y + view->buffer_offset_y);
5- wld_copy_region(swc.backend->renderer, view->buffer, buf_x - target_geom->x,
6- buf_y - target_geom->y, &buffer_damage);
7+ if (view->buffer->format == WLD_FORMAT_ARGB8888) {
8+ pixman_region32_t opaque_damage, blend_damage;
9+
10+ /* keep pixels that we know are opaque on the accelerated path; only
11+ * pixels which might have alpha need blending. */
12+ pixman_region32_init(&opaque_damage);
13+ pixman_region32_intersect(&opaque_damage, &buffer_damage,
14+ &view->surface->state.opaque);
15+ pixman_region32_init(&blend_damage);
16+ pixman_region32_subtract(&blend_damage, &buffer_damage,
17+ &opaque_damage);
18+
19+ wld_copy_region(swc.backend->renderer, view->buffer,
20+ buf_x - target_geom->x, buf_y - target_geom->y,
21+ &opaque_damage);
22+ wld_blend_region(swc.backend->renderer, view->buffer,
23+ buf_x - target_geom->x, buf_y - target_geom->y,
24+ &blend_damage);
25+
26+ pixman_region32_fini(&blend_damage);
27+ pixman_region32_fini(&opaque_damage);
28+ } else {
29+ wld_copy_region(swc.backend->renderer, view->buffer,
30+ buf_x - target_geom->x, buf_y - target_geom->y,
31+ &buffer_damage);
32+ }
33 }
34
35 pixman_region32_fini(&view_damage);