diff options
author | Brendan Zabarauskas <bjzaba@yahoo.com.au> | 2014-05-16 13:34:53 -0700 |
---|---|---|
committer | Brendan Zabarauskas <bjzaba@yahoo.com.au> | 2014-05-16 13:34:53 -0700 |
commit | 1f7963e86bc851fba1ca4fa37d56e4d99a7aa19a (patch) | |
tree | 3921ce98189937fa9aa1e8eec477b31b20629abc | |
parent | 868f7501c982a88b925140d28445663c2278fe24 (diff) | |
download | servo-1f7963e86bc851fba1ca4fa37d56e4d99a7aa19a.tar.gz servo-1f7963e86bc851fba1ca4fa37d56e4d99a7aa19a.zip |
Refactor font metric calculation
This splits out the advance calculation and makes it more declarative
-rw-r--r-- | src/components/gfx/text/glyph.rs | 6 | ||||
-rw-r--r-- | src/components/gfx/text/text_run.rs | 28 |
2 files changed, 21 insertions, 13 deletions
diff --git a/src/components/gfx/text/glyph.rs b/src/components/gfx/text/glyph.rs index 09e4c773d00..1ae767f1d06 100644 --- a/src/components/gfx/text/glyph.rs +++ b/src/components/gfx/text/glyph.rs @@ -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 pub fn char_is_space(&self, i: CharIndex) -> bool { assert!(i < CharIndex(self.entry_buffer.len() as int)); diff --git a/src/components/gfx/text/text_run.rs b/src/components/gfx/text/text_run.rs index a61769cdacf..cbea5fbd90e 100644 --- a/src/components/gfx/text/text_run.rs +++ b/src/components/gfx/text/text_run.rs @@ -183,25 +183,27 @@ impl<'a> TextRun { 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 #98): using inter-char and inter-word spacing settings when measuring text - let mut advance = Au(0); - for (glyphs, _offset, slice_range) in self.iter_slices_for_range(range) { - for (_i, glyph) in glyphs.iter_glyphs_for_char_range(&slice_range) { - advance = advance + glyph.advance(); - } - } - RunMetrics::new(advance, self.font_metrics.ascent, self.font_metrics.descent) + self.iter_slices_for_range(range) + .fold(Au(0), |advance, (glyphs, _, slice_range)| { + advance + glyphs.advance_for_char_range(&slice_range) + }) + } + + 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 { - let mut advance = Au(0); - for (_i, glyph) in glyphs.iter_glyphs_for_char_range(slice_range) { - advance = advance + glyph.advance(); - } - RunMetrics::new(advance, self.font_metrics.ascent, self.font_metrics.descent) + RunMetrics::new(glyphs.advance_for_char_range(slice_range), + self.font_metrics.ascent, + self.font_metrics.descent) } + pub fn min_width_for_range(&self, range: &Range<CharIndex>) -> Au { let mut max_piece_width = Au(0); debug!("iterating outer range {:?}", range); |