auto merge of #1008 : deokjinkim/servo/glyph_advance_cache, r=jdm

To reduce number of FT_Load_Glyph call, use glyph advance cache.
This commit is contained in:
bors-servo 2013-10-03 02:45:49 -07:00
commit 5d59c00575
5 changed files with 14 additions and 9 deletions

View file

@ -49,7 +49,7 @@ pub trait FontHandleMethods {
fn clone_with_style(&self, fctx: &FontContextHandle, style: &UsedFontStyle) fn clone_with_style(&self, fctx: &FontContextHandle, style: &UsedFontStyle)
-> Result<FontHandle, ()>; -> Result<FontHandle, ()>;
fn glyph_index(&self, codepoint: char) -> Option<GlyphIndex>; 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_metrics(&self) -> FontMetrics;
fn get_table_for_tag(&self, FontTableTag) -> Option<FontTable>; fn get_table_for_tag(&self, FontTableTag) -> Option<FontTable>;
} }
@ -244,6 +244,7 @@ pub struct Font {
backend: BackendType, backend: BackendType,
profiler_chan: ProfilerChan, profiler_chan: ProfilerChan,
shape_cache: HashCache<~str, Arc<GlyphStore>>, shape_cache: HashCache<~str, Arc<GlyphStore>>,
glyph_advance_cache: HashCache<u32, FractionalPixel>,
} }
impl Font { impl Font {
@ -272,6 +273,7 @@ impl Font {
backend: backend, backend: backend,
profiler_chan: profiler_chan, profiler_chan: profiler_chan,
shape_cache: HashCache::new(), shape_cache: HashCache::new(),
glyph_advance_cache: HashCache::new(),
}); });
} }
@ -289,6 +291,7 @@ impl Font {
backend: backend, backend: backend,
profiler_chan: profiler_chan, profiler_chan: profiler_chan,
shape_cache: HashCache::new(), shape_cache: HashCache::new(),
glyph_advance_cache: HashCache::new(),
} }
} }
@ -474,10 +477,12 @@ impl Font {
self.handle.glyph_index(codepoint) self.handle.glyph_index(codepoint)
} }
pub fn glyph_h_advance(&self, glyph: GlyphIndex) -> FractionalPixel { pub fn glyph_h_advance(&mut self, glyph: GlyphIndex) -> FractionalPixel {
match self.handle.glyph_h_advance(glyph) { do self.glyph_advance_cache.find_or_create(&glyph) |glyph| {
Some(adv) => adv, match self.handle.glyph_h_advance(*glyph) {
None => /* FIXME: Need fallback strategy */ 10f as FractionalPixel Some(adv) => adv,
None => /* FIXME: Need fallback strategy */ 10f as FractionalPixel
}
} }
} }
} }

View file

@ -198,7 +198,7 @@ impl FontHandleMethods for FontHandle {
} }
#[fixed_stack_segment] #[fixed_stack_segment]
fn glyph_h_advance(&self, fn glyph_h_advance(&mut self,
glyph: GlyphIndex) -> Option<FractionalPixel> { glyph: GlyphIndex) -> Option<FractionalPixel> {
assert!(self.face.is_not_null()); assert!(self.face.is_not_null());
unsafe { unsafe {

View file

@ -198,7 +198,7 @@ impl FontHandleMethods for FontHandle {
} }
#[fixed_stack_segment] #[fixed_stack_segment]
fn glyph_h_advance(&self, fn glyph_h_advance(&mut self,
glyph: GlyphIndex) -> Option<FractionalPixel> { glyph: GlyphIndex) -> Option<FractionalPixel> {
assert!(self.face.is_not_null()); assert!(self.face.is_not_null());
unsafe { unsafe {

View file

@ -147,7 +147,7 @@ impl FontHandleMethods for FontHandle {
return Some(glyphs[0] as GlyphIndex); 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 glyphs = [glyph as CGGlyph];
let advance = self.ctfont.get_advances_for_glyphs(kCTFontDefaultOrientation, let advance = self.ctfont.get_advances_for_glyphs(kCTFontDefaultOrientation,
&glyphs[0], &glyphs[0],

View file

@ -509,7 +509,7 @@ extern fn glyph_h_advance_func(_: *hb_font_t,
glyph: hb_codepoint_t, glyph: hb_codepoint_t,
_: *c_void) _: *c_void)
-> hb_position_t { -> hb_position_t {
let font: *Font = font_data as *Font; let font: *mut Font = font_data as *mut Font;
assert!(font.is_not_null()); assert!(font.is_not_null());
unsafe { unsafe {