commit de1782b

shrub  ·  2026-09-01 22:19:02 +0000 UTC
parent b541f39
allow transparent decor
2 files changed,  +30, -8
+28, -7
 1@@ -329,12 +329,16 @@ draw_decor_part(struct wld_renderer *renderer,
 2 				int32_t clip_y2 = MIN(tile_y + (int32_t)part->height, ry2);
 3 
 4 				if (clip_x2 > clip_x1 && clip_y2 > clip_y1) {
 5-					wld_copy_rectangle(renderer, part->buffer,
 6-					                   clip_x1 - target_geom->x,
 7-					                   clip_y1 - target_geom->y,
 8-					                   clip_x1 - tile_x, clip_y1 - tile_y,
 9-					                   (uint32_t)(clip_x2 - clip_x1),
10-					                   (uint32_t)(clip_y2 - clip_y1));
11+					pixman_region32_t source_region;
12+
13+					pixman_region32_init_rect(
14+					    &source_region, clip_x1 - tile_x, clip_y1 - tile_y,
15+					    (uint32_t)(clip_x2 - clip_x1),
16+					    (uint32_t)(clip_y2 - clip_y1));
17+					wld_blend_region(renderer, part->buffer,
18+					                 tile_x - target_geom->x,
19+					                 tile_y - target_geom->y, &source_region);
20+					pixman_region32_fini(&source_region);
21 				}
22 			}
23 		}
24@@ -343,6 +347,18 @@ draw_decor_part(struct wld_renderer *renderer,
25 	pixman_region32_fini(&region);
26 }
27 
28+static bool
29+decor_parts_complete(struct compositor_view *view)
30+{
31+	for (uint32_t i = 0; i < DECOR_PART_COUNT; ++i) {
32+		if (!view->decor.parts[i].buffer) {
33+			return false;
34+		}
35+	}
36+
37+	return true;
38+}
39+
40 bool
41 decor_initialize(void)
42 {
43@@ -417,7 +433,8 @@ decor_repaint(struct wld_renderer *renderer,
44 	pixman_region32_subtract(&decor_region, &decor_region, &content_region);
45 	pixman_region32_intersect(&decor_region, &decor_region, damage);
46 	pixman_region32_subtract(&decor_region, &decor_region, &view->clip);
47-	if (pixman_region32_not_empty(&decor_region)) {
48+	if (!decor_parts_complete(view) &&
49+	    pixman_region32_not_empty(&decor_region)) {
50 		pixman_region32_translate(&decor_region, -target_geom->x, -target_geom->y);
51 		wld_fill_region(renderer, view->decor.color, &decor_region);
52 		pixman_region32_translate(&decor_region, target_geom->x, target_geom->y);
53@@ -447,6 +464,8 @@ decor_repaint(struct wld_renderer *renderer,
54 		                &view->decor.parts[DECOR_PART_TOP],
55 		                outer_x + (int32_t)tl_width, outer_y,
56 		                outer_width - tl_width - tr_width, view->decor.top);
57+	}
58+	if (outer_width > bl_width + br_width) {
59 		draw_decor_part(renderer, target_geom, view, damage,
60 		                &view->decor.parts[DECOR_PART_BOTTOM],
61 		                outer_x + (int32_t)bl_width,
62@@ -459,6 +478,8 @@ decor_repaint(struct wld_renderer *renderer,
63 		                &view->decor.parts[DECOR_PART_LEFT], outer_x,
64 		                outer_y + (int32_t)tl_height, view->decor.left,
65 		                outer_height - tl_height - bl_height);
66+	}
67+	if (outer_height > tr_height + br_height) {
68 		draw_decor_part(renderer, target_geom, view, damage,
69 		                &view->decor.parts[DECOR_PART_RIGHT],
70 		                outer_x + (int32_t)outer_width - (int32_t)view->decor.right,
+2, -1
 1@@ -447,7 +447,8 @@ struct swc_decor_text {
 2  * swc copies the pixel data when swc_window_set_decor() is called, so caller
 3  * doesn't need to keep it after the call returns.
 4  *
 5- * Pixel data is expected to be ARGB8888 with the provided stride.
 6+ * Pixel data is expected to be premultiplied ARGB8888 with the provided
 7+ * stride.
 8  */
 9 struct swc_decor_part {
10 	uint32_t width, height;