Skip to content

Commit

Permalink
Add glyph advance cache to enhance speed of layout
Browse files Browse the repository at this point in the history
  • Loading branch information
deokjinkim committed Oct 3, 2013
1 parent d6d2534 commit 46776e1
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 10 deletions.
17 changes: 11 additions & 6 deletions src/components/gfx/font.rs
Expand Up @@ -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>;
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -272,6 +273,7 @@ impl Font {
backend: backend,
profiler_chan: profiler_chan,
shape_cache: HashCache::new(),
glyph_advance_cache: HashCache::new(),
});
}

Expand All @@ -289,6 +291,7 @@ impl Font {
backend: backend,
profiler_chan: profiler_chan,
shape_cache: HashCache::new(),
glyph_advance_cache: HashCache::new(),
}
}

Expand Down Expand Up @@ -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
}
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/components/gfx/platform/android/font.rs
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/components/gfx/platform/linux/font.rs
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/components/gfx/platform/macos/font.rs
Expand Up @@ -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],
Expand Down
3 changes: 2 additions & 1 deletion src/components/gfx/text/shaping/harfbuzz.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 46776e1

Please sign in to comment.