mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +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
|
// 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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue