From 25cc05b45c0bedf97bae6dd3e45405c4403444ff Mon Sep 17 00:00:00 2001 From: Michael Sloan Date: Wed, 14 May 2025 09:02:38 +0200 Subject: [PATCH] Use `Vec` instead of `SmallVec` for `glyphs` field of `ShapedRun` (#30664) This glyphs field is usually larger than 8 elements, and SmallVec is not efficient when it cannot store the value inline. This change also adds precise glyphs run preallocation in some places `ShapedRun` is constructed. Release Notes: - N/A --- crates/gpui/src/platform.rs | 2 +- crates/gpui/src/platform/linux/text_system.rs | 4 ++-- crates/gpui/src/platform/mac/text_system.rs | 2 +- crates/gpui/src/platform/windows/direct_write.rs | 3 +-- crates/gpui/src/text_system/line_layout.rs | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 6f470cccecbd6074d79db750c6b608e076df9892..51f340f167d5de781b8c012fb7d49970048763e8 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -595,7 +595,7 @@ impl PlatformTextSystem for NoopTextSystem { .unwrap() .width / metrics.units_per_em as f32; - let mut glyphs = SmallVec::default(); + let mut glyphs = Vec::new(); for (ix, c) in text.char_indices() { if let Some(glyph) = self.glyph_for_char(FontId(0), c) { glyphs.push(ShapedGlyph { diff --git a/crates/gpui/src/platform/linux/text_system.rs b/crates/gpui/src/platform/linux/text_system.rs index 08860978be18c9e68867f12db8b41b4f7c3a49ef..828a5ecc955fbb5bde370eb19f30e6591f5615e6 100644 --- a/crates/gpui/src/platform/linux/text_system.rs +++ b/crates/gpui/src/platform/linux/text_system.rs @@ -16,7 +16,7 @@ use pathfinder_geometry::{ rect::{RectF, RectI}, vector::{Vector2F, Vector2I}, }; -use smallvec::{SmallVec, smallvec}; +use smallvec::SmallVec; use std::{borrow::Cow, sync::Arc}; pub(crate) struct CosmicTextSystem(RwLock); @@ -443,7 +443,7 @@ impl CosmicTextSystemState { } else { runs.push(ShapedRun { font_id, - glyphs: smallvec![shaped_glyph], + glyphs: vec![shaped_glyph], }); } } diff --git a/crates/gpui/src/platform/mac/text_system.rs b/crates/gpui/src/platform/mac/text_system.rs index abc6cf46c4032105526a5a34dbc29ccc8381b935..21f8180a37bb4d10f1661b3ad890664e734c8f54 100644 --- a/crates/gpui/src/platform/mac/text_system.rs +++ b/crates/gpui/src/platform/mac/text_system.rs @@ -480,7 +480,7 @@ impl MacTextSystemState { }; let font_id = self.id_for_native_font(font); - let mut glyphs = SmallVec::new(); + let mut glyphs = Vec::with_capacity(run.glyph_count().try_into().unwrap_or(0)); for ((glyph_id, position), glyph_utf16_ix) in run .glyphs() .iter() diff --git a/crates/gpui/src/platform/windows/direct_write.rs b/crates/gpui/src/platform/windows/direct_write.rs index 240421deb888e976ccacdbad99e7b2861b3374ed..45363b3ac06b8e5a6174ecf7ff8cf0b412c72a95 100644 --- a/crates/gpui/src/platform/windows/direct_write.rs +++ b/crates/gpui/src/platform/windows/direct_write.rs @@ -5,7 +5,6 @@ use anyhow::{Result, anyhow}; use collections::HashMap; use itertools::Itertools; use parking_lot::{RwLock, RwLockUpgradableReadGuard}; -use smallvec::SmallVec; use windows::{ Win32::{ Foundation::*, @@ -1089,7 +1088,7 @@ impl IDWriteTextRenderer_Impl for TextRenderer_Impl { } else { context.text_system.select_font(&font_struct) }; - let mut glyphs = SmallVec::new(); + let mut glyphs = Vec::with_capacity(glyph_count); for index in 0..glyph_count { let id = GlyphId(*glyphrun.glyphIndices.add(index) as u32); context diff --git a/crates/gpui/src/text_system/line_layout.rs b/crates/gpui/src/text_system/line_layout.rs index 8a5d35628a4423166cbdccbb0a9955df75534883..e683bac7bdc315a493155e1126a01470afa46a03 100644 --- a/crates/gpui/src/text_system/line_layout.rs +++ b/crates/gpui/src/text_system/line_layout.rs @@ -34,7 +34,7 @@ pub struct ShapedRun { /// The font id for this run pub font_id: FontId, /// The glyphs that make up this run - pub glyphs: SmallVec<[ShapedGlyph; 8]>, + pub glyphs: Vec, } /// A single glyph, ready to paint.