From 079f0f4342b8b8542b76e1c0c23b28d6682ba47a Mon Sep 17 00:00:00 2001 From: Chris Lorenzo Date: Tue, 19 May 2026 12:27:58 -0400 Subject: [PATCH] fix: bordered shaders precision with asymmetric borders Port upstream lightning-js/renderer#751: adjust u_borderWidth via `u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0)` so asymmetric border-diff math (borderRight - borderLeft, etc.) renders correctly for sub-pixel and zero-on-one-side cases. Values >= 1 are unchanged. Co-Authored-By: Claude Opus 4.7 --- src/core/shaders/webgl/Border.ts | 10 ++++++---- src/core/shaders/webgl/RoundedWithBorder.ts | 10 ++++++---- src/core/shaders/webgl/RoundedWithBorderAndShadow.ts | 10 ++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/core/shaders/webgl/Border.ts b/src/core/shaders/webgl/Border.ts index acf3018..1618870 100644 --- a/src/core/shaders/webgl/Border.ts +++ b/src/core/shaders/webgl/Border.ts @@ -47,10 +47,12 @@ export const Border: WebGlShaderType = { vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y); vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0); - float borderTop = u_borderWidth.x; - float borderRight = u_borderWidth.y; - float borderBottom = u_borderWidth.z; - float borderLeft = u_borderWidth.w; + vec4 adjustedBorderWidth = u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0); + + float borderTop = adjustedBorderWidth.x; + float borderRight = adjustedBorderWidth.y; + float borderBottom = adjustedBorderWidth.z; + float borderLeft = adjustedBorderWidth.w; v_outerBorderUv = vec2(0.0); v_innerBorderUv = vec2(0.0); diff --git a/src/core/shaders/webgl/RoundedWithBorder.ts b/src/core/shaders/webgl/RoundedWithBorder.ts index b38ffdf..ac66fc9 100644 --- a/src/core/shaders/webgl/RoundedWithBorder.ts +++ b/src/core/shaders/webgl/RoundedWithBorder.ts @@ -65,10 +65,12 @@ export const RoundedWithBorder: WebGlShaderType = { v_outerSize = vec2(0.0); if(borderZero == 0.0) { - float borderTop = u_borderWidth.x; - float borderRight = u_borderWidth.y; - float borderBottom = u_borderWidth.z; - float borderLeft = u_borderWidth.w; + vec4 adjustedBorderWidth = u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0); + + float borderTop = adjustedBorderWidth.x; + float borderRight = adjustedBorderWidth.y; + float borderBottom = adjustedBorderWidth.z; + float borderLeft = adjustedBorderWidth.w; v_outerBorderUv = vec2(0.0); v_innerBorderUv = vec2(0.0); diff --git a/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts b/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts index c41339f..a2d17e0 100644 --- a/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +++ b/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts @@ -72,10 +72,12 @@ export const RoundedWithBorderAndShadow: WebGlShaderType