]> git.mdlowis.com Git - proto/labwc.git/commitdiff
graphic-helpers: prevent multi-rect edges from overlapping
authortokyo4j <hrak1529@gmail.com>
Sat, 13 Apr 2024 13:32:06 +0000 (22:32 +0900)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Mon, 15 Apr 2024 10:50:29 +0000 (12:50 +0200)
Multi-rect edges overlapping is problematic with translucent colors.

src/common/graphic-helpers.c

index 055b0635b6b11bb22e012532f9482fe0a168cfc3..5c754b30ba1a8765cb228a418bbdaff06a911825 100644 (file)
@@ -33,7 +33,7 @@ multi_rect_create(struct wlr_scene_tree *parent, float *colors[3], int line_widt
                wlr_scene_node_set_position(&rect->top[i]->node,
                        i * line_width, i * line_width);
                wlr_scene_node_set_position(&rect->left[i]->node,
-                       i * line_width, i * line_width);
+                       i * line_width, (i + 1) * line_width);
        }
        return rect;
 }
@@ -44,10 +44,22 @@ multi_rect_set_size(struct multi_rect *rect, int width, int height)
        assert(rect);
        int line_width = rect->line_width;
 
+       /*
+        * The outmost outline is drawn like below:
+        *
+        * |--width--|
+        *
+        * +---------+  ---
+        * +-+-----+-+   |
+        * | |     | | height
+        * | |     | |   |
+        * +-+-----+-+   |
+        * +---------+  ---
+        */
        for (size_t i = 0; i < 3; i++) {
                /* Reposition, top and left don't ever change */
                wlr_scene_node_set_position(&rect->right[i]->node,
-                       width - (i + 1) * line_width, i * line_width);
+                       width - (i + 1) * line_width, (i + 1) * line_width);
                wlr_scene_node_set_position(&rect->bottom[i]->node,
                        i * line_width, height - (i + 1) * line_width);
 
@@ -57,9 +69,9 @@ multi_rect_set_size(struct multi_rect *rect, int width, int height)
                wlr_scene_rect_set_size(rect->bottom[i],
                        width - i * line_width * 2, line_width);
                wlr_scene_rect_set_size(rect->left[i],
-                       line_width, height - i * line_width * 2);
+                       line_width, height - (i + 1) * line_width * 2);
                wlr_scene_rect_set_size(rect->right[i],
-                       line_width, height - i * line_width * 2);
+                       line_width, height - (i + 1) * line_width * 2);
        }
 }