Fix Text node/tool max width/height bounding box calculation (#3628)

* Fix: correctly apply max width/height in text bounding box

* bug fix

* Code cleanup

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
Kulcode 2026-02-15 02:57:29 +05:30 committed by GitHub
parent 8738e59c21
commit 84f91eb795
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 14 additions and 6 deletions

View File

@ -96,7 +96,9 @@ impl TextContext {
for line in layout.lines() { for line in layout.lines() {
for item in line.items() { for item in line.items() {
if let PositionedLayoutItem::GlyphRun(glyph_run) = item { if let PositionedLayoutItem::GlyphRun(glyph_run) = item
&& typesetting.max_height.filter(|&max_height| glyph_run.baseline() > max_height as f32).is_none()
{
path_builder.render_glyph_run(&glyph_run, typesetting.tilt, per_glyph_instances); path_builder.render_glyph_run(&glyph_run, typesetting.tilt, per_glyph_instances);
} }
} }
@ -107,15 +109,21 @@ impl TextContext {
/// Calculate the bounding box of text using the specified font and typesetting configuration /// Calculate the bounding box of text using the specified font and typesetting configuration
pub fn bounding_box(&mut self, text: &str, font: &Font, font_cache: &FontCache, typesetting: TypesettingConfig, for_clipping_test: bool) -> DVec2 { pub fn bounding_box(&mut self, text: &str, font: &Font, font_cache: &FontCache, typesetting: TypesettingConfig, for_clipping_test: bool) -> DVec2 {
if !for_clipping_test && let (Some(max_height), Some(max_width)) = (typesetting.max_height, typesetting.max_width) {
return DVec2::new(max_width, max_height);
}
let Some(layout) = self.layout_text(text, font, font_cache, typesetting) else { let Some(layout) = self.layout_text(text, font, font_cache, typesetting) else {
return DVec2::ZERO; return DVec2::ZERO;
}; };
DVec2::new(layout.full_width() as f64, layout.height() as f64) let layout_width = layout.full_width() as f64;
let layout_height = layout.height() as f64;
if for_clipping_test {
return DVec2::new(layout_width, layout_height);
}
let width = typesetting.max_width.unwrap_or(layout_width);
let height = typesetting.max_height.unwrap_or(layout_height);
DVec2::new(width, height)
} }
/// Check if text lines are being clipped due to height constraints /// Check if text lines are being clipped due to height constraints