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);