Skip to content

Commit

Permalink
style: Use less Au in font code.
Browse files Browse the repository at this point in the history
Font code is the only thing that was using Au in the style system without
interfacing with Gecko, and there was no real reason for it to do so.

This slightly simplifies the code.

Differential Revision: https://phabricator.services.mozilla.com/D57248
  • Loading branch information
emilio committed Dec 16, 2019
1 parent 4cd8813 commit a541046
Show file tree
Hide file tree
Showing 13 changed files with 62 additions and 89 deletions.
10 changes: 5 additions & 5 deletions components/style/font_metrics.rs
Expand Up @@ -8,16 +8,16 @@

use crate::context::SharedStyleContext;
use crate::Atom;
use app_units::Au;
use crate::values::computed::Length;

/// Represents the font metrics that style needs from a font to compute the
/// value of certain CSS units like `ex`.
#[derive(Clone, Debug, Default, PartialEq)]
pub struct FontMetrics {
/// The x-height of the font.
pub x_height: Option<Au>,
pub x_height: Option<Length>,
/// The zero advance. This is usually writing mode dependent
pub zero_advance_measure: Option<Au>,
pub zero_advance_measure: Option<Length>,
}

/// Type of font metrics to retrieve.
Expand Down Expand Up @@ -47,7 +47,7 @@ pub trait FontMetricsProvider {
&self,
font_name: &Atom,
font_family: crate::values::computed::font::GenericFontFamily,
) -> Au;
) -> Length;

/// Construct from a shared style context
fn create_from(context: &SharedStyleContext) -> Self
Expand All @@ -70,7 +70,7 @@ impl FontMetricsProvider for ServoMetricsProvider {
ServoMetricsProvider
}

