From fe92e29e8910e770d314f62f9678aa63dc343db7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Aug 2025 20:34:05 +0530 Subject: [PATCH] Implement background color and corner radius in rounded rect shader --- kitty/rounded_rect_fragment.glsl | 9 +++++++-- kitty/shaders.c | 12 +++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/kitty/rounded_rect_fragment.glsl b/kitty/rounded_rect_fragment.glsl index db3b26e4e..cc10968a5 100644 --- a/kitty/rounded_rect_fragment.glsl +++ b/kitty/rounded_rect_fragment.glsl @@ -1,8 +1,12 @@ +#pragma kitty_include_shader +#pragma kitty_include_shader + in vec2 dimensions; out vec4 output_color; uniform vec4 resolution_and_params; uniform vec4 color; +uniform vec4 background_color; uniform vec2 origin; float rounded_rectangle_sdf(vec2 position, vec2 size, float radius) { @@ -42,8 +46,9 @@ void main() { // Smooth borders (anti-alias) const float step_size = 0.005; float alpha = smoothstep(-step_size, step_size, outer_edge) - smoothstep(-step_size, step_size, inner_edge); + vec4 ans = color; + ans.a *= alpha; // pre-multiplied output - if (alpha <= 0) output_color = vec4(0.1, 0.1, 0.1, 0.1); else - output_color = color * alpha; + output_color = alpha_blend(ans, background_color); } diff --git a/kitty/shaders.c b/kitty/shaders.c index 5a9c93fd6..8a88c33d6 100644 --- a/kitty/shaders.c +++ b/kitty/shaders.c @@ -295,12 +295,17 @@ thickness_as_float(const OSWindow *os_window, unsigned level) { static void -draw_rounded_rect(const OSWindow *os_window, Viewport rect, unsigned framebuffer_width, unsigned framebuffer_height, unsigned thickness_level, color_type srgb_color) { +draw_rounded_rect( + const OSWindow *os_window, Viewport rect, unsigned framebuffer_width, unsigned framebuffer_height, + unsigned thickness_level, unsigned corner_radius_px, + color_type srgb_color, color_type srgb_background, float bg_alpha +) { float thickness = (float)ceil(thickness_as_float(os_window, thickness_level)); thickness = (gl_size((unsigned)thickness, framebuffer_width) + gl_size((unsigned)thickness, framebuffer_height)) / 2.f; - float corner_radius = 0.1f; + float corner_radius = (2.f * corner_radius_px) / (rect.width + rect.height); bind_program(ROUNDED_RECT_PROGRAM); color_vec4(rounded_rect_program_layout.uniforms.color, srgb_color, 1.f); + color_vec4(rounded_rect_program_layout.uniforms.background_color, srgb_background, bg_alpha); glUniform4f(rounded_rect_program_layout.uniforms.resolution_and_params, rect.width, rect.height, thickness, corner_radius); glUniform2f(rounded_rect_program_layout.uniforms.origin, gl_size(rect.left, rect.width), -gl_size(rect.top, rect.height)); save_viewport_using_top_left_origin(rect.left, rect.top, rect.width, rect.height, framebuffer_height); @@ -1231,7 +1236,8 @@ start_os_window_rendering(OSWindow *os_window) { static void stop_os_window_rendering(OSWindow *os_window, Tab *tab, Window *active_window) { if (OPT(cursor_trail) && tab->cursor_trail.needs_render) draw_cursor_trail(&tab->cursor_trail, active_window); - draw_rounded_rect(os_window, (Viewport){.left=40, .top=40, .height=os_window->viewport_height - 80, .width=200}, os_window->viewport_width, os_window->viewport_height, 1, 0xffffff); + draw_rounded_rect(os_window, (Viewport){.left=40, .top=40, .height=os_window->viewport_height - 80, .width=200}, + os_window->viewport_width, os_window->viewport_height, 1, 30, 0xffffff, 0, 0); if (os_window->needs_layers) { set_framebuffer_to_use_for_output(0); bind_framebuffer_for_output(0);