diff --git a/gpui/src/platform/mac/renderer.rs b/gpui/src/platform/mac/renderer.rs index d125fe136675df9dd776f3f79ad2b21fe71668b7..d215eaf77ce87ed33d9a40592853d513e6e6df58 100644 --- a/gpui/src/platform/mac/renderer.rs +++ b/gpui/src/platform/mac/renderer.rs @@ -396,11 +396,13 @@ impl Renderer { drawable_size: Vector2F, command_encoder: &metal::RenderCommandEncoderRef, ) { - if layer.quads().is_empty() { + if layer.quads().is_empty() && layer.underlines().is_empty() { return; } align_offset(offset); - let next_offset = *offset + layer.quads().len() * mem::size_of::(); + let next_offset = *offset + + (layer.quads().len() + layer.underlines().len()) + * mem::size_of::(); assert!( next_offset <= INSTANCE_BUFFER_SIZE, "instance buffer exhausted" @@ -430,7 +432,7 @@ impl Renderer { (self.instances.contents() as *mut u8).offset(*offset as isize) as *mut shaders::GPUIQuad }; - for (ix, quad) in layer.quads().iter().enumerate() { + for (ix, quad) in layer.quads().iter().chain(layer.underlines()).enumerate() { let bounds = quad.bounds * scene.scale_factor(); let border_width = quad.border.width * scene.scale_factor(); let shader_quad = shaders::GPUIQuad { @@ -456,7 +458,7 @@ impl Renderer { metal::MTLPrimitiveType::Triangle, 0, 6, - layer.quads().len() as u64, + (layer.quads().len() + layer.underlines().len()) as u64, ); *offset = next_offset; } diff --git a/gpui/src/scene.rs b/gpui/src/scene.rs index 0bd0fe8a77fe5899421981419eedd088c38ab54a..401918c5fe014426a98496d7f4e2d31b903bb274 100644 --- a/gpui/src/scene.rs +++ b/gpui/src/scene.rs @@ -24,6 +24,7 @@ struct StackingContext { pub struct Layer { clip_bounds: Option, quads: Vec, + underlines: Vec, shadows: Vec, glyphs: Vec, icons: Vec, @@ -165,6 +166,10 @@ impl Scene { self.active_layer().push_quad(quad) } + pub fn push_underline(&mut self, underline: Quad) { + self.active_layer().push_underline(underline) + } + pub fn push_shadow(&mut self, shadow: Shadow) { self.active_layer().push_shadow(shadow) } @@ -234,6 +239,7 @@ impl Layer { Self { clip_bounds, quads: Vec::new(), + underlines: Vec::new(), shadows: Vec::new(), glyphs: Vec::new(), icons: Vec::new(), @@ -253,6 +259,14 @@ impl Layer { self.quads.as_slice() } + fn push_underline(&mut self, underline: Quad) { + self.underlines.push(underline); + } + + pub fn underlines(&self) -> &[Quad] { + self.underlines.as_slice() + } + fn push_shadow(&mut self, shadow: Shadow) { self.shadows.push(shadow); } diff --git a/gpui/src/text_layout.rs b/gpui/src/text_layout.rs index 1f710ac31173575c6f0dcd27e5abb15558a98138..692efaf4244c8d61fa8ce90190dac75d97ee8c9c 100644 --- a/gpui/src/text_layout.rs +++ b/gpui/src/text_layout.rs @@ -271,7 +271,7 @@ impl Line { if let Some((run_len, run_color, run_underlined)) = style_runs.next() { if let Some(underline_origin) = underline_start { if !*run_underlined || *run_color != color { - cx.scene.push_quad(scene::Quad { + cx.scene.push_underline(scene::Quad { bounds: RectF::from_points( underline_origin, glyph_origin + vec2f(0., 1.), @@ -307,7 +307,8 @@ impl Line { if let Some(underline_start) = underline_start.take() { let line_end = origin + baseline_offset + vec2f(self.layout.width, 0.); - cx.scene.push_quad(scene::Quad { + + cx.scene.push_underline(scene::Quad { bounds: RectF::from_points(underline_start, line_end + vec2f(0., 1.)), background: Some(color), border: Default::default(),