--- a/layout/style/nsStyleConsts.h
+++ b/layout/style/nsStyleConsts.h
@@ -583,16 +583,17 @@ enum class StyleDisplay : uint8_t {
#define NS_STYLE_FONT_SIZE_SMALL 2
#define NS_STYLE_FONT_SIZE_MEDIUM 3
#define NS_STYLE_FONT_SIZE_LARGE 4
#define NS_STYLE_FONT_SIZE_XLARGE 5
#define NS_STYLE_FONT_SIZE_XXLARGE 6
#define NS_STYLE_FONT_SIZE_XXXLARGE 7 // Only used by <font size="7">. Not specifiable in CSS.
#define NS_STYLE_FONT_SIZE_LARGER 8
#define NS_STYLE_FONT_SIZE_SMALLER 9
+#define NS_STYLE_FONT_SIZE_NO_KEYWORD 10 // Used by Servo to track the "no keyword" case
// See nsStyleFont
// We should eventually stop using the NS_STYLE_* variants here.
#define NS_STYLE_FONT_STRETCH_ULTRA_CONDENSED NS_FONT_STRETCH_ULTRA_CONDENSED
#define NS_STYLE_FONT_STRETCH_EXTRA_CONDENSED NS_FONT_STRETCH_EXTRA_CONDENSED
#define NS_STYLE_FONT_STRETCH_CONDENSED NS_FONT_STRETCH_CONDENSED
#define NS_STYLE_FONT_STRETCH_SEMI_CONDENSED NS_FONT_STRETCH_SEMI_CONDENSED
#define NS_STYLE_FONT_STRETCH_NORMAL NS_FONT_STRETCH_NORMAL
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -106,16 +106,19 @@ safe_strcmp(const char16_t* a, const cha
static bool AreShadowArraysEqual(nsCSSShadowArray* lhs, nsCSSShadowArray* rhs);
// --------------------
// nsStyleFont
//
nsStyleFont::nsStyleFont(const nsFont& aFont, const nsPresContext* aContext)
: mFont(aFont)
, mSize(nsStyleFont::ZoomText(aContext, mFont.size))
+ , mFontSizeFactor(1.0)
+ , mFontSizeOffset(0)
+ , mFontSizeKeyword(NS_STYLE_FONT_SIZE_MEDIUM)
, mGenericID(kGenericFont_NONE)
, mScriptLevel(0)
, mMathVariant(NS_MATHML_MATHVARIANT_NONE)
, mMathDisplay(NS_MATHML_DISPLAYSTYLE_INLINE)
, mMinFontSizeRatio(100) // 100%
, mExplicitLanguage(false)
, mAllowZoom(true)
, mScriptUnconstrainedSize(mSize)
@@ -126,16 +129,19 @@ nsStyleFont::nsStyleFont(const nsFont& a
{
MOZ_COUNT_CTOR(nsStyleFont);
mFont.size = mSize;
}
nsStyleFont::nsStyleFont(const nsStyleFont& aSrc)
: mFont(aSrc.mFont)
, mSize(aSrc.mSize)
+ , mFontSizeFactor(aSrc.mFontSizeFactor)
+ , mFontSizeOffset(aSrc.mFontSizeOffset)
+ , mFontSizeKeyword(aSrc.mFontSizeKeyword)
, mGenericID(aSrc.mGenericID)
, mScriptLevel(aSrc.mScriptLevel)
, mMathVariant(aSrc.mMathVariant)
, mMathDisplay(aSrc.mMathDisplay)
, mMinFontSizeRatio(aSrc.mMinFontSizeRatio)
, mExplicitLanguage(aSrc.mExplicitLanguage)
, mAllowZoom(aSrc.mAllowZoom)
, mScriptUnconstrainedSize(aSrc.mScriptUnconstrainedSize)
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -193,16 +193,24 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
nsFont mFont; // [inherited]
nscoord mSize; // [inherited] Our "computed size". Can be different
// from mFont.size which is our "actual size" and is
// enforced to be >= the user's preferred min-size.
// mFont.size should be used for display purposes
// while mSize is the value to return in
// getComputedStyle() for example.
+
+ // In stylo these three track whether the size is keyword-derived
+ // and if so if it has been modified by a factor/offset
+ float mFontSizeFactor;
+ nscoord mFontSizeOffset;
+ uint8_t mFontSizeKeyword; // NS_STYLE_FONT_SIZE_*, is NS_STYLE_FONT_SIZE_NO_KEYWORD
+ // when not keyword-derived
+
uint8_t mGenericID; // [inherited] generic CSS font family, if any;
// value is a kGenericFont_* constant, see nsFont.h.
// MathML scriptlevel support
int8_t mScriptLevel; // [inherited]
// MathML mathvariant support
uint8_t mMathVariant; // [inherited]
// MathML displaystyle support
--- a/servo/components/style/gecko/generated/structs_debug.rs
+++ b/servo/components/style/gecko/generated/structs_debug.rs
@@ -435,16 +435,17 @@ pub mod root {
pub const NS_STYLE_FONT_SIZE_SMALL: ::std::os::raw::c_uint = 2;
pub const NS_STYLE_FONT_SIZE_MEDIUM: ::std::os::raw::c_uint = 3;
pub const NS_STYLE_FONT_SIZE_LARGE: ::std::os::raw::c_uint = 4;
pub const NS_STYLE_FONT_SIZE_XLARGE: ::std::os::raw::c_uint = 5;
pub const NS_STYLE_FONT_SIZE_XXLARGE: ::std::os::raw::c_uint = 6;
pub const NS_STYLE_FONT_SIZE_XXXLARGE: ::std::os::raw::c_uint = 7;
pub const NS_STYLE_FONT_SIZE_LARGER: ::std::os::raw::c_uint = 8;
pub const NS_STYLE_FONT_SIZE_SMALLER: ::std::os::raw::c_uint = 9;
+ pub const NS_STYLE_FONT_SIZE_NO_KEYWORD: ::std::os::raw::c_uint = 10;
pub const NS_STYLE_FONT_STRETCH_ULTRA_CONDENSED: ::std::os::raw::c_int =
-4;
pub const NS_STYLE_FONT_STRETCH_EXTRA_CONDENSED: ::std::os::raw::c_int =
-3;
pub const NS_STYLE_FONT_STRETCH_CONDENSED: ::std::os::raw::c_int = -2;
pub const NS_STYLE_FONT_STRETCH_SEMI_CONDENSED: ::std::os::raw::c_int =
-1;
pub const NS_STYLE_FONT_STRETCH_NORMAL: ::std::os::raw::c_uint = 0;
@@ -4523,17 +4524,17 @@ pub mod root {
}
#[repr(C)]
#[derive(Debug)]
pub struct GeckoFont {
pub gecko: root::nsStyleFont,
}
#[test]
fn bindgen_test_layout_GeckoFont() {
- assert_eq!(::std::mem::size_of::<GeckoFont>() , 120usize , concat
+ assert_eq!(::std::mem::size_of::<GeckoFont>() , 128usize , concat
! ( "Size of: " , stringify ! ( GeckoFont ) ));
assert_eq! (::std::mem::align_of::<GeckoFont>() , 8usize , concat
! ( "Alignment of " , stringify ! ( GeckoFont ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoFont ) ) . gecko as * const
_ as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! ( GeckoFont ) ,
"::" , stringify ! ( gecko ) ));
@@ -12642,100 +12643,118 @@ pub mod root {
/// RestyleManager::RestyleHintToString.
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct nsRestyleHint(pub u32);
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleFont {
pub mFont: root::nsFont,
pub mSize: root::nscoord,
+ pub mFontSizeFactor: f32,
+ pub mFontSizeOffset: root::nscoord,
+ pub mFontSizeKeyword: u8,
pub mGenericID: u8,
pub mScriptLevel: i8,
pub mMathVariant: u8,
pub mMathDisplay: u8,
pub mMinFontSizeRatio: u8,
pub mExplicitLanguage: bool,
pub mAllowZoom: bool,
pub mScriptUnconstrainedSize: root::nscoord,
pub mScriptMinSize: root::nscoord,
pub mScriptSizeMultiplier: f32,
pub mLanguage: root::nsCOMPtr<root::nsIAtom>,
}
pub const nsStyleFont_kHasFinishStyle: bool = false;
#[test]
fn bindgen_test_layout_nsStyleFont() {
- assert_eq!(::std::mem::size_of::<nsStyleFont>() , 120usize , concat !
+ assert_eq!(::std::mem::size_of::<nsStyleFont>() , 128usize , concat !
( "Size of: " , stringify ! ( nsStyleFont ) ));
assert_eq! (::std::mem::align_of::<nsStyleFont>() , 8usize , concat !
( "Alignment of " , stringify ! ( nsStyleFont ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mFont as * const _
as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mFont ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mSize as * const _
as usize } , 88usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mSize ) ));
assert_eq! (unsafe {
+ & ( * ( 0 as * const nsStyleFont ) ) . mFontSizeFactor as
+ * const _ as usize } , 92usize , concat ! (
+ "Alignment of field: " , stringify ! ( nsStyleFont ) ,
+ "::" , stringify ! ( mFontSizeFactor ) ));
+ assert_eq! (unsafe {
+ & ( * ( 0 as * const nsStyleFont ) ) . mFontSizeOffset as
+ * const _ as usize } , 96usize , concat ! (
+ "Alignment of field: " , stringify ! ( nsStyleFont ) ,
+ "::" , stringify ! ( mFontSizeOffset ) ));
+ assert_eq! (unsafe {
+ & ( * ( 0 as * const nsStyleFont ) ) . mFontSizeKeyword as
+ * const _ as usize } , 100usize , concat ! (
+ "Alignment of field: " , stringify ! ( nsStyleFont ) ,
+ "::" , stringify ! ( mFontSizeKeyword ) ));
+ assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mGenericID as *
- const _ as usize } , 92usize , concat ! (
+ const _ as usize } , 101usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mGenericID ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mScriptLevel as *
- const _ as usize } , 93usize , concat ! (
+ const _ as usize } , 102usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptLevel ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mMathVariant as *
- const _ as usize } , 94usize , concat ! (
+ const _ as usize } , 103usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mMathVariant ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mMathDisplay as *
- const _ as usize } , 95usize , concat ! (
+ const _ as usize } , 104usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mMathDisplay ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mMinFontSizeRatio
- as * const _ as usize } , 96usize , concat ! (
+ as * const _ as usize } , 105usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mMinFontSizeRatio ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mExplicitLanguage
- as * const _ as usize } , 97usize , concat ! (
+ as * const _ as usize } , 106usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mExplicitLanguage ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mAllowZoom as *
- const _ as usize } , 98usize , concat ! (
+ const _ as usize } , 107usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mAllowZoom ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) .
mScriptUnconstrainedSize as * const _ as usize } ,
- 100usize , concat ! (
+ 108usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptUnconstrainedSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mScriptMinSize as *
- const _ as usize } , 104usize , concat ! (
+ const _ as usize } , 112usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptMinSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) .
- mScriptSizeMultiplier as * const _ as usize } , 108usize ,
+ mScriptSizeMultiplier as * const _ as usize } , 116usize ,
concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptSizeMultiplier ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mLanguage as *
- const _ as usize } , 112usize , concat ! (
+ const _ as usize } , 120usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mLanguage ) ));
}
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleColor {
pub mColor: root::nscolor,
}
--- a/servo/components/style/gecko/generated/structs_release.rs
+++ b/servo/components/style/gecko/generated/structs_release.rs
@@ -435,16 +435,17 @@ pub mod root {
pub const NS_STYLE_FONT_SIZE_SMALL: ::std::os::raw::c_uint = 2;
pub const NS_STYLE_FONT_SIZE_MEDIUM: ::std::os::raw::c_uint = 3;
pub const NS_STYLE_FONT_SIZE_LARGE: ::std::os::raw::c_uint = 4;
pub const NS_STYLE_FONT_SIZE_XLARGE: ::std::os::raw::c_uint = 5;
pub const NS_STYLE_FONT_SIZE_XXLARGE: ::std::os::raw::c_uint = 6;
pub const NS_STYLE_FONT_SIZE_XXXLARGE: ::std::os::raw::c_uint = 7;
pub const NS_STYLE_FONT_SIZE_LARGER: ::std::os::raw::c_uint = 8;
pub const NS_STYLE_FONT_SIZE_SMALLER: ::std::os::raw::c_uint = 9;
+ pub const NS_STYLE_FONT_SIZE_NO_KEYWORD: ::std::os::raw::c_uint = 10;
pub const NS_STYLE_FONT_STRETCH_ULTRA_CONDENSED: ::std::os::raw::c_int =
-4;
pub const NS_STYLE_FONT_STRETCH_EXTRA_CONDENSED: ::std::os::raw::c_int =
-3;
pub const NS_STYLE_FONT_STRETCH_CONDENSED: ::std::os::raw::c_int = -2;
pub const NS_STYLE_FONT_STRETCH_SEMI_CONDENSED: ::std::os::raw::c_int =
-1;
pub const NS_STYLE_FONT_STRETCH_NORMAL: ::std::os::raw::c_uint = 0;
@@ -4443,17 +4444,17 @@ pub mod root {
}
#[repr(C)]
#[derive(Debug)]
pub struct GeckoFont {
pub gecko: root::nsStyleFont,
}
#[test]
fn bindgen_test_layout_GeckoFont() {
- assert_eq!(::std::mem::size_of::<GeckoFont>() , 120usize , concat
+ assert_eq!(::std::mem::size_of::<GeckoFont>() , 128usize , concat
! ( "Size of: " , stringify ! ( GeckoFont ) ));
assert_eq! (::std::mem::align_of::<GeckoFont>() , 8usize , concat
! ( "Alignment of " , stringify ! ( GeckoFont ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const GeckoFont ) ) . gecko as * const
_ as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! ( GeckoFont ) ,
"::" , stringify ! ( gecko ) ));
@@ -12489,100 +12490,118 @@ pub mod root {
/// RestyleManager::RestyleHintToString.
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct nsRestyleHint(pub u32);
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleFont {
pub mFont: root::nsFont,
pub mSize: root::nscoord,
+ pub mFontSizeFactor: f32,
+ pub mFontSizeOffset: root::nscoord,
+ pub mFontSizeKeyword: u8,
pub mGenericID: u8,
pub mScriptLevel: i8,
pub mMathVariant: u8,
pub mMathDisplay: u8,
pub mMinFontSizeRatio: u8,
pub mExplicitLanguage: bool,
pub mAllowZoom: bool,
pub mScriptUnconstrainedSize: root::nscoord,
pub mScriptMinSize: root::nscoord,
pub mScriptSizeMultiplier: f32,
pub mLanguage: root::nsCOMPtr,
}
pub const nsStyleFont_kHasFinishStyle: bool = false;
#[test]
fn bindgen_test_layout_nsStyleFont() {
- assert_eq!(::std::mem::size_of::<nsStyleFont>() , 120usize , concat !
+ assert_eq!(::std::mem::size_of::<nsStyleFont>() , 128usize , concat !
( "Size of: " , stringify ! ( nsStyleFont ) ));
assert_eq! (::std::mem::align_of::<nsStyleFont>() , 8usize , concat !
( "Alignment of " , stringify ! ( nsStyleFont ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mFont as * const _
as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mFont ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mSize as * const _
as usize } , 88usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mSize ) ));
assert_eq! (unsafe {
+ & ( * ( 0 as * const nsStyleFont ) ) . mFontSizeFactor as
+ * const _ as usize } , 92usize , concat ! (
+ "Alignment of field: " , stringify ! ( nsStyleFont ) ,
+ "::" , stringify ! ( mFontSizeFactor ) ));
+ assert_eq! (unsafe {
+ & ( * ( 0 as * const nsStyleFont ) ) . mFontSizeOffset as
+ * const _ as usize } , 96usize , concat ! (
+ "Alignment of field: " , stringify ! ( nsStyleFont ) ,
+ "::" , stringify ! ( mFontSizeOffset ) ));
+ assert_eq! (unsafe {
+ & ( * ( 0 as * const nsStyleFont ) ) . mFontSizeKeyword as
+ * const _ as usize } , 100usize , concat ! (
+ "Alignment of field: " , stringify ! ( nsStyleFont ) ,
+ "::" , stringify ! ( mFontSizeKeyword ) ));
+ assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mGenericID as *
- const _ as usize } , 92usize , concat ! (
+ const _ as usize } , 101usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mGenericID ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mScriptLevel as *
- const _ as usize } , 93usize , concat ! (
+ const _ as usize } , 102usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptLevel ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mMathVariant as *
- const _ as usize } , 94usize , concat ! (
+ const _ as usize } , 103usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mMathVariant ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mMathDisplay as *
- const _ as usize } , 95usize , concat ! (
+ const _ as usize } , 104usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mMathDisplay ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mMinFontSizeRatio
- as * const _ as usize } , 96usize , concat ! (
+ as * const _ as usize } , 105usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mMinFontSizeRatio ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mExplicitLanguage
- as * const _ as usize } , 97usize , concat ! (
+ as * const _ as usize } , 106usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mExplicitLanguage ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mAllowZoom as *
- const _ as usize } , 98usize , concat ! (
+ const _ as usize } , 107usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mAllowZoom ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) .
mScriptUnconstrainedSize as * const _ as usize } ,
- 100usize , concat ! (
+ 108usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptUnconstrainedSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mScriptMinSize as *
- const _ as usize } , 104usize , concat ! (
+ const _ as usize } , 112usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptMinSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) .
- mScriptSizeMultiplier as * const _ as usize } , 108usize ,
+ mScriptSizeMultiplier as * const _ as usize } , 116usize ,
concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mScriptSizeMultiplier ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleFont ) ) . mLanguage as *
- const _ as usize } , 112usize , concat ! (
+ const _ as usize } , 120usize , concat ! (
"Alignment of field: " , stringify ! ( nsStyleFont ) ,
"::" , stringify ! ( mLanguage ) ));
}
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleColor {
pub mColor: root::nscolor,
}
--- a/servo/components/style/properties/gecko.mako.rs
+++ b/servo/components/style/properties/gecko.mako.rs
@@ -2162,18 +2162,37 @@ fn static_assert() {
pub fn unzoom_fonts(&mut self, device: &Device) {
self.gecko.mSize = device.unzoom_text(Au(self.gecko.mSize)).0;
self.gecko.mScriptUnconstrainedSize = device.unzoom_text(Au(self.gecko.mScriptUnconstrainedSize)).0;
self.gecko.mFont.size = device.unzoom_text(Au(self.gecko.mFont.size)).0;
}
pub fn set_font_size(&mut self, v: longhands::font_size::computed_value::T) {
+ use self::longhands::font_size::KeywordSize;
self.gecko.mSize = v.size().0;
self.gecko.mScriptUnconstrainedSize = v.size().0;
+ if let Some(info) = v.info {
+ self.gecko.mFontSizeKeyword = match info.kw {
+ KeywordSize::XXSmall => structs::NS_STYLE_FONT_SIZE_XXSMALL,
+ KeywordSize::XSmall => structs::NS_STYLE_FONT_SIZE_XSMALL,
+ KeywordSize::Small => structs::NS_STYLE_FONT_SIZE_SMALL,
+ KeywordSize::Medium => structs::NS_STYLE_FONT_SIZE_MEDIUM,
+ KeywordSize::Large => structs::NS_STYLE_FONT_SIZE_LARGE,
+ KeywordSize::XLarge => structs::NS_STYLE_FONT_SIZE_XLARGE,
+ KeywordSize::XXLarge => structs::NS_STYLE_FONT_SIZE_XXLARGE,
+ KeywordSize::XXXLarge => structs::NS_STYLE_FONT_SIZE_XXXLARGE,
+ } as u8;
+ self.gecko.mFontSizeFactor = info.factor;
+ self.gecko.mFontSizeOffset = info.offset.0.to_i32_au();
+ } else {
+ self.gecko.mFontSizeKeyword = structs::NS_STYLE_FONT_SIZE_NO_KEYWORD as u8;
+ self.gecko.mFontSizeFactor = 1.;
+ self.gecko.mFontSizeOffset = 0;
+ }
}
/// Set font size, taking into account scriptminsize and scriptlevel
/// Returns Some(size) if we have to recompute the script unconstrained size
pub fn apply_font_size(&mut self, v: longhands::font_size::computed_value::T,
parent: &Self,
device: &Device) -> Option<NonNegativeLength> {
let (adjusted_size, adjusted_unconstrained_size) =
@@ -2322,40 +2341,79 @@ fn static_assert() {
// ruletree walk on the Gecko side in nsRuleNode::SetGenericFont
// and instead using extra bookkeeping in the mSize and mScriptUnconstrainedSize
// values, and reusing those instead of font_size_keyword.
// In the case that MathML has given us an adjusted size, apply it.
// Keep track of the unconstrained adjusted size.
self.gecko.mSize = adjusted_size.0;
+
+ // Technically the MathML constrained size may also be keyword-derived
+ // but we ignore this since it would be too complicated
+ // to correctly track and it's mostly unnecessary.
+ self.gecko.mFontSizeKeyword = structs::NS_STYLE_FONT_SIZE_NO_KEYWORD as u8;
+ self.gecko.mFontSizeFactor = 1.;
+ self.gecko.mFontSizeOffset = 0;
+
self.gecko.mScriptUnconstrainedSize = adjusted_unconstrained_size.0;
self.fixup_font_min_size(device);
false
} else if let Some(size) = kw_inherited_size {
// Parent element was a keyword-derived size.
self.gecko.mSize = size.0.to_i32_au();
+ // Copy keyword info over.
+ self.gecko.mFontSizeFactor = parent.gecko.mFontSizeFactor;
+ self.gecko.mFontSizeOffset = parent.gecko.mFontSizeOffset;
+ self.gecko.mFontSizeKeyword = parent.gecko.mFontSizeKeyword;
// MathML constraints didn't apply here, so we can ignore this.
self.gecko.mScriptUnconstrainedSize = size.0.to_i32_au();
self.fixup_font_min_size(device);
true
} else {
// MathML isn't affecting us, and our parent element does not
// have a keyword-derived size. Set things normally.
self.gecko.mSize = parent.gecko.mSize;
+ // copy keyword info over
+ self.gecko.mFontSizeKeyword = structs::NS_STYLE_FONT_SIZE_NO_KEYWORD as u8;
+ self.gecko.mFontSizeFactor = 1.;
+ self.gecko.mFontSizeOffset = 0;
self.gecko.mScriptUnconstrainedSize = parent.gecko.mScriptUnconstrainedSize;
self.fixup_font_min_size(device);
false
}
}
pub fn clone_font_size(&self) -> longhands::font_size::computed_value::T {
+ use self::longhands::font_size::KeywordSize;
+ let size = Au(self.gecko.mSize).into();
+ let kw = match self.gecko.mFontSizeKeyword as u32 {
+ structs::NS_STYLE_FONT_SIZE_XXSMALL => KeywordSize::XXSmall,
+ structs::NS_STYLE_FONT_SIZE_XSMALL => KeywordSize::XSmall,
+ structs::NS_STYLE_FONT_SIZE_SMALL => KeywordSize::Small,
+ structs::NS_STYLE_FONT_SIZE_MEDIUM => KeywordSize::Medium,
+ structs::NS_STYLE_FONT_SIZE_LARGE => KeywordSize::Large,
+ structs::NS_STYLE_FONT_SIZE_XLARGE => KeywordSize::XLarge,
+ structs::NS_STYLE_FONT_SIZE_XXLARGE => KeywordSize::XXLarge,
+ structs::NS_STYLE_FONT_SIZE_XXXLARGE => KeywordSize::XXXLarge,
+ structs::NS_STYLE_FONT_SIZE_NO_KEYWORD => {
+ return longhands::font_size::computed_value::T {
+ size: size,
+ info: None,
+ }
+ }
+ _ => unreachable!("mFontSizeKeyword should be an absolute keyword or NO_KEYWORD")
+ };
longhands::font_size::computed_value::T {
- size: Au(self.gecko.mSize).into(),
- info: None, // XXXManishearth this is a placeholder
+ size: size,
+ info: Some(longhands::font_size::computed_value::KeywordInfo {
+ kw: kw,
+ factor: self.gecko.mFontSizeFactor,
+ offset: Au(self.gecko.mFontSizeOffset).into()
+ })
}
}
pub fn set_font_weight(&mut self, v: longhands::font_weight::computed_value::T) {
self.gecko.mFont.weight = v.0;
}
${impl_simple_copy('font_weight', 'mFont.weight')}