mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 06:40:06 -04:00
Apply review suggestion about GlyphCacheKey
This commit is contained in:
@@ -133,6 +133,35 @@ pub struct GlyphAllocation {
|
|||||||
pub uv_rect: UvRect,
|
pub uv_rect: UvRect,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq)]
|
||||||
|
struct GlyphCacheKey(u64);
|
||||||
|
|
||||||
|
impl nohash_hasher::IsEnabled for GlyphCacheKey {}
|
||||||
|
|
||||||
|
impl GlyphCacheKey {
|
||||||
|
fn new(glyph_id: ab_glyph::GlyphId, metrics: &ScaledMetrics, bin: SubpixelBin) -> Self {
|
||||||
|
let ScaledMetrics {
|
||||||
|
pixels_per_point,
|
||||||
|
px_scale_factor,
|
||||||
|
..
|
||||||
|
} = *metrics;
|
||||||
|
debug_assert!(
|
||||||
|
0.0 < pixels_per_point && pixels_per_point.is_finite(),
|
||||||
|
"Bad pixels_per_point {pixels_per_point}"
|
||||||
|
);
|
||||||
|
debug_assert!(
|
||||||
|
0.0 < px_scale_factor && px_scale_factor.is_finite(),
|
||||||
|
"Bad px_scale_factor: {px_scale_factor}"
|
||||||
|
);
|
||||||
|
Self(crate::util::hash((
|
||||||
|
glyph_id,
|
||||||
|
pixels_per_point.to_bits(),
|
||||||
|
px_scale_factor.to_bits(),
|
||||||
|
bin,
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
/// A specific font face.
|
/// A specific font face.
|
||||||
@@ -142,7 +171,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: ahash::HashMap<(ab_glyph::GlyphId, SubpixelBin, u64), GlyphAllocation>,
|
glyph_alloc_cache: ahash::HashMap<GlyphCacheKey, GlyphAllocation>,
|
||||||
}
|
}
|
||||||
|
|
||||||
trait FontExt {
|
trait FontExt {
|
||||||
@@ -324,7 +353,7 @@ impl FontImpl {
|
|||||||
|
|
||||||
let entry = match self
|
let entry = match self
|
||||||
.glyph_alloc_cache
|
.glyph_alloc_cache
|
||||||
.entry((glyph_id, bin, metrics.glyph_cache_key()))
|
.entry(GlyphCacheKey::new(glyph_id, metrics, bin))
|
||||||
{
|
{
|
||||||
std::collections::hash_map::Entry::Occupied(glyph_alloc) => {
|
std::collections::hash_map::Entry::Occupied(glyph_alloc) => {
|
||||||
return (*glyph_alloc.get(), h_pos_round);
|
return (*glyph_alloc.get(), h_pos_round);
|
||||||
@@ -502,32 +531,6 @@ 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