From 6dbc310df4aa2ad24cef47781c07f0818fca465b Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 17 May 2025 17:03:03 -0700 Subject: [PATCH] widgets/cliprect: fix premultiplied alpha blending --- src/widgets/shaders/cliprect.frag | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/widgets/shaders/cliprect.frag b/src/widgets/shaders/cliprect.frag index f1c004a1..2b8db2a8 100644 --- a/src/widgets/shaders/cliprect.frag +++ b/src/widgets/shaders/cliprect.frag @@ -14,11 +14,12 @@ layout(binding = 2) uniform sampler2D content; vec4 overlay(vec4 base, vec4 overlay) { if (overlay.a == 0.0) return base; + if (base.a == 0.0) return overlay; - float baseMul = 1.0 - overlay.a; - float newAlpha = overlay.a + base.a * baseMul; - vec3 rgb = (overlay.rgb * overlay.a + base.rgb * base.a * baseMul) / newAlpha; - return vec4(rgb, newAlpha); + vec3 rgb = overlay.rgb + base.rgb * (1.0 - overlay.a); + float a = overlay.a + base.a * (1.0 - overlay.a); + + return vec4(rgb, a); } void main() {