From d34443d1e2cd5a19d71e5ff56546247e1b868c1e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 18:53:18 +0000 Subject: [PATCH] fix: center stretched box drawing chars vertically within cells When stretching box drawing characters vertically to fill the lineheight, they were only stretching upwards from the baseline, which resulted in them not extending below the baseline properly. This commit ensures that the stretching is centered around the middle of the cell. - In `src/render_gif.rs`, offset the `py` coordinate of box drawing characters by `cell_center_y - box_center_y`. - In `src/render_svg.rs`, center the SVG `` elements representing box drawing characters around `cell_center_y`. Co-authored-by: HalFrgrd <4559349+HalFrgrd@users.noreply.github.com> --- src/render_gif.rs | 8 +++++++- src/render_svg.rs | 8 +++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/render_gif.rs b/src/render_gif.rs index f127e02..754a0cc 100644 --- a/src/render_gif.rs +++ b/src/render_gif.rs @@ -548,7 +548,13 @@ fn rasterize_raw_frame( continue; } let px = pen_x as i32 + bm.offset_x + gx as i32; - let py = pen_y_baseline + bm.offset_y + gy as i32; + let mut py = pen_y_baseline + bm.offset_y + gy as i32; + if is_box_drawing(ch) { + // Center the stretched bitmap within the cell vertically. + let cell_center_y = y as i32 + (cell_h as i32) / 2; + let box_center_y = pen_y_baseline + bm.offset_y + (bm.height as i32) / 2; + py += cell_center_y - box_center_y; + } if px < 0 || py < 0 { continue; } diff --git a/src/render_svg.rs b/src/render_svg.rs index 6db50fe..4b5bea1 100644 --- a/src/render_svg.rs +++ b/src/render_svg.rs @@ -465,10 +465,12 @@ fn emit_frame_body(s: &mut String, frame: &RawFrame, cfg: ViewportConfig, font_s let transform = if scale_y > 1.0 { // SVG text coordinates are roughly on the baseline. Scaling by Y will stretch the ascent and descent. // To keep the character centered vertically in the cell, we scale it relative to its vertical center. - let cy = y as f32 - (font_size * 0.3); // Approximate vertical center of the character, closer to baseline + let cell_center_y = (y as f32 - baseline as f32) + (cell_h as f32 / 2.0); + let char_center_y = y as f32 - (font_size * 0.3); // Approximate vertical center of the character, closer to baseline format!( - r#" transform="translate(0, {cy}) scale(1, {scale_y}) translate(0, -{cy})""#, - cy = cy, + r#" transform="translate(0, {cy}) scale(1, {scale_y}) translate(0, -{char_center_y})""#, + cy = cell_center_y, + char_center_y = char_center_y, scale_y = scale_y ) } else {