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(®ion);
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;