fn get_size(&self, _: &Atom, _: crate::values::computed::font::GenericFontFamily) -> Au {
fn get_size(&self, _: &Atom, _: crate::values::computed::font::GenericFontFamily) -> Length {
unreachable!("Dummy provider should never be used to compute font size")
}
}
Expand Down
10 changes: 4 additions & 6 deletions components/style/gecko/media_queries.rs
Expand Up @@ -11,10 +11,9 @@ use crate::gecko_bindings::structs;
use crate::media_queries::MediaType;
use crate::properties::ComputedValues;
use crate::string_cache::Atom;
use crate::values::computed::font::FontSize;
use crate::values::specified::font::FONT_MEDIUM_PX;
use crate::values::{CustomIdent, KeyframesName};
use app_units::Au;
use app_units::AU_PER_PX;
use app_units::{Au, AU_PER_PX};
use cssparser::RGBA;
use euclid::default::Size2D;
use euclid::Scale;
Expand Down Expand Up @@ -87,7 +86,7 @@ impl Device {
document,
default_values: ComputedValues::default_values(doc),
// FIXME(bz): Seems dubious?
root_font_size: AtomicIsize::new(FontSize::medium().size().0 as isize),
root_font_size: AtomicIsize::new(Au::from_px(FONT_MEDIUM_PX as i32).0 as isize),
body_text_color: AtomicUsize::new(prefs.mDefaultColor as usize),
used_root_font_size: AtomicBool::new(false),
used_viewport_size: AtomicBool::new(false),
Expand Down Expand Up @@ -139,8 +138,7 @@ impl Device {

/// Set the font size of the root element (for rem)
pub fn set_root_font_size(&self, size: Au) {
self.root_font_size
.store(size.0 as isize, Ordering::Relaxed)
self.root_font_size.store(size.0 as isize, Ordering::Relaxed)
}

/// Sets the body text color for the "inherit color from body" quirk.
Expand Down
13 changes: 7 additions & 6 deletions components/style/gecko/wrapper.rs
Expand Up @@ -68,6 +68,7 @@ use crate::shared_lock::Locked;
use crate::string_cache::{Atom, Namespace, WeakAtom, WeakNamespace};
use crate::stylist::CascadeData;
use crate::values::computed::font::GenericFontFamily;
use crate::values::computed::Length;
use crate::values::specified::length::FontBaseSize;
use crate::CaseSensitivityExt;
use app_units::Au;
Expand Down Expand Up @@ -929,7 +930,7 @@ impl FontMetricsProvider for GeckoFontMetricsProvider {
GeckoFontMetricsProvider::new()
}

fn get_size(&self, font_name: &Atom, font_family: GenericFontFamily) -> Au {
fn get_size(&self, font_name: &Atom, font_family: GenericFontFamily) -> Length {
let mut cache = self.font_size_cache.borrow_mut();
if let Some(sizes) = cache.iter().find(|el| el.0 == *font_name) {
return sizes.1.size_for_generic(font_family);
Expand All @@ -950,7 +951,7 @@ impl FontMetricsProvider for GeckoFontMetricsProvider {
None => return Default::default(),
};

let size = base_size.resolve(context);
let size = Au::from(base_size.resolve(context));
let style = context.style();

let (wm, font) = match base_size {
Expand All @@ -977,9 +978,9 @@ impl FontMetricsProvider for GeckoFontMetricsProvider {
)
};
FontMetrics {
x_height: Some(Au(gecko_metrics.mXSize)),
x_height: Some(Au(gecko_metrics.mXSize).into()),
zero_advance_measure: if gecko_metrics.mChSize >= 0 {
Some(Au(gecko_metrics.mChSize))
Some(Au(gecko_metrics.mChSize).into())
} else {
None
},
Expand All @@ -988,7 +989,7 @@ impl FontMetricsProvider for GeckoFontMetricsProvider {
}

impl structs::FontSizePrefs {
fn size_for_generic(&self, font_family: GenericFontFamily) -> Au {
fn size_for_generic(&self, font_family: GenericFontFamily) -> Length {
Au(match font_family {
GenericFontFamily::None => self.mDefaultVariableSize,
GenericFontFamily::Serif => self.mDefaultSerifSize,
Expand All @@ -999,7 +1000,7 @@ impl structs::FontSizePrefs {
GenericFontFamily::MozEmoji => unreachable!(
"Should never get here, since this doesn't (yet) appear on font family"
),
})
}).into()
}
}

Expand Down
2 changes: 1 addition & 1 deletion components/style/matching.rs
Expand Up @@ -715,7 +715,7 @@ pub trait MatchMethods: TElement {
.map_or(true, |s| s.get_font().clone_font_size() != new_font_size)
{
debug_assert!(self.owner_doc_matches_for_testing(device));
device.set_root_font_size(new_font_size.size());
device.set_root_font_size(new_font_size.size().into());
// If the root font-size changed since last time, and something
// in the document did use rem units, ensure we recascade the
// entire tree.
Expand Down
3 changes: 2 additions & 1 deletion components/style/properties/cascade.rs
Expand Up @@ -743,6 +743,7 @@ impl<'a, 'b: 'a> Cascade<'a, 'b> {
fn recompute_keyword_font_size_if_needed(&mut self) {
use crate::values::computed::ToComputedValue;
use crate::values::specified;
use app_units::Au;

if !self.seen.contains(LonghandId::XLang) &&
!self.seen.contains(LonghandId::FontFamily) {
Expand All @@ -759,7 +760,7 @@ impl<'a, 'b: 'a> Cascade<'a, 'b> {
None => return,
};

if font.gecko().mScriptUnconstrainedSize == new_size.size().0 {
if font.gecko().mScriptUnconstrainedSize == Au::from(new_size.size()).0 {
return;
}

Expand Down
2 changes: 1 addition & 1 deletion components/style/properties/gecko.mako.rs
Expand Up @@ -1134,7 +1134,7 @@ fn static_assert() {
pub fn set_font_size(&mut self, v: FontSize) {
use crate::values::specified::font::KeywordSize;

let size = v.size();
let size = Au::from(v.size());
self.gecko.mScriptUnconstrainedSize = size.0;

// These two may be changed from Cascade::fixup_font_stuff.
Expand Down
4 changes: 2 additions & 2 deletions components/style/servo/media_queries.rs
Expand Up @@ -10,9 +10,9 @@ use crate::media_queries::media_feature::{Evaluator, MediaFeatureDescription};
use crate::media_queries::media_feature_expression::RangeOrOperator;
use crate::media_queries::MediaType;
use crate::properties::ComputedValues;
use crate::values::computed::font::FontSize;
use crate::values::computed::CSSPixelLength;
use crate::values::KeyframesName;
use crate::values::specified::font::FONT_MEDIUM_PX;
use app_units::Au;
use cssparser::RGBA;
use euclid::default::Size2D as UntypedSize2D;
Expand Down Expand Up @@ -68,7 +68,7 @@ impl Device {
viewport_size,
device_pixel_ratio,
// FIXME(bz): Seems dubious?
root_font_size: AtomicIsize::new(FontSize::medium().size().0 as isize),
root_font_size: AtomicIsize::new(Au::from_px(FONT_MEDIUM_PX).0 as isize),
used_root_font_size: AtomicBool::new(false),
used_viewport_units: AtomicBool::new(false),
environment: CssEnvironment,
Expand Down
8 changes: 4 additions & 4 deletions components/style/values/computed/font.rs
Expand Up @@ -21,7 +21,6 @@ use crate::values::specified::font::{
use crate::values::specified::length::{FontBaseSize, NoCalcLength};
use crate::values::CSSFloat;
use crate::Atom;
use app_units::Au;
use byteorder::{BigEndian, ByteOrder};
use cssparser::{serialize_identifier, CssStringWriter, Parser};
#[cfg(feature = "gecko")]
Expand Down Expand Up @@ -148,15 +147,16 @@ impl FontWeight {

impl FontSize {
/// The actual computed font size.
pub fn size(self) -> Au {
self.size.into()
#[inline]
pub fn size(&self) -> Length {
self.size.0
}

#[inline]
/// Get default value of font size.
pub fn medium() -> Self {
Self {
size: Au::from_px(specified::FONT_MEDIUM_PX).into(),
size: NonNegative(Length::new(specified::FONT_MEDIUM_PX as CSSFloat)),
keyword_info: Some(KeywordInfo::medium()),
}
}
Expand Down
2 changes: 1 addition & 1 deletion components/style/values/computed/length.rs
Expand Up @@ -29,7 +29,7 @@ pub use crate::values::specified::url::UrlOrNone;
pub use crate::values::specified::{Angle, BorderStyle, Time};

impl ToComputedValue for specified::NoCalcLength {
type ComputedValue = CSSPixelLength;
type ComputedValue = Length;

#[inline]
fn to_computed_value(&self, context: &Context) -> Self::ComputedValue {
Expand Down
40 changes: 18 additions & 22 deletions components/style/values/specified/font.rs
Expand Up @@ -20,7 +20,6 @@ use crate::values::specified::{AllowQuirks, Angle, Integer, LengthPercentage};
use crate::values::specified::{NoCalcLength, NonNegativeNumber, Number, Percentage};
use crate::values::CustomIdent;
use crate::Atom;
use app_units::Au;
use byteorder::{BigEndian, ByteOrder};
use cssparser::{Parser, Token};
#[cfg(feature = "gecko")]
Expand Down Expand Up @@ -773,18 +772,18 @@ impl ToComputedValue for KeywordSize {
type ComputedValue = NonNegativeLength;
#[inline]
fn to_computed_value(&self, _: &Context) -> NonNegativeLength {
let medium = Length::new(FONT_MEDIUM_PX as f32);
// https://drafts.csswg.org/css-fonts-3/#font-size-prop
match *self {
KeywordSize::XXSmall => Au::from_px(FONT_MEDIUM_PX) * 3 / 5,
KeywordSize::XSmall => Au::from_px(FONT_MEDIUM_PX) * 3 / 4,
KeywordSize::Small => Au::from_px(FONT_MEDIUM_PX) * 8 / 9,
KeywordSize::Medium => Au::from_px(FONT_MEDIUM_PX),
KeywordSize::Large => Au::from_px(FONT_MEDIUM_PX) * 6 / 5,
KeywordSize::XLarge => Au::from_px(FONT_MEDIUM_PX) * 3 / 2,
KeywordSize::XXLarge => Au::from_px(FONT_MEDIUM_PX) * 2,
KeywordSize::XXXLarge => Au::from_px(FONT_MEDIUM_PX) * 3,
}
.into()
NonNegative(match *self {
KeywordSize::XXSmall => medium * 3.0 / 5.0,
KeywordSize::XSmall => medium * 3.0 / 4.0,
KeywordSize::Small => medium * 8.0 / 9.0,
KeywordSize::Medium => medium,
KeywordSize::Large => medium * 6.0 / 5.0,
KeywordSize::XLarge => medium * 3.0 / 2.0,
KeywordSize::XXLarge => medium * 2.0,
KeywordSize::XXXLarge => medium * 3.0,
})
}

#[inline]
Expand All @@ -799,7 +798,6 @@ impl ToComputedValue for KeywordSize {
#[inline]
fn to_computed_value(&self, cx: &Context) -> NonNegativeLength {
use crate::context::QuirksMode;
use crate::values::specified::length::au_to_int_px;

// The tables in this function are originally from
// nsRuleNode::CalcFontPointSize in Gecko:
Expand Down Expand Up @@ -850,22 +848,21 @@ impl ToComputedValue for KeywordSize {
Atom::with(gecko_font.mLanguage.mRawPtr, |atom| {
cx.font_metrics_provider
.get_size(atom, gecko_font.mGenericID)
.0
})
};

let base_size_px = au_to_int_px(base_size as f32);
let base_size_px = base_size.px().round() as i32;
let html_size = self.html_size() as usize;
if base_size_px >= 9 && base_size_px <= 16 {
NonNegative(if base_size_px >= 9 && base_size_px <= 16 {
let mapping = if cx.quirks_mode == QuirksMode::Quirks {
QUIRKS_FONT_SIZE_MAPPING
} else {
FONT_SIZE_MAPPING
};
Au::from_px(mapping[(base_size_px - 9) as usize][html_size]).into()
Length::new(mapping[(base_size_px - 9) as usize][html_size] as f32)
} else {
Au(FONT_SIZE_FACTORS[html_size] * base_size / 100).into()
}
base_size * FONT_SIZE_FACTORS[html_size] as f32 / 100.0
})
}

#[inline]
Expand Down Expand Up @@ -927,7 +924,7 @@ impl FontSize {
// If the parent font was keyword-derived, this is too.
// Tack the % onto the factor
info = compose_keyword(pc.0);
base_size.resolve(context).scale_by(pc.0).into()
base_size.resolve(context) * pc.0
},
FontSize::Length(LengthPercentage::Calc(ref calc)) => {
let parent = context.style().get_parent_font().clone_font_size();
Expand Down Expand Up @@ -964,8 +961,7 @@ impl FontSize {
// others should reject negatives during parsing. But SMIL
// allows parsing negatives, and relies on us _not_ doing that
// clamping. That's so bonkers :(
CSSPixelLength::from(calc.to_used_value(base_size.resolve(context)))
.clamp_to_non_negative()
calc.percentage_relative_to(base_size.resolve(context)).clamp_to_non_negative()
},
FontSize::Keyword(i) => {
// As a specified keyword, this is keyword derived
Expand Down
5 changes: 2 additions & 3 deletions components/style/values/specified/gecko.rs
Expand Up @@ -5,8 +5,7 @@
//! Specified types for legacy Gecko-only properties.

use crate::parser::{Parse, ParserContext};
use crate::values::computed::length::CSSPixelLength;
use crate::values::computed::{self, LengthPercentage};
use crate::values::computed::{self, LengthPercentage, Length};
use crate::values::generics::rect::Rect;
use cssparser::{Parser, Token};
use std::fmt;
Expand All @@ -24,7 +23,7 @@ fn parse_pixel_or_percent<'i, 't>(
value, ref unit, ..
} => {
match_ignore_ascii_case! { unit,
"px" => Ok(LengthPercentage::new(CSSPixelLength::new(value), None)),
"px" => Ok(LengthPercentage::new(Length::new(value), None)),
_ => Err(()),
}
},
Expand Down

0 comments on commit a541046

Please sign in to comment.