mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 23:00:04 -04:00
Optimize glyph allocation cache lookups
This commit is contained in:
@@ -81,8 +81,7 @@ pub struct FontImpl {
|
|||||||
ab_glyph_font: ab_glyph::FontArc,
|
ab_glyph_font: ab_glyph::FontArc,
|
||||||
tweak: FontTweak,
|
tweak: FontTweak,
|
||||||
glyph_info_cache: ahash::HashMap<char, GlyphInfo>,
|
glyph_info_cache: ahash::HashMap<char, GlyphInfo>,
|
||||||
glyph_alloc_cache:
|
glyph_alloc_cache: ahash::HashMap<(ab_glyph::GlyphId, u64), GlyphAllocation>,
|
||||||
ahash::HashMap<(ab_glyph::GlyphId, OrderedFloat<f32>, OrderedFloat<f32>), GlyphAllocation>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trait FontExt {
|
trait FontExt {
|
||||||
@@ -262,11 +261,10 @@ impl FontImpl {
|
|||||||
return GlyphAllocation::default();
|
return GlyphAllocation::default();
|
||||||
};
|
};
|
||||||
|
|
||||||
let entry = match self.glyph_alloc_cache.entry((
|
let entry = match self
|
||||||
glyph_id,
|
.glyph_alloc_cache
|
||||||
metrics.px_scale_factor.into(),
|
.entry((glyph_id, metrics.glyph_cache_key()))
|
||||||
metrics.pixels_per_point.into(),
|
{
|
||||||
)) {
|
|
||||||
std::collections::hash_map::Entry::Occupied(glyph_alloc) => {
|
std::collections::hash_map::Entry::Occupied(glyph_alloc) => {
|
||||||
return *glyph_alloc.get();
|
return *glyph_alloc.get();
|
||||||
}
|
}
|
||||||
@@ -441,6 +439,32 @@ pub struct ScaledMetrics {
|
|||||||
pub row_height: f32,
|
pub row_height: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ScaledMetrics {
|
||||||
|
fn glyph_cache_key(&self) -> u64 {
|
||||||
|
// This is faster than hashing two `OrderedFloat`s. Neither scale factor should ever be negative-zero or NaN.
|
||||||
|
debug_assert!(
|
||||||
|
self.pixels_per_point.is_finite() && self.pixels_per_point.is_sign_positive(),
|
||||||
|
"pixels_per_point can be safely hashed as raw bits"
|
||||||
|
);
|
||||||
|
debug_assert!(
|
||||||
|
self.px_scale_factor.is_finite() && self.px_scale_factor.is_sign_positive(),
|
||||||
|
"px_scale_factor can be safely hashed as raw bits"
|
||||||
|
);
|
||||||
|
let dpi_bits = self.pixels_per_point.to_le_bytes();
|
||||||
|
let scale_bits = self.px_scale_factor.to_le_bytes();
|
||||||
|
u64::from_le_bytes([
|
||||||
|
dpi_bits[0],
|
||||||
|
dpi_bits[1],
|
||||||
|
dpi_bits[2],
|
||||||
|
dpi_bits[3],
|
||||||
|
scale_bits[0],
|
||||||
|
scale_bits[1],
|
||||||
|
scale_bits[2],
|
||||||
|
scale_bits[3],
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Code points that will always be invisible (zero width).
|
/// Code points that will always be invisible (zero width).
|
||||||
///
|
///
|
||||||
/// See also [`FontImpl::ignore_character`].
|
/// See also [`FontImpl::ignore_character`].
|
||||||
|
|||||||
Reference in New Issue
Block a user