diff options
author | Deokjin Kim <deokjin81.kim@samsung.com> | 2013-10-02 17:58:04 +0900 |
---|---|---|
committer | Deokjin Kim <deokjin81.kim@samsung.com> | 2013-10-03 09:23:55 +0900 |
commit | 46776e1974aa8d8801531277f1149557fd7f91d5 (patch) | |
tree | 2ff4998d970d752b6911a896eb507d96cc63960a | |
parent | d6d2534b562d9e95ce02ede5920b679d53734dcf (diff) | |
download | servo-46776e1974aa8d8801531277f1149557fd7f91d5.tar.gz servo-46776e1974aa8d8801531277f1149557fd7f91d5.zip |
Add glyph advance cache to enhance speed of layout
-rw-r--r-- | src/components/gfx/font.rs | 17 | ||||
-rw-r--r-- | src/components/gfx/platform/android/font.rs | 2 | ||||
-rw-r--r-- | src/components/gfx/platform/linux/font.rs | 2 | ||||
-rw-r--r-- | src/components/gfx/platform/macos/font.rs | 2 | ||||
-rw-r--r-- | src/components/gfx/text/shaping/harfbuzz.rs | 3 |
5 files changed, 16 insertions, 10 deletions
diff --git a/src/components/gfx/font.rs b/src/components/gfx/font.rs index 9dcf7772334..620ad75ac22 100644 --- a/src/components/gfx/font.rs +++ b/src/components/gfx/font.rs @@ -49,7 +49,7 @@ pub trait FontHandleMethods { fn clone_with_style(&self, fctx: &FontContextHandle, style: &UsedFontStyle) -> Result<FontHandle, ()>; fn glyph_index(&self, codepoint: char) -> Option<GlyphIndex>; - fn glyph_h_advance(&self, GlyphIndex) -> Option<FractionalPixel>; + fn glyph_h_advance(&mut self, GlyphIndex) -> Option<FractionalPixel>; fn get_metrics(&self) -> FontMetrics; fn get_table_for_tag(&self, FontTableTag) -> Option<FontTable>; } @@ -244,6 +244,7 @@ pub struct Font { backend: BackendType, profiler_chan: ProfilerChan, shape_cache: HashCache<~str, Arc<GlyphStore>>, + glyph_advance_cache: HashCache<u32, FractionalPixel>, } impl Font { @@ -272,6 +273,7 @@ impl Font { backend: backend, profiler_chan: profiler_chan, shape_cache: HashCache::new(), + glyph_advance_cache: HashCache::new(), }); } @@ -289,6 +291,7 @@ impl Font { backend: backend, profiler_chan: profiler_chan, shape_cache: HashCache::new(), + glyph_advance_cache: HashCache::new(), } } @@ -474,11 +477,13 @@ impl Font { self.handle.glyph_index(codepoint) } - pub fn glyph_h_advance(&self, glyph: GlyphIndex) -> FractionalPixel { - match self.handle.glyph_h_advance(glyph) { - Some(adv) => adv, - None => /* FIXME: Need fallback strategy */ 10f as FractionalPixel - } + pub fn glyph_h_advance(&mut self, glyph: GlyphIndex) -> FractionalPixel { + do self.glyph_advance_cache.find_or_create(&glyph) |glyph| { + match self.handle.glyph_h_advance(*glyph) { + Some(adv) => adv, + None => /* FIXME: Need fallback strategy */ 10f as FractionalPixel + } + } } } diff --git a/src/components/gfx/platform/android/font.rs b/src/components/gfx/platform/android/font.rs index b8b08cc9599..a9e20379757 100644 --- a/src/components/gfx/platform/android/font.rs +++ b/src/components/gfx/platform/android/font.rs @@ -198,7 +198,7 @@ impl FontHandleMethods for FontHandle { } #[fixed_stack_segment] - fn glyph_h_advance(&self, + fn glyph_h_advance(&mut self, glyph: GlyphIndex) -> Option<FractionalPixel> { assert!(self.face.is_not_null()); unsafe { diff --git a/src/components/gfx/platform/linux/font.rs b/src/components/gfx/platform/linux/font.rs index b8b08cc9599..a9e20379757 100644 --- a/src/components/gfx/platform/linux/font.rs +++ b/src/components/gfx/platform/linux/font.rs @@ -198,7 +198,7 @@ impl FontHandleMethods for FontHandle { } #[fixed_stack_segment] - fn glyph_h_advance(&self, + fn glyph_h_advance(&mut self, glyph: GlyphIndex) -> Option<FractionalPixel> { assert!(self.face.is_not_null()); unsafe { diff --git a/src/components/gfx/platform/macos/font.rs b/src/components/gfx/platform/macos/font.rs index 08978c5d063..f38d7600bb9 100644 --- a/src/components/gfx/platform/macos/font.rs +++ b/src/components/gfx/platform/macos/font.rs @@ -147,7 +147,7 @@ impl FontHandleMethods for FontHandle { return Some(glyphs[0] as GlyphIndex); } - fn glyph_h_advance(&self, glyph: GlyphIndex) -> Option<FractionalPixel> { + fn glyph_h_advance(&mut self, glyph: GlyphIndex) -> Option<FractionalPixel> { let glyphs = [glyph as CGGlyph]; let advance = self.ctfont.get_advances_for_glyphs(kCTFontDefaultOrientation, &glyphs[0], diff --git a/src/components/gfx/text/shaping/harfbuzz.rs b/src/components/gfx/text/shaping/harfbuzz.rs index 824ccc73e3e..1e74d80b83c 100644 --- a/src/components/gfx/text/shaping/harfbuzz.rs +++ b/src/components/gfx/text/shaping/harfbuzz.rs @@ -13,6 +13,7 @@ use servo_util::range::Range; use text::util::{float_to_fixed, fixed_to_float, fixed_to_rounded_int}; use std::cast::transmute; +use std::cast; use std::char; use std::libc::{c_uint, c_int, c_void, c_char}; use std::ptr; @@ -509,7 +510,7 @@ extern fn glyph_h_advance_func(_: *hb_font_t, glyph: hb_codepoint_t, _: *c_void) -> hb_position_t { - let font: *Font = font_data as *Font; + let font: *mut Font = unsafe { cast::transmute(font_data as *Font) }; assert!(font.is_not_null()); unsafe { |