From 242397764a63fa46db54964a7b9300d4f9a5588c Mon Sep 17 00:00:00 2001 From: var4yn <2016slavyakinnikita@gmail.com> Date: Thu, 26 Mar 2026 16:17:25 +0800 Subject: [PATCH 1/3] fix: correct text positioning and scaling for ascent overflow --- src/drawing/text.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/drawing/text.rs b/src/drawing/text.rs index 104df0a7..6615b0b9 100644 --- a/src/drawing/text.rs +++ b/src/drawing/text.rs @@ -21,6 +21,21 @@ fn layout_glyphs( let mut w = 0.0; let mut prev: Option = None; + let mut h = 0.0_f32; + let mut y_above_ascent = 0.0_f32; + + // Find the peak `y_above_ascent` value which above ascent across all glyphs + for c in text.chars() { + let glyph_id = font.glyph_id(c); + let glyph = glyph_id.with_scale_and_position(scale, point(w, font.ascent())); + if let Some(g) = font.outline_glyph(glyph) { + let bb = g.px_bounds(); + y_above_ascent = y_above_ascent.min(bb.min.y); + h = h.max(bb.max.y - bb.min.y); + } + } + y_above_ascent = y_above_ascent.abs(); + for c in text.chars() { let glyph_id = font.glyph_id(c); let glyph = glyph_id.with_scale_and_position(scale, point(w, font.ascent())); @@ -30,13 +45,15 @@ fn layout_glyphs( w += font.kern(glyph_id, prev); } prev = Some(glyph_id); - let bb = g.px_bounds(); + let mut bb = g.px_bounds(); + bb.min.y += y_above_ascent; + bb.max.y += y_above_ascent; f(g, bb); } } let w = w.ceil(); - let h = font.height().ceil(); + let h = h.ceil(); assert!(w >= 0.0); assert!(h >= 0.0); (1 + w as u32, h as u32) From b66d68d3363eb7bc6e6b622e64e76fb39bb322bb Mon Sep 17 00:00:00 2001 From: var4yn <2016slavyakinnikita@gmail.com> Date: Thu, 26 Mar 2026 17:26:02 +0800 Subject: [PATCH 2/3] fix: case below ascent --- src/drawing/text.rs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/drawing/text.rs b/src/drawing/text.rs index 6615b0b9..f590237c 100644 --- a/src/drawing/text.rs +++ b/src/drawing/text.rs @@ -1,4 +1,5 @@ use image::{GenericImage, Pixel}; +use num::Zero; use std::f32; use crate::definitions::{Clamp, Image}; @@ -21,20 +22,38 @@ fn layout_glyphs( let mut w = 0.0; let mut prev: Option = None; - let mut h = 0.0_f32; + let mut y_max = 0.0_f32; + let mut y_min = 0.0_f32; let mut y_above_ascent = 0.0_f32; + let mut y_below_ascent = f32::MAX; // Find the peak `y_above_ascent` value which above ascent across all glyphs + // And the minimum `y_below_ascent` value which below ascent across all glyphs for c in text.chars() { let glyph_id = font.glyph_id(c); let glyph = glyph_id.with_scale_and_position(scale, point(w, font.ascent())); if let Some(g) = font.outline_glyph(glyph) { let bb = g.px_bounds(); + + // for correct offset y_above_ascent = y_above_ascent.min(bb.min.y); - h = h.max(bb.max.y - bb.min.y); + y_below_ascent = y_below_ascent.min(bb.min.y).max(0.0); + + // for correct height + y_min = y_min.min(bb.min.y); + y_max = y_max.max(bb.max.y); } } - y_above_ascent = y_above_ascent.abs(); + + let offset_y = if y_above_ascent.is_zero() { + y_below_ascent + } else { + y_above_ascent + }; + + // height and remove overflow ascent + dbg!(y_above_ascent, y_below_ascent); + let h = y_max - y_min - y_below_ascent; for c in text.chars() { let glyph_id = font.glyph_id(c); @@ -46,8 +65,8 @@ fn layout_glyphs( } prev = Some(glyph_id); let mut bb = g.px_bounds(); - bb.min.y += y_above_ascent; - bb.max.y += y_above_ascent; + bb.min.y -= offset_y; + bb.max.y -= offset_y; f(g, bb); } } From d2a5c4b71b0bcee9eb14c7be0f768920d9ec3776 Mon Sep 17 00:00:00 2001 From: var4yn <2016slavyakinnikita@gmail.com> Date: Thu, 26 Mar 2026 18:00:24 +0800 Subject: [PATCH 3/3] add regression test --- src/drawing/text.rs | 12 ++--- tests/data/truth/overflow_glyph_number.png | Bin 0 -> 773 bytes tests/data/truth/overflow_glyph_out.png | Bin 0 -> 12519 bytes tests/data/truth/overflow_glyph_symbol.png | Bin 0 -> 2420 bytes tests/data/truth/overflow_glyph_symbols.png | Bin 0 -> 16837 bytes .../truth/overflow_glyph_symbols_little.png | Bin 0 -> 14561 bytes tests/regression.rs | 41 ++++++++++++++++++ 7 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 tests/data/truth/overflow_glyph_number.png create mode 100644 tests/data/truth/overflow_glyph_out.png create mode 100644 tests/data/truth/overflow_glyph_symbol.png create mode 100644 tests/data/truth/overflow_glyph_symbols.png create mode 100644 tests/data/truth/overflow_glyph_symbols_little.png diff --git a/src/drawing/text.rs b/src/drawing/text.rs index f590237c..ad633ecb 100644 --- a/src/drawing/text.rs +++ b/src/drawing/text.rs @@ -34,27 +34,27 @@ fn layout_glyphs( let glyph = glyph_id.with_scale_and_position(scale, point(w, font.ascent())); if let Some(g) = font.outline_glyph(glyph) { let bb = g.px_bounds(); - + // for correct offset y_above_ascent = y_above_ascent.min(bb.min.y); y_below_ascent = y_below_ascent.min(bb.min.y).max(0.0); - + // for correct height y_min = y_min.min(bb.min.y); y_max = y_max.max(bb.max.y); } } + // height and remove overflow ascent + let h = y_max - y_min - y_below_ascent; + + // select offset let offset_y = if y_above_ascent.is_zero() { y_below_ascent } else { y_above_ascent }; - // height and remove overflow ascent - dbg!(y_above_ascent, y_below_ascent); - let h = y_max - y_min - y_below_ascent; - for c in text.chars() { let glyph_id = font.glyph_id(c); let glyph = glyph_id.with_scale_and_position(scale, point(w, font.ascent())); diff --git a/tests/data/truth/overflow_glyph_number.png b/tests/data/truth/overflow_glyph_number.png new file mode 100644 index 0000000000000000000000000000000000000000..e46310a2f705fe9c9e68018200d55d242cf08e85 GIT binary patch literal 773 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 literal 0 HcmV?d00001 diff --git a/tests/data/truth/overflow_glyph_symbol.png b/tests/data/truth/overflow_glyph_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c90a6bc4b4edccbda0ca88dd619e8dbc0a5f87 GIT binary patch literal 2420 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 a`P`LD{D-3Wf6qYW&0qB6BR^WU_5T3*O^vJo literal 0 HcmV?d00001 diff --git a/tests/data/truth/overflow_glyph_symbols_little.png b/tests/data/truth/overflow_glyph_symbols_little.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e176f1be1acc906221b6c86a301aab5ef2ae86 GIT binary patch literal 14561 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 literal 0 HcmV?d00001 diff --git a/tests/regression.rs b/tests/regression.rs index 556cbe8a..f58f4b0f 100644 --- a/tests/regression.rs +++ b/tests/regression.rs @@ -1021,3 +1021,44 @@ fn test_draw_text_with_alpha() { compare_to_truth("elephant.png", "text_alpha.png", draw_text_with_alpha); } + +#[test] +#[cfg(feature = "text")] +fn test_draw_text_without_overflow_glyphs() { + use image::RgbaImage; + + fn txt_img(word: &str) -> RgbaImage { + let mplantin = include_bytes!("data/fonts/DejaVuSans.ttf"); + let mplantin = ab_glyph::FontArc::try_from_slice(mplantin).unwrap(); + + let font_size = 128.0; + + let (w, h) = imageproc::drawing::text_size(font_size, &mplantin, word); + let mut image: DynamicImage = DynamicImage::new_rgba8(w, h); + + imageproc::drawing::draw_text_mut( + &mut image, + image::Rgba([100u8, 100u8, 100u8, 255u8]), + 0, + 0, + font_size, + &mplantin, + word, + ); + + image.to_rgba8() + } + + let words = [ + ("ÁÄAaaa", "out"), + ("A", "symbol"), + ("Äabcpghky", "symbols"), + ("abcpghky", "symbols_little"), + ("1.", "number"), + ]; + + for (word, filename) in words { + let img = txt_img(word); + compare_to_truth_image(&img, &format!("overflow_glyph_{}.png", filename)); + } +}