aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrendan Zabarauskas <bjzaba@yahoo.com.au>2014-05-16 13:34:53 -0700
committerBrendan Zabarauskas <bjzaba@yahoo.com.au>2014-05-16 13:34:53 -0700
commit1f7963e86bc851fba1ca4fa37d56e4d99a7aa19a (patch)
tree3921ce98189937fa9aa1e8eec477b31b20629abc
parent868f7501c982a88b925140d28445663c2278fe24 (diff)
downloadservo-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.rs6
-rw-r--r--src/components/gfx/text/text_run.rs28
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);