diff --git a/components/gfx/font_context.rs b/components/gfx/font_context.rs index b330a5c33d6..6651ead7e96 100644 --- a/components/gfx/font_context.rs +++ b/components/gfx/font_context.rs @@ -82,6 +82,8 @@ pub struct FontContext { /// per frame. TODO: Make this weak when incremental redraw is done. paint_font_cache: Vec, + layout_font_group_address_cache: HashMap, DefaultState>, + layout_font_group_cache: HashMap, DefaultState>, @@ -97,6 +99,7 @@ impl FontContext { layout_font_cache: vec!(), fallback_font_cache: vec!(), paint_font_cache: vec!(), + layout_font_group_address_cache: HashMap::with_hash_state(Default::default()), layout_font_group_cache: HashMap::with_hash_state(Default::default()), epoch: 0, } @@ -144,6 +147,7 @@ impl FontContext { self.layout_font_cache.clear(); self.fallback_font_cache.clear(); self.paint_font_cache.clear(); + self.layout_font_group_address_cache.clear(); self.layout_font_group_cache.clear(); self.epoch = current_epoch } @@ -152,21 +156,21 @@ impl FontContext { /// a cached font if this font instance has already been used by /// this context. pub fn layout_font_group_for_style(&mut self, style: Arc) - -> Rc { + -> Rc { self.expire_font_caches_if_necessary(); let address = &*style as *const SpecifiedFontStyle as usize; - if let Some(ref cached_font_group) = self.layout_font_group_cache.get(&address) { + if let Some(ref cached_font_group) = self.layout_font_group_address_cache.get(&address) { return (*cached_font_group).clone() } let layout_font_group_cache_key = LayoutFontGroupCacheKey { pointer: style.clone(), size: style.font_size, - address: address, }; if let Some(ref cached_font_group) = self.layout_font_group_cache.get( &layout_font_group_cache_key) { + self.layout_font_group_address_cache.insert(address, (*cached_font_group).clone()); return (*cached_font_group).clone() } @@ -275,6 +279,7 @@ impl FontContext { let font_group = Rc::new(FontGroup::new(fonts)); self.layout_font_group_cache.insert(layout_font_group_cache_key, font_group.clone()); + self.layout_font_group_address_cache.insert(address, font_group.clone()); font_group } @@ -316,7 +321,6 @@ impl HeapSizeOf for FontContext { struct LayoutFontGroupCacheKey { pointer: Arc, size: Au, - address: usize, } impl PartialEq for LayoutFontGroupCacheKey { @@ -333,12 +337,6 @@ impl Hash for LayoutFontGroupCacheKey { } } -impl borrow::Borrow for LayoutFontGroupCacheKey { - fn borrow(&self) -> &usize { - &self.address - } -} - #[inline] pub fn invalidate_font_caches() { FONT_CACHE_EPOCH.fetch_add(1, Ordering::SeqCst);