From 367c0a4b436575b275dd562a660014569289b4bc Mon Sep 17 00:00:00 2001 From: Daisuke Akatsuka Date: Fri, 9 Jun 2017 18:34:45 +0900 Subject: [PATCH] Implements numeric field type properties animatable --- components/style/properties/gecko.mako.rs | 60 +++++++++++++------ .../style/properties/longhand/border.mako.rs | 2 +- .../style/properties/longhand/font.mako.rs | 16 ++++- .../style/properties/longhand/text.mako.rs | 2 +- .../style/properties/longhand/ui.mako.rs | 17 +++++- .../style/properties/longhand/xul.mako.rs | 2 +- 6 files changed, 77 insertions(+), 22 deletions(-) diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index f6f28924721..7d1a7344345 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -1017,17 +1017,19 @@ fn static_assert() { % endfor } + <% + border_image_repeat_keywords = ["Stretch", "Repeat", "Round", "Space"] + %> + pub fn set_border_image_repeat(&mut self, v: longhands::border_image_repeat::computed_value::T) { use properties::longhands::border_image_repeat::computed_value::RepeatKeyword; - use gecko_bindings::structs::{NS_STYLE_BORDER_IMAGE_REPEAT_STRETCH, NS_STYLE_BORDER_IMAGE_REPEAT_REPEAT}; - use gecko_bindings::structs::{NS_STYLE_BORDER_IMAGE_REPEAT_ROUND, NS_STYLE_BORDER_IMAGE_REPEAT_SPACE}; + use gecko_bindings::structs; % for i, side in enumerate(["H", "V"]): let k = match v.${i} { - RepeatKeyword::Stretch => NS_STYLE_BORDER_IMAGE_REPEAT_STRETCH, - RepeatKeyword::Repeat => NS_STYLE_BORDER_IMAGE_REPEAT_REPEAT, - RepeatKeyword::Round => NS_STYLE_BORDER_IMAGE_REPEAT_ROUND, - RepeatKeyword::Space => NS_STYLE_BORDER_IMAGE_REPEAT_SPACE, + % for keyword in border_image_repeat_keywords: + RepeatKeyword::${keyword} => structs::NS_STYLE_BORDER_IMAGE_REPEAT_${keyword.upper()}, + % endfor }; self.gecko.mBorderImageRepeat${side} = k as u8; @@ -1039,6 +1041,21 @@ fn static_assert() { self.gecko.mBorderImageRepeatV = other.gecko.mBorderImageRepeatV; } + pub fn clone_border_image_repeat(&self) -> longhands::border_image_repeat::computed_value::T { + use properties::longhands::border_image_repeat::computed_value::RepeatKeyword; + use gecko_bindings::structs; + + % for side in ["H", "V"]: + let servo_${side.lower()} = match self.gecko.mBorderImageRepeat${side} as u32 { + % for keyword in border_image_repeat_keywords: + structs::NS_STYLE_BORDER_IMAGE_REPEAT_${keyword.upper()} => RepeatKeyword::${keyword}, + % endfor + x => panic!("Found unexpected value in mBorderImageRepeat${side}: {:?}", x), + }; + % endfor + longhands::border_image_repeat::computed_value::T(servo_h, servo_v) + } + pub fn set_border_image_width(&mut self, v: longhands::border_image_width::computed_value::T) { use values::generics::border::BorderImageSideWidth; @@ -1806,10 +1823,7 @@ fn static_assert() { } } - pub fn set_font_language_override(&mut self, v: longhands::font_language_override::computed_value::T) { - self.gecko.mFont.languageOverride = v.0; - } - ${impl_simple_copy('font_language_override', 'mFont.languageOverride')} + <% impl_simple_type_with_conversion("font_language_override", "mFont.languageOverride") %> pub fn set_font_variant_alternates(&mut self, v: longhands::font_variant_alternates::computed_value::T) { self.gecko.mFont.variantAlternates = v.to_gecko_keyword() @@ -3711,7 +3725,7 @@ fn static_assert() { self.gecko.mTextEmphasisStyle = other.gecko.mTextEmphasisStyle; } - <%call expr="impl_app_units('_webkit_text_stroke_width', 'mWebkitTextStrokeWidth', need_clone=False)"> + <%call expr="impl_app_units('_webkit_text_stroke_width', 'mWebkitTextStrokeWidth', need_clone=True)"> #[allow(non_snake_case)] pub fn set__moz_tab_size(&mut self, v: longhands::_moz_tab_size::computed_value::T) { @@ -3824,6 +3838,18 @@ fn static_assert() { self.gecko.mInitialLetterSink = other.gecko.mInitialLetterSink; } + pub fn clone_initial_letter(&self) -> longhands::initial_letter::computed_value::T { + use values::generics::text::InitialLetter; + + if self.gecko.mInitialLetterSize == 0. && self.gecko.mInitialLetterSink == 0 { + InitialLetter::Normal + } else if self.gecko.mInitialLetterSize.floor() as i32 == self.gecko.mInitialLetterSink { + InitialLetter::Specified(self.gecko.mInitialLetterSize, None) + } else { + InitialLetter::Specified(self.gecko.mInitialLetterSize, Some(self.gecko.mInitialLetterSink)) + } + } + #[inline] pub fn has_underline(&self) -> bool { (self.gecko.mTextDecorationLine & (structs::NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE as u8)) != 0 @@ -4377,12 +4403,7 @@ clip-path <%self:impl_trait style_struct_name="UI" skip_longhands="-moz-force-broken-image-icon"> - #[allow(non_snake_case)] - pub fn set__moz_force_broken_image_icon(&mut self, v: longhands::_moz_force_broken_image_icon::computed_value::T) { - self.gecko.mForceBrokenImageIcon = v.0 as u8; - } - - ${impl_simple_copy("_moz_force_broken_image_icon", "mForceBrokenImageIcon")} + ${impl_simple_type_with_conversion("_moz_force_broken_image_icon", "mForceBrokenImageIcon")} <%self:impl_trait style_struct_name="XUL" @@ -4393,6 +4414,11 @@ clip-path } ${impl_simple_copy("_moz_box_ordinal_group", "mBoxOrdinal")} + + #[allow(non_snake_case)] + pub fn clone__moz_box_ordinal_group(&self) -> i32{ + self.gecko.mBoxOrdinal as i32 + } <%def name="define_ffi_struct_accessor(style_struct)"> diff --git a/components/style/properties/longhand/border.mako.rs b/components/style/properties/longhand/border.mako.rs index 0fd7196baf5..36bedc41754 100644 --- a/components/style/properties/longhand/border.mako.rs +++ b/components/style/properties/longhand/border.mako.rs @@ -212,7 +212,7 @@ ${helpers.predefined_type("border-image-outset", "LengthOrNumberRect", animation_value_type="none", boxed=True)} -<%helpers:longhand name="border-image-repeat" animation_value_type="none" +<%helpers:longhand name="border-image-repeat" animation_value_type="discrete" spec="https://drafts.csswg.org/css-backgrounds/#border-image-repeat"> use std::fmt; use style_traits::ToCss; diff --git a/components/style/properties/longhand/font.mako.rs b/components/style/properties/longhand/font.mako.rs index cf2d9b8d7ec..6c7e940ba12 100644 --- a/components/style/properties/longhand/font.mako.rs +++ b/components/style/properties/longhand/font.mako.rs @@ -1929,7 +1929,7 @@ https://drafts.csswg.org/css-fonts-4/#low-level-font-variation-settings-control- } -<%helpers:longhand name="font-language-override" products="gecko" animation_value_type="none" +<%helpers:longhand name="font-language-override" products="gecko" animation_value_type="discrete" extra_prefixes="moz" boxed="True" spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-language-override"> use properties::longhands::system_font::SystemFont; @@ -2066,6 +2066,20 @@ https://drafts.csswg.org/css-fonts-4/#low-level-font-variation-settings-control- }) } } + + #[cfg(feature = "gecko")] + impl From for computed_value::T { + fn from(bits: u32) -> computed_value::T { + computed_value::T(bits) + } + } + + #[cfg(feature = "gecko")] + impl From for u32 { + fn from(v: computed_value::T) -> u32 { + v.0 + } + } <%helpers:longhand name="-x-lang" products="gecko" animation_value_type="none" internal="True" diff --git a/components/style/properties/longhand/text.mako.rs b/components/style/properties/longhand/text.mako.rs index 0e384c8d93a..53d8fde8831 100644 --- a/components/style/properties/longhand/text.mako.rs +++ b/components/style/properties/longhand/text.mako.rs @@ -293,6 +293,6 @@ ${helpers.predefined_type( "InitialLetter", "computed::InitialLetter::normal()", initial_specified_value="specified::InitialLetter::normal()", - animation_value_type="none", + animation_value_type="discrete", products="gecko", spec="https://drafts.csswg.org/css-inline/#sizing-drop-initials")} diff --git a/components/style/properties/longhand/ui.mako.rs b/components/style/properties/longhand/ui.mako.rs index e06a6feb41c..21a349db959 100644 --- a/components/style/properties/longhand/ui.mako.rs +++ b/components/style/properties/longhand/ui.mako.rs @@ -42,7 +42,7 @@ ${helpers.single_keyword("-moz-window-shadow", "none default menu tooltip sheet" <%helpers:longhand name="-moz-force-broken-image-icon" products="gecko" - animation_value_type="none" + animation_value_type="discrete" spec="None (Nonstandard Firefox-only property)"> use std::fmt; use style_traits::ToCss; @@ -83,4 +83,19 @@ ${helpers.single_keyword("-moz-window-shadow", "none default menu tooltip sheet" _ => Err(()), } } + + impl From for SpecifiedValue { + fn from(bits: u8) -> SpecifiedValue { + SpecifiedValue(bits == 1) + } + } + + impl From for u8 { + fn from(v: SpecifiedValue) -> u8 { + match v.0 { + true => 1u8, + false => 0u8, + } + } + } diff --git a/components/style/properties/longhand/xul.mako.rs b/components/style/properties/longhand/xul.mako.rs index 9573a2a6c38..5d9ec6623e2 100644 --- a/components/style/properties/longhand/xul.mako.rs +++ b/components/style/properties/longhand/xul.mako.rs @@ -59,5 +59,5 @@ ${helpers.predefined_type("-moz-box-ordinal-group", "Integer", "0", products="gecko", alias="-webkit-box-ordinal-group", gecko_ffi_name="mBoxOrdinal", - animation_value_type="none", + animation_value_type="discrete", spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-box-ordinal-group)")}