Bug 1371115 - Part 10: implements u8 and array type properties animatable. r?hiro
In this patch. implements following properties:
* background-repeat
* mask-repeat
* text-emphasis-style
* will-change
MozReview-Commit-ID: BENr3zfziyB
--- a/servo/components/style/properties/gecko.mako.rs
+++ b/servo/components/style/properties/gecko.mako.rs
@@ -2855,16 +2855,35 @@ fn static_assert() {
use gecko_bindings::bindings::Gecko_CopyWillChangeFrom;
self.gecko.mWillChangeBitField = other.gecko.mWillChangeBitField;
unsafe {
Gecko_CopyWillChangeFrom(&mut self.gecko, &other.gecko as *const _ as *mut _);
}
}
+ pub fn clone_will_change(&self) -> longhands::will_change::computed_value::T {
+ use properties::longhands::will_change::computed_value::T;
+ use gecko_bindings::structs::nsIAtom;
+ use gecko_string_cache::Atom;
+ use values::CustomIdent;
+
+ if self.gecko.mWillChange.mBuffer.len() == 0 {
+ T::Auto
+ } else {
+ T::AnimateableFeatures(
+ self.gecko.mWillChange.mBuffer.iter().map(|gecko_atom| {
+ CustomIdent(
+ unsafe { Atom::from_addrefed(*gecko_atom as *mut nsIAtom) }
+ )
+ }).collect()
+ )
+ }
+ }
+
<% impl_shape_source("shape_outside", "mShapeOutside") %>
pub fn set_contain(&mut self, v: longhands::contain::computed_value::T) {
use gecko_bindings::structs::NS_STYLE_CONTAIN_NONE;
use gecko_bindings::structs::NS_STYLE_CONTAIN_STRICT;
use gecko_bindings::structs::NS_STYLE_CONTAIN_LAYOUT;
use gecko_bindings::structs::NS_STYLE_CONTAIN_STYLE;
use gecko_bindings::structs::NS_STYLE_CONTAIN_PAINT;
@@ -3071,16 +3090,40 @@ fn static_assert() {
let repeat_x = to_ns(servo.0);
let repeat_y = to_ns(servo.1);
nsStyleImageLayers_Repeat {
mXRepeat: repeat_x,
mYRepeat: repeat_y,
}
</%self:simple_image_array_property>
+ pub fn clone_${shorthand}_repeat(&self) -> longhands::${shorthand}_repeat::computed_value::T {
+ use properties::longhands::${shorthand}_repeat::single_value::computed_value::T;
+ use properties::longhands::${shorthand}_repeat::single_value::computed_value::RepeatKeyword;
+ use gecko_bindings::structs::StyleImageLayerRepeat;
+
+ fn to_servo(repeat: StyleImageLayerRepeat) -> RepeatKeyword {
+ match repeat {
+ StyleImageLayerRepeat::Repeat => RepeatKeyword::Repeat,
+ StyleImageLayerRepeat::Space => RepeatKeyword::Space,
+ StyleImageLayerRepeat::Round => RepeatKeyword::Round,
+ StyleImageLayerRepeat::NoRepeat => RepeatKeyword::NoRepeat,
+ x => panic!("Found unexpected value in style struct for ${shorthand}_repeat property: {:?}", x),
+ }
+ }
+
+ longhands::${shorthand}_repeat::computed_value::T (
+ self.gecko.${image_layers_field}.mLayers.iter()
+ .take(self.gecko.${image_layers_field}.mRepeatCount as usize)
+ .map(|ref layer| {
+ T(to_servo(layer.mRepeat.mXRepeat), to_servo(layer.mRepeat.mYRepeat))
+ }).collect()
+ )
+ }
+
<% impl_simple_image_array_property("clip", shorthand, image_layers_field, "mClip", struct_name) %>
<% impl_simple_image_array_property("origin", shorthand, image_layers_field, "mOrigin", struct_name) %>
% for orientation in ["x", "y"]:
pub fn copy_${shorthand}_position_${orientation}_from(&mut self, other: &Self) {
use gecko_bindings::structs::nsStyleImageLayers_LayerType as LayerType;
let count = other.gecko.${image_layers_field}.mPosition${orientation.upper()}Count;
@@ -3911,16 +3954,43 @@ fn static_assert() {
self.clear_text_emphasis_style_if_string();
if other.gecko.mTextEmphasisStyle == structs::NS_STYLE_TEXT_EMPHASIS_STYLE_STRING as u8 {
self.gecko.mTextEmphasisStyleString
.assign(&*other.gecko.mTextEmphasisStyleString)
}
self.gecko.mTextEmphasisStyle = other.gecko.mTextEmphasisStyle;
}
+ pub fn clone_text_emphasis_style(&self) -> longhands::text_emphasis_style::computed_value::T {
+ use properties::longhands::text_emphasis_style::computed_value::{T, KeywordValue};
+ use properties::longhands::text_emphasis_style::ShapeKeyword;
+
+ if self.gecko.mTextEmphasisStyle == structs::NS_STYLE_TEXT_EMPHASIS_STYLE_NONE as u8 {
+ return T::None;
+ } else if self.gecko.mTextEmphasisStyle == structs::NS_STYLE_TEXT_EMPHASIS_STYLE_STRING as u8 {
+ return T::String(self.gecko.mTextEmphasisStyleString.to_string());
+ }
+
+ let fill = self.gecko.mTextEmphasisStyle & structs::NS_STYLE_TEXT_EMPHASIS_STYLE_OPEN as u8 == 0;
+ let shape =
+ match self.gecko.mTextEmphasisStyle as u32 & !structs::NS_STYLE_TEXT_EMPHASIS_STYLE_OPEN {
+ structs::NS_STYLE_TEXT_EMPHASIS_STYLE_DOT => ShapeKeyword::Dot,
+ structs::NS_STYLE_TEXT_EMPHASIS_STYLE_CIRCLE => ShapeKeyword::Circle,
+ structs::NS_STYLE_TEXT_EMPHASIS_STYLE_DOUBLE_CIRCLE => ShapeKeyword::DoubleCircle,
+ structs::NS_STYLE_TEXT_EMPHASIS_STYLE_TRIANGLE => ShapeKeyword::Triangle,
+ structs::NS_STYLE_TEXT_EMPHASIS_STYLE_SESAME => ShapeKeyword::Sesame,
+ x => panic!("Unexpected value in style struct for text-emphasis-style property: {:?}", x)
+ };
+
+ T::Keyword(KeywordValue {
+ fill: fill,
+ shape: shape
+ })
+ }
+
<%call expr="impl_app_units('_webkit_text_stroke_width', 'mWebkitTextStrokeWidth', need_clone=True)"></%call>
#[allow(non_snake_case)]
pub fn set__moz_tab_size(&mut self, v: longhands::_moz_tab_size::computed_value::T) {
use values::Either;
match v {
Either::Second(number) => {
--- a/servo/components/style/properties/longhand/background.mako.rs
+++ b/servo/components/style/properties/longhand/background.mako.rs
@@ -26,17 +26,17 @@
% for (axis, direction, initial) in [("x", "Horizontal", "left"), ("y", "Vertical", "top")]:
${helpers.predefined_type("background-position-" + axis, "position::" + direction + "Position",
initial_value="computed::LengthOrPercentage::zero()",
initial_specified_value="SpecifiedValue::initial_specified_value()",
spec="https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-" + axis,
animation_value_type="ComputedValue", vector=True, delegate_animate=True)}
% endfor
-<%helpers:vector_longhand name="background-repeat" animation_value_type="none"
+<%helpers:vector_longhand name="background-repeat" animation_value_type="discrete"
spec="https://drafts.csswg.org/css-backgrounds/#the-background-repeat">
use std::fmt;
use style_traits::ToCss;
define_css_keyword_enum!(RepeatKeyword:
"repeat" => Repeat,
"space" => Space,
"round" => Round,
--- a/servo/components/style/properties/longhand/box.mako.rs
+++ b/servo/components/style/properties/longhand/box.mako.rs
@@ -1869,17 +1869,17 @@
"inline block horizontal vertical",
products="gecko",
gecko_ffi_name="mOrient",
gecko_enum_prefix="StyleOrient",
spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-orient)",
gecko_inexhaustive="True",
animation_value_type="discrete")}
-<%helpers:longhand name="will-change" products="gecko" animation_value_type="none"
+<%helpers:longhand name="will-change" products="gecko" animation_value_type="discrete"
spec="https://drafts.csswg.org/css-will-change/#will-change">
use std::fmt;
use style_traits::ToCss;
use values::CustomIdent;
use values::computed::ComputedValueAsSpecified;
impl ComputedValueAsSpecified for SpecifiedValue {}
no_viewport_percentage!(SpecifiedValue);
--- a/servo/components/style/properties/longhand/inherited_text.mako.rs
+++ b/servo/components/style/properties/longhand/inherited_text.mako.rs
@@ -412,18 +412,18 @@
"SimpleShadow",
None,
vector=True,
animation_value_type="AnimatedTextShadowList",
ignored_when_colors_disabled=True,
spec="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property",
)}
-<%helpers:longhand name="text-emphasis-style" products="gecko" need_clone="True" boxed="True"
- animation_value_type="none"
+<%helpers:longhand name="text-emphasis-style" products="gecko" boxed="True"
+ animation_value_type="discrete"
spec="https://drafts.csswg.org/css-text-decor/#propdef-text-emphasis-style">
use computed_values::writing_mode::T as writing_mode;
use std::fmt;
use style_traits::ToCss;
use unicode_segmentation::UnicodeSegmentation;
no_viewport_percentage!(SpecifiedValue);
--- a/servo/components/style/properties/longhand/svg.mako.rs
+++ b/servo/components/style/properties/longhand/svg.mako.rs
@@ -65,17 +65,17 @@
${helpers.single_keyword("mask-mode",
"match-source alpha luminance",
vector=True,
products="gecko",
animation_value_type="discrete",
spec="https://drafts.fxtf.org/css-masking/#propdef-mask-mode")}
-<%helpers:vector_longhand name="mask-repeat" products="gecko" animation_value_type="none" extra_prefixes="webkit"
+<%helpers:vector_longhand name="mask-repeat" products="gecko" animation_value_type="discrete" extra_prefixes="webkit"
spec="https://drafts.fxtf.org/css-masking/#propdef-mask-repeat">
pub use properties::longhands::background_repeat::single_value::parse;
pub use properties::longhands::background_repeat::single_value::SpecifiedValue;
pub use properties::longhands::background_repeat::single_value::computed_value;
pub use properties::longhands::background_repeat::single_value::RepeatKeyword;
#[inline]
pub fn get_initial_value() -> computed_value::T {