From 87221eb7db7ca3b893eaf2674fdcf6aef7296996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Mon, 20 Oct 2025 17:44:09 +0200 Subject: [PATCH] :bug: Fix underline not matching spacing/thickness --- render-wasm/src/render/text.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/render-wasm/src/render/text.rs b/render-wasm/src/render/text.rs index 9ef7c36380..d62be73ee4 100644 --- a/render-wasm/src/render/text.rs +++ b/render-wasm/src/render/text.rs @@ -289,12 +289,21 @@ fn calculate_decoration_metrics( .abs() .max(font_metrics.x_height.abs()); let min_thickness = (font_size * 0.06).max(1.0); - let thickness = font_metrics - .underline_thickness() - .unwrap_or(1.0) + + // Magic numbers for line thickness partially based on Chromium + // (see https://source.chromium.org/chromium/chromium/src/+/main:ui/gfx/render_text.cc + let raw_font_size = style_metric.text_style.font_size(); + let thickness_factor = raw_font_size.powf(0.4) * 6.0 / 18.0; + + let thickness = (font_metrics.underline_thickness().unwrap_or(1.0) * thickness_factor) .max(min_thickness); + if style_metric.text_style.decoration().ty == TextDecoration::UNDERLINE { - let y = line_baseline + font_metrics.underline_position().unwrap_or(thickness); + // Same gap from baseline to underline as in Chromium + // (see https://source.chromium.org/chromium/chromium/src/+/main:ui/gfx/render_text.cc + let gap_scaling = raw_font_size * 1.0 / 9.0; + let y = line_baseline + gap_scaling; + max_underline_thickness = max_underline_thickness.max(thickness); underline_y = Some(y); }