mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Refactor font metric calculation
This splits out the advance calculation and makes it more declarative
This commit is contained in:
parent
868f7501c9
commit
1f7963e86b
2 changed files with 21 additions and 13 deletions
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue