diff --git a/components/layout_2020/display_list/mod.rs b/components/layout_2020/display_list/mod.rs index e8361ce5e9f..56c9e9610ce 100644 --- a/components/layout_2020/display_list/mod.rs +++ b/components/layout_2020/display_list/mod.rs @@ -87,7 +87,7 @@ impl Fragment { .to_physical(t.parent_style.writing_mode, containing_block) .translate(containing_block.origin.to_vector()); let mut baseline_origin = rect.origin.clone(); - baseline_origin.y += t.ascent; + baseline_origin.y += t.font_metrics.ascent; let glyphs = glyphs(&t.glyphs, baseline_origin); if glyphs.is_empty() { return; diff --git a/components/layout_2020/flow/inline.rs b/components/layout_2020/flow/inline.rs index 9f98174e2cd..05e16457fcb 100644 --- a/components/layout_2020/flow/inline.rs +++ b/components/layout_2020/flow/inline.rs @@ -9,7 +9,7 @@ use crate::flow::FlowLayout; use crate::formatting_contexts::IndependentFormattingContext; use crate::fragments::{ AbsoluteOrFixedPositionedFragment, AnonymousFragment, BoxFragment, CollapsedBlockMargins, - DebugId, Fragment, TextFragment, + DebugId, FontMetrics, Fragment, TextFragment, }; use crate::geom::flow_relative::{Rect, Sides, Vec2}; use crate::positioned::{ @@ -631,8 +631,7 @@ fn layout_atomic( } struct BreakAndShapeResult { - font_ascent: Au, - font_line_gap: Au, + font_metrics: FontMetrics, font_key: FontInstanceKey, runs: Vec, break_at_start: bool, @@ -699,8 +698,7 @@ impl TextRun { ); BreakAndShapeResult { - font_ascent: font.metrics.ascent, - font_line_gap: font.metrics.line_gap, + font_metrics: (&font.metrics).into(), font_key: font.font_key, runs, break_at_start, @@ -712,8 +710,7 @@ impl TextRun { use style::values::generics::text::LineHeight; let BreakAndShapeResult { - font_ascent, - font_line_gap, + font_metrics, font_key, runs, break_at_start: _, @@ -750,7 +747,7 @@ impl TextRun { } } let line_height = match self.parent_style.get_inherited_text().line_height { - LineHeight::Normal => font_line_gap.into(), + LineHeight::Normal => font_metrics.line_gap, LineHeight::Number(n) => font_size * n.0, LineHeight::Length(l) => l.0, }; @@ -775,7 +772,7 @@ impl TextRun { debug_id: DebugId::new(), parent_style: self.parent_style.clone(), rect, - ascent: font_ascent.into(), + font_metrics, font_key, glyphs, })); diff --git a/components/layout_2020/fragments.rs b/components/layout_2020/fragments.rs index 3be702bbf84..5a2a59c8b53 100644 --- a/components/layout_2020/fragments.rs +++ b/components/layout_2020/fragments.rs @@ -7,6 +7,7 @@ use crate::geom::{PhysicalPoint, PhysicalRect}; #[cfg(debug_assertions)] use crate::layout_debug; use crate::positioned::HoistedFragmentId; +use gfx::font::FontMetrics as GfxFontMetrics; use gfx::text::glyph::GlyphStore; use gfx_traits::print_tree::PrintTree; #[cfg(not(debug_assertions))] @@ -86,6 +87,29 @@ pub(crate) struct AnonymousFragment { pub scrollable_overflow: PhysicalRect, } +#[derive(Clone, Copy, Serialize)] +pub(crate) struct FontMetrics { + pub ascent: Length, + pub line_gap: Length, + pub underline_offset: Length, + pub underline_size: Length, + pub strikeout_offset: Length, + pub strikeout_size: Length, +} + +impl From<&GfxFontMetrics> for FontMetrics { + fn from(metrics: &GfxFontMetrics) -> FontMetrics { + FontMetrics { + ascent: metrics.ascent.into(), + line_gap: metrics.line_gap.into(), + underline_offset: metrics.underline_offset.into(), + underline_size: metrics.underline_size.into(), + strikeout_offset: metrics.strikeout_offset.into(), + strikeout_size: metrics.strikeout_size.into(), + } + } +} + #[derive(Serialize)] pub(crate) struct TextFragment { pub debug_id: DebugId, @@ -93,7 +117,7 @@ pub(crate) struct TextFragment { #[serde(skip_serializing)] pub parent_style: ServoArc, pub rect: Rect, - pub ascent: Length, + pub font_metrics: FontMetrics, #[serde(skip_serializing)] pub font_key: FontInstanceKey, pub glyphs: Vec>,