Refactor font metric calculation

This splits out the advance calculation and makes it more declarative
This commit is contained in:
Brendan Zabarauskas 2014-05-16 13:34:53 -07:00
parent 868f7501c9
commit 1f7963e86b
2 changed files with 21 additions and 13 deletions

View file

@ -640,6 +640,12 @@ impl<'a> GlyphStore {
} }
} }
#[inline]
pub fn advance_for_char_range(&self, rang: &Range<CharIndex>) -> Au {
self.iter_glyphs_for_char_range(rang)
.fold(Au(0), |advance, (_, glyph)| advance + glyph.advance())
}
// getter methods // getter methods
pub fn char_is_space(&self, i: CharIndex) -> bool { pub fn char_is_space(&self, i: CharIndex) -> bool {
assert!(i < CharIndex(self.entry_buffer.len() as int)); assert!(i < CharIndex(self.entry_buffer.len() as int));

View file

@ -183,25 +183,27 @@ impl<'a> TextRun {
true true
} }
pub fn metrics_for_range(&self, range: &Range<CharIndex>) -> RunMetrics { pub fn advance_for_range(&self, range: &Range<CharIndex>) -> Au {
// TODO(Issue #199): alter advance direction for RTL // TODO(Issue #199): alter advance direction for RTL
// TODO(Issue #98): using inter-char and inter-word spacing settings when measuring text // TODO(Issue #98): using inter-char and inter-word spacing settings when measuring text
let mut advance = Au(0); self.iter_slices_for_range(range)
for (glyphs, _offset, slice_range) in self.iter_slices_for_range(range) { .fold(Au(0), |advance, (glyphs, _, slice_range)| {
for (_i, glyph) in glyphs.iter_glyphs_for_char_range(&slice_range) { advance + glyphs.advance_for_char_range(&slice_range)
advance = advance + glyph.advance(); })
} }
}
RunMetrics::new(advance, self.font_metrics.ascent, self.font_metrics.descent) pub fn metrics_for_range(&self, range: &Range<CharIndex>) -> RunMetrics {
RunMetrics::new(self.advance_for_range(range),
self.font_metrics.ascent,
self.font_metrics.descent)
} }
pub fn metrics_for_slice(&self, glyphs: &GlyphStore, slice_range: &Range<CharIndex>) -> RunMetrics { pub fn metrics_for_slice(&self, glyphs: &GlyphStore, slice_range: &Range<CharIndex>) -> RunMetrics {
let mut advance = Au(0); RunMetrics::new(glyphs.advance_for_char_range(slice_range),
for (_i, glyph) in glyphs.iter_glyphs_for_char_range(slice_range) { self.font_metrics.ascent,
advance = advance + glyph.advance(); self.font_metrics.descent)
}
RunMetrics::new(advance, self.font_metrics.ascent, self.font_metrics.descent)
} }
pub fn min_width_for_range(&self, range: &Range<CharIndex>) -> Au { pub fn min_width_for_range(&self, range: &Range<CharIndex>) -> Au {
let mut max_piece_width = Au(0); let mut max_piece_width = Au(0);
debug!("iterating outer range {:?}", range); debug!("iterating outer range {:?}", range);