From a08eb6bc8bc2d0d8a991f4a8fecfc30ab63d00f8 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 30 Nov 2023 15:20:39 -0700 Subject: [PATCH] Fix duplicate line numbers when wrapping --- src/text_box.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/text_box.rs b/src/text_box.rs index 98f74bf..da36187 100644 --- a/src/text_box.rs +++ b/src/text_box.rs @@ -420,17 +420,26 @@ where //TODO: move to cosmic-text? { let mut line_number_cache = LINE_NUMBER_CACHE.lock().unwrap(); + let mut last_line_number = 0; for run in editor.buffer().layout_runs() { let line_number = run.line_i.saturating_add(1); - let line_top = run.line_top; + if line_number == last_line_number { + // Skip duplicate lines + continue; + } else { + last_line_number = line_number; + } - for layout_line in line_number_cache.get( - &mut font_system, - LineNumberKey { - number: line_number, - width: line_number_chars, - }, - ) { + if let Some(layout_line) = line_number_cache + .get( + &mut font_system, + LineNumberKey { + number: line_number, + width: line_number_chars, + }, + ) + .first() + { // These values must be scaled since layout is done at font size 1.0 let max_ascent = layout_line.max_ascent * self.metrics.font_size; let max_descent = layout_line.max_descent * self.metrics.font_size; @@ -439,7 +448,7 @@ where let glyph_height = max_ascent + max_descent; let centering_offset = (self.metrics.line_height - glyph_height) / 2.0; - let line_y = line_top + centering_offset + max_ascent; + let line_y = run.line_top + centering_offset + max_ascent; for layout_glyph in layout_line.glyphs.iter() { let physical_glyph =