From ce9640a48e11c797d24263a7c1fffe12594a4aef Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 19 Aug 2016 15:53:03 +0530 Subject: [PATCH 01/10] Support possibly-vector keyword properties --- components/style/properties/helpers.mako.rs | 26 ++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index acb4504eea9..1f6ed3125c4 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -285,8 +285,11 @@ } -<%def name="single_keyword(name, values, **kwargs)"> - <%call expr="single_keyword_computed(name, values, **kwargs)"> +<%def name="maybe_vector_longhand(name, maybe, **kwargs)"> + + +<%def name="single_keyword(name, values, vector=False, **kwargs)"> + <%call expr="single_keyword_computed(name, values, vector, **kwargs)"> use values::computed::ComputedValueAsSpecified; use values::NoViewportPercentage; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -294,16 +297,16 @@ -<%def name="single_keyword_computed(name, values, **kwargs)"> +<%def name="single_keyword_computed(name, values, vector=False, **kwargs)"> <% keyword_kwargs = {a: kwargs.pop(a, None) for a in [ 'gecko_constant_prefix', 'gecko_enum_prefix', 'extra_gecko_values', 'extra_servo_values', ]} %> - <%call expr="longhand(name, keyword=Keyword(name, values, **keyword_kwargs), **kwargs)"> + + <%def name="inner_body()"> pub use self::computed_value::T as SpecifiedValue; - ${caller.body()} pub mod computed_value { define_css_keyword_enum! { T: % for value in data.longhands_by_name[name].keyword.values_for(product): @@ -320,7 +323,18 @@ -> Result { computed_value::T::parse(input) } - + + % if vector: + <%call expr="vector_longhand(name, keyword=Keyword(name, values, **keyword_kwargs), **kwargs)"> + ${inner_body()} + ${caller.body()} + + % else: + <%call expr="longhand(name, keyword=Keyword(name, values, **keyword_kwargs), **kwargs)"> + ${inner_body()} + ${caller.body()} + + % endif <%def name="keyword_list(name, values, **kwargs)"> From 65a8a8dccb51f0d45eff52aa566a6a900c33c849 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 19 Aug 2016 17:09:41 +0530 Subject: [PATCH 02/10] Make most background- properties handle arrays --- components/style/properties/gecko.mako.rs | 121 +++++++++--------- components/style/properties/helpers.mako.rs | 5 +- .../properties/longhand/background.mako.rs | 8 ++ .../sugar/ns_style_auto_array.rs | 5 +- 4 files changed, 72 insertions(+), 67 deletions(-) diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 2c7e6f0ea1a..e58727fae67 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -937,6 +937,32 @@ fn static_assert() { +<%def name="simple_background_array_property(name, field_name)"> + pub fn copy_background_${name}_from(&mut self, other: &Self) { + unsafe { + Gecko_EnsureImageLayersLength(&mut self.gecko.mImage, other.gecko.mImage.mLayers.len()); + } + for (layer, other) in self.gecko.mImage.mLayers.iter_mut() + .zip(other.gecko.mImage.mLayers.iter()) + .take(other.gecko.mImage.${field_name}Count) { + layer.${field_name} = other.${field_name}; + } + self.gecko.mImage.${field_name}Count = other.gecko.mImage.${field_name}Count; + } + + pub fn set_background_${name}(&mut self, v: longhands::background_${name}::computed_value::T) { + unsafe { + Gecko_EnsureImageLayersLength(&mut self.gecko.mImage, v.0.len()); + } + + self.gecko.mImage.${field_name}Count = v.0.len() as u32; + for (servo, geckolayer) in v.0.into_iter().zip(self.gecko.mImage.mLayers.iter_mut()) { + geckolayer.${field_name} = { + ${caller.body()} + }; + } + } + // TODO: Gecko accepts lists in most background-related properties. We just use // the first element (which is the common case), but at some point we want to // add support for parsing these lists in servo and pushing to nsTArray's. @@ -950,86 +976,57 @@ fn static_assert() { <% impl_color("background_color", "mBackgroundColor", need_clone=True) %> - pub fn copy_background_repeat_from(&mut self, other: &Self) { - self.gecko.mImage.mRepeatCount = cmp::min(1, other.gecko.mImage.mRepeatCount); - self.gecko.mImage.mLayers.mFirstElement.mRepeat = - other.gecko.mImage.mLayers.mFirstElement.mRepeat; - } - - pub fn set_background_repeat(&mut self, v: longhands::background_repeat::computed_value::T) { - use properties::longhands::background_repeat::computed_value::T; - use gecko_bindings::structs::{NS_STYLE_IMAGELAYER_REPEAT_REPEAT, NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT}; + <%self:simple_background_array_property name="repeat" field_name="mRepeat"> + use properties::longhands::background_repeat::single_value::computed_value::T; use gecko_bindings::structs::nsStyleImageLayers_Repeat; - let (repeat_x, repeat_y) = match v { - T::repeat_x => (NS_STYLE_IMAGELAYER_REPEAT_REPEAT, - NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT), - T::repeat_y => (NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT, - NS_STYLE_IMAGELAYER_REPEAT_REPEAT), - T::repeat => (NS_STYLE_IMAGELAYER_REPEAT_REPEAT, + use gecko_bindings::structs::NS_STYLE_IMAGELAYER_REPEAT_REPEAT; + use gecko_bindings::structs::NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT; + + let (repeat_x, repeat_y) = match servo { + T::repeat_x => (NS_STYLE_IMAGELAYER_REPEAT_REPEAT, + NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT), + T::repeat_y => (NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT, NS_STYLE_IMAGELAYER_REPEAT_REPEAT), - T::no_repeat => (NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT, - NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT), + T::repeat => (NS_STYLE_IMAGELAYER_REPEAT_REPEAT, + NS_STYLE_IMAGELAYER_REPEAT_REPEAT), + T::no_repeat => (NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT, + NS_STYLE_IMAGELAYER_REPEAT_NO_REPEAT), }; + nsStyleImageLayers_Repeat { + mXRepeat: repeat_x as u8, + mYRepeat: repeat_y as u8, + } + - self.gecko.mImage.mRepeatCount = 1; - self.gecko.mImage.mLayers.mFirstElement.mRepeat = nsStyleImageLayers_Repeat { - mXRepeat: repeat_x as u8, - mYRepeat: repeat_y as u8, - }; - } + <%self:simple_background_array_property name="clip" field_name="mClip"> + use properties::longhands::background_clip::single_value::computed_value::T; - pub fn copy_background_clip_from(&mut self, other: &Self) { - self.gecko.mImage.mClipCount = cmp::min(1, other.gecko.mImage.mClipCount); - self.gecko.mImage.mLayers.mFirstElement.mClip = - other.gecko.mImage.mLayers.mFirstElement.mClip; - } - - pub fn set_background_clip(&mut self, v: longhands::background_clip::computed_value::T) { - use properties::longhands::background_clip::computed_value::T; - self.gecko.mImage.mClipCount = 1; - - // TODO: Gecko supports background-clip: text, but just on -webkit- - // prefixed properties. - self.gecko.mImage.mLayers.mFirstElement.mClip = match v { + match servo { T::border_box => structs::NS_STYLE_IMAGELAYER_CLIP_BORDER as u8, T::padding_box => structs::NS_STYLE_IMAGELAYER_CLIP_PADDING as u8, T::content_box => structs::NS_STYLE_IMAGELAYER_CLIP_CONTENT as u8, - }; - } + } + - pub fn copy_background_origin_from(&mut self, other: &Self) { - self.gecko.mImage.mOriginCount = cmp::min(1, other.gecko.mImage.mOriginCount); - self.gecko.mImage.mLayers.mFirstElement.mOrigin = - other.gecko.mImage.mLayers.mFirstElement.mOrigin; - } + <%self:simple_background_array_property name="origin" field_name="mOrigin"> + use properties::longhands::background_origin::single_value::computed_value::T; - pub fn set_background_origin(&mut self, v: longhands::background_origin::computed_value::T) { - use properties::longhands::background_origin::computed_value::T; - - self.gecko.mImage.mOriginCount = 1; - self.gecko.mImage.mLayers.mFirstElement.mOrigin = match v { + match servo { T::border_box => structs::NS_STYLE_IMAGELAYER_ORIGIN_BORDER as u8, T::padding_box => structs::NS_STYLE_IMAGELAYER_ORIGIN_PADDING as u8, T::content_box => structs::NS_STYLE_IMAGELAYER_ORIGIN_CONTENT as u8, - }; - } + } + - pub fn copy_background_attachment_from(&mut self, other: &Self) { - self.gecko.mImage.mAttachmentCount = cmp::min(1, other.gecko.mImage.mAttachmentCount); - self.gecko.mImage.mLayers.mFirstElement.mAttachment = - other.gecko.mImage.mLayers.mFirstElement.mAttachment; - } + <%self:simple_background_array_property name="attachment" field_name="mAttachment"> + use properties::longhands::background_attachment::single_value::computed_value::T; - pub fn set_background_attachment(&mut self, v: longhands::background_attachment::computed_value::T) { - use properties::longhands::background_attachment::computed_value::T; - - self.gecko.mImage.mAttachmentCount = 1; - self.gecko.mImage.mLayers.mFirstElement.mAttachment = match v { + match servo { T::scroll => structs::NS_STYLE_IMAGELAYER_ATTACHMENT_SCROLL as u8, T::fixed => structs::NS_STYLE_IMAGELAYER_ATTACHMENT_FIXED as u8, T::local => structs::NS_STYLE_IMAGELAYER_ATTACHMENT_LOCAL as u8, - }; - } + } + pub fn copy_background_position_from(&mut self, other: &Self) { self.gecko.mImage.mPositionXCount = cmp::min(1, other.gecko.mImage.mPositionXCount); diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index 1f6ed3125c4..ae08f79b293 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -285,9 +285,6 @@ } -<%def name="maybe_vector_longhand(name, maybe, **kwargs)"> - - <%def name="single_keyword(name, values, vector=False, **kwargs)"> <%call expr="single_keyword_computed(name, values, vector, **kwargs)"> use values::computed::ComputedValueAsSpecified; @@ -304,7 +301,7 @@ 'extra_gecko_values', 'extra_servo_values', ]} %> - + <%def name="inner_body()"> pub use self::computed_value::T as SpecifiedValue; pub mod computed_value { diff --git a/components/style/properties/longhand/background.mako.rs b/components/style/properties/longhand/background.mako.rs index c36e6e63e74..3b72d1cc0ef 100644 --- a/components/style/properties/longhand/background.mako.rs +++ b/components/style/properties/longhand/background.mako.rs @@ -107,18 +107,26 @@ ${helpers.predefined_type("background-color", "CSSColor", ${helpers.single_keyword("background-repeat", "repeat repeat-x repeat-y no-repeat", + vector=True, + gecko_only=True, animatable=False)} ${helpers.single_keyword("background-attachment", "scroll fixed" + (" local" if product == "gecko" else ""), + vector=True, + gecko_only=True, animatable=False)} ${helpers.single_keyword("background-clip", "border-box padding-box content-box", + vector=True, + gecko_only=True, animatable=False)} ${helpers.single_keyword("background-origin", "padding-box border-box content-box", + vector=True, + gecko_only=True, animatable=False)} <%helpers:longhand name="background-size" animatable="True"> diff --git a/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs b/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs index 43728fd979d..b81aa51df52 100644 --- a/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs +++ b/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs @@ -3,13 +3,16 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use std::iter::{once, Chain, Once, IntoIterator}; -use std::slice::IterMut; +use std::slice::{Iter, IterMut}; use structs::nsStyleAutoArray; impl nsStyleAutoArray { pub fn iter_mut(&mut self) -> Chain, IterMut> { once(&mut self.mFirstElement).chain(self.mOtherElements.iter_mut()) } + pub fn iter(&self) -> Chain, Iter> { + once(&self.mFirstElement).chain(self.mOtherElements.iter()) + } // Note that often structs containing autoarrays will have // additional member fields that contain the length, which must be kept From 979a2798d5ae140e447f4a0b3720ac1fe9eb3f03 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 19 Aug 2016 18:25:23 +0530 Subject: [PATCH 03/10] Make Position a gecko-only vector longhand --- components/servo/Cargo.lock | 1 + components/style/Cargo.toml | 1 + components/style/lib.rs | 1 + components/style/properties/gecko.mako.rs | 47 ++++++++++++++----- .../helpers/animated_properties.mako.rs | 43 ++++++++++++----- .../properties/longhand/background.mako.rs | 46 ++++++++++++++++-- ports/cef/Cargo.lock | 1 + ports/geckolib/Cargo.lock | 9 ++++ 8 files changed, 123 insertions(+), 26 deletions(-) diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 2d8398feda0..c6da44feb70 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -2225,6 +2225,7 @@ dependencies = [ "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "ordered-float 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", diff --git a/components/style/Cargo.toml b/components/style/Cargo.toml index 4f0d53cce20..daceb3178d1 100644 --- a/components/style/Cargo.toml +++ b/components/style/Cargo.toml @@ -34,6 +34,7 @@ heapsize_plugin = {version = "0.1.2", optional = true} lazy_static = "0.2" log = "0.3.5" matches = "0.1" +num-integer = "0.1.32" num-traits = "0.1.32" ordered-float = "0.2.2" quickersort = "2.0.0" diff --git a/components/style/lib.rs b/components/style/lib.rs index 3386f812186..6ccf57f2df6 100644 --- a/components/style/lib.rs +++ b/components/style/lib.rs @@ -56,6 +56,7 @@ extern crate log; #[allow(unused_extern_crates)] #[macro_use] extern crate matches; +extern crate num_integer; extern crate num_traits; extern crate ordered_float; extern crate quickersort; diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index e58727fae67..f076c9a5905 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -944,7 +944,7 @@ fn static_assert() { } for (layer, other) in self.gecko.mImage.mLayers.iter_mut() .zip(other.gecko.mImage.mLayers.iter()) - .take(other.gecko.mImage.${field_name}Count) { + .take(other.gecko.mImage.${field_name}Count as usize) { layer.${field_name} = other.${field_name}; } self.gecko.mImage.${field_name}Count = other.gecko.mImage.${field_name}Count; @@ -1033,23 +1033,48 @@ fn static_assert() { self.gecko.mImage.mPositionYCount = cmp::min(1, other.gecko.mImage.mPositionYCount); self.gecko.mImage.mLayers.mFirstElement.mPosition = other.gecko.mImage.mLayers.mFirstElement.mPosition; + unsafe { + Gecko_EnsureImageLayersLength(&mut self.gecko.mImage, other.gecko.mImage.mLayers.len()); + } + for (layer, other) in self.gecko.mImage.mLayers.iter_mut() + .zip(other.gecko.mImage.mLayers.iter()) + .take(other.gecko.mImage.mPositionXCount as usize) { + layer.mPosition.mXPosition = other.mPosition.mXPosition; + } + for (layer, other) in self.gecko.mImage.mLayers.iter_mut() + .zip(other.gecko.mImage.mLayers.iter()) + .take(other.gecko.mImage.mPositionYCount as usize) { + layer.mPosition.mYPosition = other.mPosition.mYPosition; + } + self.gecko.mImage.mPositionXCount = other.gecko.mImage.mPositionXCount; + self.gecko.mImage.mPositionYCount = other.gecko.mImage.mPositionYCount; } pub fn clone_background_position(&self) -> longhands::background_position::computed_value::T { use values::computed::position::Position; - let position = &self.gecko.mImage.mLayers.mFirstElement.mPosition; - Position { - horizontal: position.mXPosition.into(), - vertical: position.mYPosition.into(), - } + longhands::background_position::computed_value::T( + self.gecko.mImage.mLayers.iter() + .take(self.gecko.mImage.mPositionXCount as usize) + .take(self.gecko.mImage.mPositionYCount as usize) + .map(|position| Position { + horizontal: position.mPosition.mXPosition.into(), + vertical: position.mPosition.mYPosition.into(), + }) + .collect() + ) } pub fn set_background_position(&mut self, v: longhands::background_position::computed_value::T) { - let position = &mut self.gecko.mImage.mLayers.mFirstElement.mPosition; - position.mXPosition = v.horizontal.into(); - position.mYPosition = v.vertical.into(); - self.gecko.mImage.mPositionXCount = 1; - self.gecko.mImage.mPositionYCount = 1; + unsafe { + Gecko_EnsureImageLayersLength(&mut self.gecko.mImage, v.0.len()); + } + + self.gecko.mImage.mPositionXCount = v.0.len() as u32; + self.gecko.mImage.mPositionYCount = v.0.len() as u32; + for (servo, geckolayer) in v.0.into_iter().zip(self.gecko.mImage.mLayers.iter_mut()) { + geckolayer.mPosition.mXPosition = servo.horizontal.into(); + geckolayer.mPosition.mYPosition = servo.vertical.into(); + } } pub fn copy_background_image_from(&mut self, other: &Self) { diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index a45b68b6816..6eb79de97e3 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -155,6 +155,25 @@ pub trait Interpolate: Sized { fn interpolate(&self, other: &Self, time: f64) -> Result; } +/// https://drafts.csswg.org/css-transitions/#animtype-repeatable-list +pub trait RepeatableListInterpolate: Interpolate {} + +impl Interpolate for Vec { + fn interpolate(&self, other: &Self, time: f64) -> Result { + use num_integer::lcm; + let len = lcm(self.len(), other.len()); + let ret = self.iter().cycle().zip(other.iter().cycle()) + .take(len) + .filter_map(|(ref me, ref you)| { + me.interpolate(you, time).ok() + }).collect::(); + if ret.len() == len { + Ok(ret) + } else { + Err(()) + } + } +} /// https://drafts.csswg.org/css-transitions/#animtype-number impl Interpolate for Au { #[inline] @@ -296,6 +315,14 @@ impl Interpolate for BorderSpacing { } } +impl Interpolate for BackgroundSize { + #[inline] + fn interpolate(&self, other: &Self, time: f64) -> Result { + self.0.interpolate(&other.0, time).map(BackgroundSize) + } +} + + /// https://drafts.csswg.org/css-transitions/#animtype-color impl Interpolate for RGBA { #[inline] @@ -496,18 +523,12 @@ impl Interpolate for Position { } } -impl Interpolate for BackgroundSize { +impl RepeatableListInterpolate for Position {} + +impl Interpolate for BackgroundPosition { + #[inline] fn interpolate(&self, other: &Self, time: f64) -> Result { - use properties::longhands::background_size::computed_value::ExplicitSize; - match (self, other) { - (&BackgroundSize::Explicit(ref me), &BackgroundSize::Explicit(ref other)) => { - Ok(BackgroundSize::Explicit(ExplicitSize { - width: try!(me.width.interpolate(&other.width, time)), - height: try!(me.height.interpolate(&other.height, time)), - })) - } - _ => Err(()), - } + Ok(BackgroundPosition(try!(self.0.interpolate(&other.0, time)))) } } diff --git a/components/style/properties/longhand/background.mako.rs b/components/style/properties/longhand/background.mako.rs index 3b72d1cc0ef..fbf4c8c3fd4 100644 --- a/components/style/properties/longhand/background.mako.rs +++ b/components/style/properties/longhand/background.mako.rs @@ -54,6 +54,10 @@ ${helpers.predefined_type("background-color", "CSSColor", pub fn get_initial_value() -> computed_value::T { computed_value::T(None) } + #[inline] + pub fn get_initial_specified_value() -> SpecifiedValue { + SpecifiedValue(None) + } pub fn parse(context: &ParserContext, input: &mut Parser) -> Result { if input.try(|input| input.expect_ident_matching("none")).is_ok() { Ok(SpecifiedValue(None)) @@ -75,7 +79,7 @@ ${helpers.predefined_type("background-color", "CSSColor", } -<%helpers:longhand name="background-position" animatable="True"> +<%helpers:vector_longhand name="background-position" gecko_only="True" animatable="True"> use cssparser::ToCss; use std::fmt; use values::LocalToCss; @@ -84,6 +88,7 @@ ${helpers.predefined_type("background-color", "CSSColor", pub mod computed_value { use values::computed::position::Position; + use properties::animated_properties::{Interpolate, RepeatableListInterpolate}; pub type T = Position; } @@ -98,12 +103,20 @@ ${helpers.predefined_type("background-color", "CSSColor", vertical: computed::LengthOrPercentage::Percentage(0.0), } } + #[inline] + pub fn get_initial_specified_value() -> SpecifiedValue { + use values::specified::Percentage; + Position { + horizontal: specified::LengthOrPercentage::Percentage(Percentage(0.0)), + vertical: specified::LengthOrPercentage::Percentage(Percentage(0.0)), + } + } pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result { Ok(try!(Position::parse(input))) } - + ${helpers.single_keyword("background-repeat", "repeat repeat-x repeat-y no-repeat", @@ -129,7 +142,7 @@ ${helpers.single_keyword("background-origin", gecko_only=True, animatable=False)} -<%helpers:longhand name="background-size" animatable="True"> +<%helpers:vector_longhand name="background-size" animatable="True"> use cssparser::{ToCss, Token}; use std::ascii::AsciiExt; use std::fmt; @@ -137,6 +150,7 @@ ${helpers.single_keyword("background-origin", pub mod computed_value { use values::computed::LengthOrPercentageOrAuto; + use properties::animated_properties::{Interpolate, RepeatableListInterpolate}; #[derive(PartialEq, Clone, Debug)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] @@ -152,6 +166,23 @@ ${helpers.single_keyword("background-origin", Cover, Contain, } + + impl RepeatableListInterpolate for T {} + + impl Interpolate for T { + fn interpolate(&self, other: &Self, time: f64) -> Result { + use properties::longhands::background_size::single_value::computed_value::ExplicitSize; + match (self, other) { + (&T::Explicit(ref me), &T::Explicit(ref other)) => { + Ok(T::Explicit(ExplicitSize { + width: try!(me.width.interpolate(&other.width, time)), + height: try!(me.height.interpolate(&other.height, time)), + })) + } + _ => Err(()), + } + } + } } impl ToCss for computed_value::T { @@ -245,6 +276,13 @@ ${helpers.single_keyword("background-origin", height: computed::LengthOrPercentageOrAuto::Auto, }) } + #[inline] + pub fn get_initial_specified_value() -> SpecifiedValue { + SpecifiedValue::Explicit(SpecifiedExplicitSize { + width: specified::LengthOrPercentageOrAuto::Auto, + height: specified::LengthOrPercentageOrAuto::Auto, + }) + } pub fn parse(_: &ParserContext, input: &mut Parser) -> Result { let width; @@ -282,4 +320,4 @@ ${helpers.single_keyword("background-origin", height: height, })) } - + diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 341e24b7b19..12c50e327ec 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -2108,6 +2108,7 @@ dependencies = [ "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "ordered-float 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "plugins 0.0.1", diff --git a/ports/geckolib/Cargo.lock b/ports/geckolib/Cargo.lock index d29ee9a5347..69baaa7d7d3 100644 --- a/ports/geckolib/Cargo.lock +++ b/ports/geckolib/Cargo.lock @@ -234,6 +234,14 @@ dependencies = [ "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-integer" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.1.35" @@ -363,6 +371,7 @@ dependencies = [ "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "ordered-float 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "quickersort 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", From 66cdf9ae4f0bf37f65b24eb653025bc3616d642c Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 19 Aug 2016 21:27:36 +0530 Subject: [PATCH 04/10] Support serializing vector backgrounds in shorthand form --- components/style/properties/helpers.mako.rs | 4 + .../properties/shorthand/background.mako.rs | 304 ++++++++++-------- .../properties/shorthand/outline.mako.rs | 4 +- 3 files changed, 176 insertions(+), 136 deletions(-) diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index ae08f79b293..532095bc00d 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -316,6 +316,10 @@ computed_value::T::${to_rust_ident(values.split()[0])} } #[inline] + pub fn get_initial_specified_value() -> SpecifiedValue { + get_initial_value() + } + #[inline] pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result { computed_value::T::parse(input) diff --git a/components/style/properties/shorthand/background.mako.rs b/components/style/properties/shorthand/background.mako.rs index 853e5554937..a7dff5047b3 100644 --- a/components/style/properties/shorthand/background.mako.rs +++ b/components/style/properties/shorthand/background.mako.rs @@ -12,172 +12,208 @@ use properties::longhands::{background_image, background_size, background_origin, background_clip}; pub fn parse_value(context: &ParserContext, input: &mut Parser) -> Result { - let mut color = None; - let mut image = None; - let mut position = None; - let mut repeat = None; - let mut size = None; - let mut attachment = None; - let mut any = false; - let mut origin = None; - let mut clip = None; + % for name in "image position repeat size attachment origin clip".split(): + let mut any_${name} = false; + % endfor - loop { - if position.is_none() { - if let Ok(value) = input.try(|input| background_position::parse(context, input)) { - position = Some(value); - any = true; + let mut background_color = None; + let vec = try!(input.parse_comma_separated(|input| { + % for name in "image position repeat size attachment origin clip".split(): + let mut ${name} = None; + % endfor - // Parse background size, if applicable. - size = input.try(|input| { - try!(input.expect_delim('/')); - background_size::parse(context, input) - }).ok(); + loop { + if background_color.is_none() { + if let Ok(value) = input.try(|input| background_color::parse(context, input)) { + background_color = Some(value); + continue + } + } else { + // color can only be the last element + return Err(()) + } + if position.is_none() { + if let Ok(value) = input.try(|input| background_position::single_value::parse(context, input)) { + position = Some(value); + any_position = true; - continue + // Parse background size, if applicable. + size = input.try(|input| { + try!(input.expect_delim('/')); + background_size::single_value::parse(context, input) + }).ok(); + if let Some(_) = size { + any_size = true; + } + + continue + } } + % for name in "image repeat attachment origin clip".split(): + if ${name}.is_none() { + if let Ok(value) = input.try(|input| background_${name}::single_value::parse(context, input)) { + ${name} = Some(value); + any_${name} = true; + continue + } + } + % endfor + break } - if color.is_none() { - if let Ok(value) = input.try(|input| background_color::parse(context, input)) { - color = Some(value); - any = true; - continue - } - } - if image.is_none() { - if let Ok(value) = input.try(|input| background_image::parse(context, input)) { - image = Some(value); - any = true; - continue - } - } - if repeat.is_none() { - if let Ok(value) = input.try(|input| background_repeat::parse(context, input)) { - repeat = Some(value); - any = true; - continue - } - } - if attachment.is_none() { - if let Ok(value) = input.try(|input| background_attachment::parse(context, input)) { - attachment = Some(value); - any = true; - continue - } - } - if origin.is_none() { - if let Ok(value) = input.try(|input| background_origin::parse(context, input)) { - origin = Some(value); - any = true; - continue - } - } - if clip.is_none() { - if let Ok(value) = input.try(|input| background_clip::parse(context, input)) { - clip = Some(value); - any = true; - continue - } - } - break + Ok((image, position, repeat, size, attachment, origin, clip)) + })); + + if !(any_image || any_position || any_repeat || any_size || + any_attachment || any_origin || any_clip || + background_color.is_some()) { + return Err(()) } - if any { - Ok(Longhands { - background_color: color, - background_image: image, - background_position: position, - background_repeat: repeat, - background_attachment: attachment, - background_size: size, - background_origin: origin, - background_clip: clip, - }) - } else { - Err(()) + % for name in "image position repeat size attachment origin clip".split(): + let mut background_${name} = if any_${name} { + Some(background_${name}::SpecifiedValue(Vec::new())) + } else { + None + }; + % endfor + + for i in vec { + % for i,name in enumerate("image position repeat size attachment origin clip".split()): + if let Some(ref mut buf) = background_${name} { + if let Some(bg_${name}) = i.${i} { + buf.0.push(bg_${name}) + } else { + buf.0.push(background_${name}::single_value::get_initial_specified_value()) + } + } + % endfor } + + Ok(Longhands { + background_color: background_color, + background_image: background_image, + background_position: background_position, + background_repeat: background_repeat, + background_attachment: background_attachment, + background_size: background_size, + background_origin: background_origin, + background_clip: background_clip, + }) } impl<'a> ToCss for LonghandsToSerialize<'a> { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - match *self.background_color { - DeclaredValue::Value(ref color) => { - try!(color.to_css(dest)); - }, - _ => { - try!(write!(dest, "transparent")); + // mako doesn't like ampersands following `<` + fn extract_value(x: &DeclaredValue) -> Option< &T> { + match *x { + DeclaredValue::Value(ref val) => Some(val), + _ => None, } - }; + } + use std::cmp; + use std::iter::{once, repeat}; + let mut len = 0; + % for name in "image position repeat size attachment origin clip".split(): + len = cmp::max(len, extract_value(self.background_${name}).map(|i| i.0.len()) + .unwrap_or(0)); + % endfor - try!(write!(dest, " ")); + let iter = repeat(None).take(len - 1).chain(once(Some(self.background_color))) + % for name in "image position repeat size attachment origin clip".split(): + .zip(extract_value(self.background_${name}).into_iter() + .flat_map(|x| x.0.iter()) + .map(Some).chain(repeat(None))) + % endfor + ; + let mut first = true; + for (((((((color, image), position), repeat), size), attachment), origin), clip) in iter { + if first { + first = false; + } else { + try!(write!(dest, ", ")); + } + match color { + Some(&DeclaredValue::Value(ref color)) => { + try!(color.to_css(dest)); + try!(write!(dest, " ")); + }, + Some(_) => { + try!(write!(dest, "transparent ")); + try!(write!(dest, " ")); + } + // Not yet the last one + None => () + }; - match *self.background_image { - DeclaredValue::Value(ref image) => { + + if let Some(image) = image { try!(image.to_css(dest)); - }, - _ => { + } else { try!(write!(dest, "none")); } - }; - try!(write!(dest, " ")); + try!(write!(dest, " ")); - try!(self.background_repeat.to_css(dest)); + if let Some(repeat) = repeat { + try!(repeat.to_css(dest)); + } else { + try!(write!(dest, "repeat")); + } - try!(write!(dest, " ")); + try!(write!(dest, " ")); - match *self.background_attachment { - DeclaredValue::Value(ref attachment) => { + if let Some(attachment) = attachment { try!(attachment.to_css(dest)); - }, - _ => { + } else { try!(write!(dest, "scroll")); } - }; - try!(write!(dest, " ")); + try!(write!(dest, " ")); - try!(self.background_position.to_css(dest)); + try!(position.unwrap_or(&background_position::single_value + ::get_initial_specified_value()) + .to_css(dest)); - if let DeclaredValue::Value(ref size) = *self.background_size { - try!(write!(dest, " / ")); - try!(size.to_css(dest)); - } + if let Some(size) = size { + try!(write!(dest, " / ")); + try!(size.to_css(dest)); + } - match (self.background_origin, self.background_clip) { - (&DeclaredValue::Value(ref origin), &DeclaredValue::Value(ref clip)) => { - use properties::longhands::background_origin::computed_value::T as Origin; - use properties::longhands::background_clip::computed_value::T as Clip; + match (origin, clip) { + (Some(origin), Some(clip)) => { + use properties::longhands::background_origin::single_value::computed_value::T as Origin; + use properties::longhands::background_clip::single_value::computed_value::T as Clip; - try!(write!(dest, " ")); + try!(write!(dest, " ")); - match (origin, clip) { - (&Origin::padding_box, &Clip::padding_box) => { - try!(origin.to_css(dest)); - }, - (&Origin::border_box, &Clip::border_box) => { - try!(origin.to_css(dest)); - }, - (&Origin::content_box, &Clip::content_box) => { - try!(origin.to_css(dest)); - }, - _ => { - try!(origin.to_css(dest)); - try!(write!(dest, " ")); - try!(clip.to_css(dest)); + match (origin, clip) { + (&Origin::padding_box, &Clip::padding_box) => { + try!(origin.to_css(dest)); + }, + (&Origin::border_box, &Clip::border_box) => { + try!(origin.to_css(dest)); + }, + (&Origin::content_box, &Clip::content_box) => { + try!(origin.to_css(dest)); + }, + _ => { + try!(origin.to_css(dest)); + try!(write!(dest, " ")); + try!(clip.to_css(dest)); + } } - } - }, - (&DeclaredValue::Value(ref origin), _) => { - try!(write!(dest, " ")); - try!(origin.to_css(dest)); - }, - (_, &DeclaredValue::Value(ref clip)) => { - try!(write!(dest, " ")); - try!(clip.to_css(dest)); - }, - _ => {} - }; + }, + (Some(origin), _) => { + try!(write!(dest, " ")); + try!(origin.to_css(dest)); + }, + (_, Some(clip)) => { + try!(write!(dest, " ")); + try!(clip.to_css(dest)); + }, + _ => {} + }; + } Ok(()) diff --git a/components/style/properties/shorthand/outline.mako.rs b/components/style/properties/shorthand/outline.mako.rs index c00294f45df..d09fe2152b2 100644 --- a/components/style/properties/shorthand/outline.mako.rs +++ b/components/style/properties/shorthand/outline.mako.rs @@ -89,8 +89,8 @@ } // TODO: Border radius for the radius shorthand is not implemented correctly yet - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { try!(self._moz_outline_radius_topleft.to_css(dest)); try!(write!(dest, " ")); From 69ada0d7a37e44fd54c3666de9372a926fae7c99 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sat, 20 Aug 2016 00:20:16 +0530 Subject: [PATCH 05/10] Support multiple backgrounds in servo layout --- components/layout/display_list_builder.rs | 186 ++++++++++-------- components/script/dom/element.rs | 7 +- components/style/properties/helpers.mako.rs | 4 +- .../properties/longhand/background.mako.rs | 8 +- .../properties/shorthand/background.mako.rs | 15 +- 5 files changed, 125 insertions(+), 95 deletions(-) diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index 27ff1f7eb84..8b967d54ec1 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -60,6 +60,10 @@ use table_cell::CollapsedBordersForCell; use url::Url; use util::opts; +fn get_cyclic(arr: &[T], index: usize) -> &T { + &arr[index % arr.len()] +} + pub struct DisplayListBuildState<'a> { pub layout_context: &'a LayoutContext<'a>, pub items: Vec, @@ -146,7 +150,7 @@ pub trait FragmentDisplayListBuilding { fn compute_background_image_size(&self, style: &ServoComputedValues, bounds: &Rect, - image: &WebRenderImageInfo) + image: &WebRenderImageInfo, index: usize) -> Size2D; /// Adds the display items necessary to paint the background image of this fragment to the @@ -157,7 +161,8 @@ pub trait FragmentDisplayListBuilding { display_list_section: DisplayListSection, absolute_bounds: &Rect, clip: &ClippingRegion, - image_url: &Url); + image_url: &Url, + background_index: usize); /// Adds the display items necessary to paint the background linear gradient of this fragment /// to the appropriate section of the display list. @@ -344,27 +349,32 @@ impl FragmentDisplayListBuilding for Fragment { if !border_radii.is_square() { clip.intersect_with_rounded_rect(absolute_bounds, &border_radii) } + let background = style.get_background(); // FIXME: This causes a lot of background colors to be displayed when they are clearly not // needed. We could use display list optimization to clean this up, but it still seems // inefficient. What we really want is something like "nearest ancestor element that // doesn't have a fragment". - let background_color = style.resolve_color(style.get_background().background_color); + let background_color = style.resolve_color(background.background_color); // 'background-clip' determines the area within which the background is painted. // http://dev.w3.org/csswg/css-backgrounds-3/#the-background-clip let mut bounds = *absolute_bounds; - match style.get_background().background_clip { - background_clip::T::border_box => {} - background_clip::T::padding_box => { + // This is the clip for the color (which is the last element in the bg array) + let color_clip = get_cyclic(&background.background_clip.0, + background.background_image.0.len() - 1); + + match *color_clip { + background_clip::single_value::T::border_box => {} + background_clip::single_value::T::padding_box => { let border = style.logical_border_width().to_physical(style.writing_mode); bounds.origin.x = bounds.origin.x + border.left; bounds.origin.y = bounds.origin.y + border.top; bounds.size.width = bounds.size.width - border.horizontal(); bounds.size.height = bounds.size.height - border.vertical(); } - background_clip::T::content_box => { + background_clip::single_value::T::content_box => { let border_padding = self.border_padding.to_physical(style.writing_mode); bounds.origin.x = bounds.origin.x + border_padding.left; bounds.origin.y = bounds.origin.y + border_padding.top; @@ -388,23 +398,26 @@ impl FragmentDisplayListBuilding for Fragment { // Implements background image, per spec: // http://www.w3.org/TR/CSS21/colors.html#background let background = style.get_background(); - match background.background_image.0 { - None => {} - Some(computed::Image::LinearGradient(ref gradient)) => { - self.build_display_list_for_background_linear_gradient(state, - display_list_section, - &bounds, - &clip, - gradient, - style); - } - Some(computed::Image::Url(ref image_url, ref _extra_data)) => { - self.build_display_list_for_background_image(state, - style, - display_list_section, - &bounds, - &clip, - image_url); + for (i, background_image) in background.background_image.0.iter().enumerate().rev() { + match background_image.0 { + None => {} + Some(computed::Image::LinearGradient(ref gradient)) => { + self.build_display_list_for_background_linear_gradient(state, + display_list_section, + &bounds, + &clip, + gradient, + style); + } + Some(computed::Image::Url(ref image_url, ref _extra_data)) => { + self.build_display_list_for_background_image(state, + style, + display_list_section, + &bounds, + &clip, + image_url, + i); + } } } } @@ -412,7 +425,8 @@ impl FragmentDisplayListBuilding for Fragment { fn compute_background_image_size(&self, style: &ServoComputedValues, bounds: &Rect, - image: &WebRenderImageInfo) + image: &WebRenderImageInfo, + index: usize) -> Size2D { // If `image_aspect_ratio` < `bounds_aspect_ratio`, the image is tall; otherwise, it is // wide. @@ -420,19 +434,22 @@ impl FragmentDisplayListBuilding for Fragment { let bounds_aspect_ratio = bounds.size.width.to_f64_px() / bounds.size.height.to_f64_px(); let intrinsic_size = Size2D::new(Au::from_px(image.width as i32), Au::from_px(image.height as i32)); - match (style.get_background().background_size.clone(), - image_aspect_ratio < bounds_aspect_ratio) { - (background_size::T::Contain, false) | (background_size::T::Cover, true) => { + let background_size = get_cyclic(&style.get_background().background_size.0, index).clone(); + match (background_size, image_aspect_ratio < bounds_aspect_ratio) { + (background_size::single_value::T::Contain, false) | + (background_size::single_value::T::Cover, true) => { Size2D::new(bounds.size.width, Au::from_f64_px(bounds.size.width.to_f64_px() / image_aspect_ratio)) } - (background_size::T::Contain, true) | (background_size::T::Cover, false) => { + (background_size::single_value::T::Contain, true) | + (background_size::single_value::T::Cover, false) => { Size2D::new(Au::from_f64_px(bounds.size.height.to_f64_px() * image_aspect_ratio), bounds.size.height) } - (background_size::T::Explicit(background_size::ExplicitSize { + (background_size::single_value::T::Explicit(background_size::single_value + ::ExplicitSize { width, height: LengthOrPercentageOrAuto::Auto, }), _) => { @@ -441,7 +458,8 @@ impl FragmentDisplayListBuilding for Fragment { Size2D::new(width, Au::from_f64_px(width.to_f64_px() / image_aspect_ratio)) } - (background_size::T::Explicit(background_size::ExplicitSize { + (background_size::single_value::T::Explicit(background_size::single_value + ::ExplicitSize { width: LengthOrPercentageOrAuto::Auto, height }), _) => { @@ -450,7 +468,8 @@ impl FragmentDisplayListBuilding for Fragment { Size2D::new(Au::from_f64_px(height.to_f64_px() * image_aspect_ratio), height) } - (background_size::T::Explicit(background_size::ExplicitSize { + (background_size::single_value::T::Explicit(background_size::single_value + ::ExplicitSize { width, height }), _) => { @@ -468,19 +487,22 @@ impl FragmentDisplayListBuilding for Fragment { display_list_section: DisplayListSection, absolute_bounds: &Rect, clip: &ClippingRegion, - image_url: &Url) { + image_url: &Url, + index: usize) { let background = style.get_background(); let fetch_image_data_as_well = !opts::get().use_webrender; let webrender_image = state.layout_context.get_webrender_image_for_url(image_url, UsePlaceholder::No, fetch_image_data_as_well); + if let Some((webrender_image, image_data)) = webrender_image { debug!("(building display list) building background image"); // Use `background-size` to get the size. let mut bounds = *absolute_bounds; - let image_size = self.compute_background_image_size(style, &bounds, &webrender_image); + let image_size = self.compute_background_image_size(style, &bounds, + &webrender_image, index); // Clip. // @@ -492,51 +514,54 @@ impl FragmentDisplayListBuilding for Fragment { let border = style.logical_border_width().to_physical(style.writing_mode); // Use 'background-origin' to get the origin value. - let (mut origin_x, mut origin_y) = match background.background_origin { - background_origin::T::padding_box => { - (Au(0), Au(0)) - } - background_origin::T::border_box => { - (-border.left, -border.top) - } - background_origin::T::content_box => { - let border_padding = self.border_padding.to_physical(self.style.writing_mode); - (border_padding.left - border.left, border_padding.top - border.top) - } + let origin = get_cyclic(&background.background_origin.0, index); + let (mut origin_x, mut origin_y) = match *origin { + background_origin::single_value::T::padding_box => { + (Au(0), Au(0)) + } + background_origin::single_value::T::border_box => { + (-border.left, -border.top) + } + background_origin::single_value::T::content_box => { + let border_padding = self.border_padding.to_physical(self.style.writing_mode); + (border_padding.left - border.left, border_padding.top - border.top) + } }; // Use `background-attachment` to get the initial virtual origin - let (virtual_origin_x, virtual_origin_y) = match background.background_attachment { - background_attachment::T::scroll => { - (absolute_bounds.origin.x, absolute_bounds.origin.y) - } - background_attachment::T::fixed => { - // If the ‘background-attachment’ value for this image is ‘fixed’, then - // 'background-origin' has no effect. - origin_x = Au(0); - origin_y = Au(0); - (Au(0), Au(0)) - } + let attachment = get_cyclic(&background.background_attachment.0, index); + let (virtual_origin_x, virtual_origin_y) = match *attachment { + background_attachment::single_value::T::scroll => { + (absolute_bounds.origin.x, absolute_bounds.origin.y) + } + background_attachment::single_value::T::fixed => { + // If the ‘background-attachment’ value for this image is ‘fixed’, then + // 'background-origin' has no effect. + origin_x = Au(0); + origin_y = Au(0); + (Au(0), Au(0)) + } }; + let position = *get_cyclic(&background.background_position.0, index); // Use `background-position` to get the offset. - let horizontal_position = model::specified(background.background_position.horizontal, - bounds.size.width - image_size.width); - let vertical_position = model::specified(background.background_position.vertical, - bounds.size.height - image_size.height); + let horizontal_position = model::specified(position.horizontal, + bounds.size.width - image_size.width); + let vertical_position = model::specified(position.vertical, + bounds.size.height - image_size.height); let abs_x = border.left + virtual_origin_x + horizontal_position + origin_x; let abs_y = border.top + virtual_origin_y + vertical_position + origin_y; // Adjust origin and size based on background-repeat - match background.background_repeat { - background_repeat::T::no_repeat => { + match *get_cyclic(&background.background_repeat.0, index) { + background_repeat::single_value::T::no_repeat => { bounds.origin.x = abs_x; bounds.origin.y = abs_y; bounds.size.width = image_size.width; bounds.size.height = image_size.height; } - background_repeat::T::repeat_x => { + background_repeat::single_value::T::repeat_x => { bounds.origin.y = abs_y; bounds.size.height = image_size.height; ImageFragmentInfo::tile_image(&mut bounds.origin.x, @@ -544,7 +569,7 @@ impl FragmentDisplayListBuilding for Fragment { abs_x, image_size.width.to_nearest_px() as u32); } - background_repeat::T::repeat_y => { + background_repeat::single_value::T::repeat_y => { bounds.origin.x = abs_x; bounds.size.width = image_size.width; ImageFragmentInfo::tile_image(&mut bounds.origin.y, @@ -552,31 +577,32 @@ impl FragmentDisplayListBuilding for Fragment { abs_y, image_size.height.to_nearest_px() as u32); } - background_repeat::T::repeat => { + background_repeat::single_value::T::repeat => { ImageFragmentInfo::tile_image(&mut bounds.origin.x, - &mut bounds.size.width, - abs_x, - image_size.width.to_nearest_px() as u32); + &mut bounds.size.width, + abs_x, + image_size.width.to_nearest_px() as u32); ImageFragmentInfo::tile_image(&mut bounds.origin.y, - &mut bounds.size.height, - abs_y, - image_size.height.to_nearest_px() as u32); + &mut bounds.size.height, + abs_y, + image_size.height.to_nearest_px() as u32); } }; // Create the image display item. let base = state.create_base_display_item(&bounds, - &clip, - self.node, - style.get_cursor(Cursor::Default), - display_list_section); + &clip, + self.node, + style.get_cursor(Cursor::Default), + display_list_section); state.add_display_item(DisplayItem::ImageClass(box ImageDisplayItem { - base: base, - webrender_image: webrender_image, - image_data: image_data.map(Arc::new), - stretch_size: Size2D::new(image_size.width, image_size.height), - image_rendering: style.get_inheritedbox().image_rendering.clone(), + base: base, + webrender_image: webrender_image, + image_data: image_data.map(Arc::new), + stretch_size: Size2D::new(image_size.width, image_size.height), + image_rendering: style.get_inheritedbox().image_rendering.clone(), })); + } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 9c5b80fb103..2d57ddab4d6 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -362,8 +362,11 @@ impl LayoutElementHelpers for LayoutJS { if let Some(url) = background { hints.push(from_declaration( PropertyDeclaration::BackgroundImage(DeclaredValue::Value( - background_image::SpecifiedValue(Some( - specified::Image::Url(url, specified::UrlExtraData { }))))))); + background_image::SpecifiedValue(vec![ + background_image::single_value::SpecifiedValue(Some( + specified::Image::Url(url, specified::UrlExtraData { }) + )) + ]))))); } let color = if let Some(this) = self.downcast::() { diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index 532095bc00d..c522baf81b8 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -69,10 +69,10 @@ ${caller.body()} } pub mod computed_value { - use super::single_value; + pub use super::single_value::computed_value as single_value; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] - pub struct T(pub Vec); + pub struct T(pub Vec); } impl ToCss for computed_value::T { diff --git a/components/style/properties/longhand/background.mako.rs b/components/style/properties/longhand/background.mako.rs index fbf4c8c3fd4..9ad9daf4262 100644 --- a/components/style/properties/longhand/background.mako.rs +++ b/components/style/properties/longhand/background.mako.rs @@ -10,7 +10,7 @@ ${helpers.predefined_type("background-color", "CSSColor", "::cssparser::Color::RGBA(::cssparser::RGBA { red: 0., green: 0., blue: 0., alpha: 0. }) /* transparent */", animatable=True)} -<%helpers:vector_longhand gecko_only="True" name="background-image" animatable="False"> +<%helpers:vector_longhand name="background-image" animatable="False"> use cssparser::ToCss; use std::fmt; use values::specified::Image; @@ -79,7 +79,7 @@ ${helpers.predefined_type("background-color", "CSSColor", } -<%helpers:vector_longhand name="background-position" gecko_only="True" animatable="True"> +<%helpers:vector_longhand name="background-position" animatable="True"> use cssparser::ToCss; use std::fmt; use values::LocalToCss; @@ -121,25 +121,21 @@ ${helpers.predefined_type("background-color", "CSSColor", ${helpers.single_keyword("background-repeat", "repeat repeat-x repeat-y no-repeat", vector=True, - gecko_only=True, animatable=False)} ${helpers.single_keyword("background-attachment", "scroll fixed" + (" local" if product == "gecko" else ""), vector=True, - gecko_only=True, animatable=False)} ${helpers.single_keyword("background-clip", "border-box padding-box content-box", vector=True, - gecko_only=True, animatable=False)} ${helpers.single_keyword("background-origin", "padding-box border-box content-box", vector=True, - gecko_only=True, animatable=False)} <%helpers:vector_longhand name="background-size" animatable="True"> diff --git a/components/style/properties/shorthand/background.mako.rs b/components/style/properties/shorthand/background.mako.rs index a7dff5047b3..60f0727442b 100644 --- a/components/style/properties/shorthand/background.mako.rs +++ b/components/style/properties/shorthand/background.mako.rs @@ -23,14 +23,14 @@ % endfor loop { - if background_color.is_none() { - if let Ok(value) = input.try(|input| background_color::parse(context, input)) { + if let Ok(value) = input.try(|input| background_color::parse(context, input)) { + if background_color.is_none() { background_color = Some(value); continue + } else { + // color can only be the last element + return Err(()) } - } else { - // color can only be the last element - return Err(()) } if position.is_none() { if let Ok(value) = input.try(|input| background_position::single_value::parse(context, input)) { @@ -118,6 +118,11 @@ .unwrap_or(0)); % endfor + // There should be at least one declared value + if len == 0 { + return Err(()) + } + let iter = repeat(None).take(len - 1).chain(once(Some(self.background_color))) % for name in "image position repeat size attachment origin clip".split(): .zip(extract_value(self.background_${name}).into_iter() From f29b748a598dc3d354a1c8be9d3f61fad039e83c Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sat, 20 Aug 2016 12:55:40 +0530 Subject: [PATCH 06/10] Fix serialization of initial/inherit shorthands --- components/style/properties/helpers.mako.rs | 34 ++++++++++++++++-- .../properties/shorthand/background.mako.rs | 6 ++-- .../style/properties/shorthand/border.mako.rs | 16 ++++----- .../style/properties/shorthand/box.mako.rs | 12 +++---- .../style/properties/shorthand/column.mako.rs | 4 +-- .../style/properties/shorthand/font.mako.rs | 4 +-- .../shorthand/inherited_text.mako.rs | 4 +-- .../style/properties/shorthand/list.mako.rs | 4 +-- .../properties/shorthand/outline.mako.rs | 4 +-- .../properties/shorthand/position.mako.rs | 8 ++--- .../style/properties/shorthand/text.mako.rs | 4 +-- .../html/cssom-setProperty-shorthand.htm.ini | 35 ------------------- 12 files changed, 65 insertions(+), 70 deletions(-) delete mode 100644 tests/wpt/metadata-css/cssom-1_dev/html/cssom-setProperty-shorthand.htm.ini diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index c522baf81b8..43b3d7bda17 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -479,6 +479,36 @@ } } + impl<'a> ToCss for LonghandsToSerialize<'a> { + fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + let mut all_inherit = true; + let mut all_initial = true; + let mut with_variables = false; + % for sub_property in shorthand.sub_properties: + match *self.${sub_property.ident} { + DeclaredValue::Initial => all_inherit = false, + DeclaredValue::Inherit => all_initial = false, + DeclaredValue::WithVariables {..} => with_variables = true, + DeclaredValue::Value(..) => { + all_initial = false; + all_inherit = false; + } + } + % endfor + + if with_variables { + // We don't serialize shorthands with variables + dest.write_str("") + } else if all_inherit { + dest.write_str("inherit") + } else if all_initial { + dest.write_str("initial") + } else { + self.to_css_declared(dest) + } + } + } + pub fn parse(context: &ParserContext, input: &mut Parser, declarations: &mut Vec) @@ -541,8 +571,8 @@ }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { super::serialize_four_sides( dest, self.${to_rust_ident(sub_property_pattern % 'top')}, diff --git a/components/style/properties/shorthand/background.mako.rs b/components/style/properties/shorthand/background.mako.rs index 60f0727442b..31cd555ab23 100644 --- a/components/style/properties/shorthand/background.mako.rs +++ b/components/style/properties/shorthand/background.mako.rs @@ -101,8 +101,8 @@ }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { // mako doesn't like ampersands following `<` fn extract_value(x: &DeclaredValue) -> Option< &T> { match *x { @@ -120,7 +120,7 @@ // There should be at least one declared value if len == 0 { - return Err(()) + return dest.write_str("") } let iter = repeat(None).take(len - 1).chain(once(Some(self.background_color))) diff --git a/components/style/properties/shorthand/border.mako.rs b/components/style/properties/shorthand/border.mako.rs index f1d868b26cc..c29a6a2e7fb 100644 --- a/components/style/properties/shorthand/border.mako.rs +++ b/components/style/properties/shorthand/border.mako.rs @@ -25,8 +25,8 @@ ${helpers.four_sides_shorthand("border-style", "border-%s-style", }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { // extract tuple container values so that the different border widths // can be compared via partial eq % for side in ["top", "right", "bottom", "left"]: @@ -102,8 +102,8 @@ pub fn parse_border(context: &ParserContext, input: &mut Parser) }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { super::serialize_directional_border( dest, self.border_${side}_width, @@ -134,8 +134,8 @@ pub fn parse_border(context: &ParserContext, input: &mut Parser) }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { // If all longhands are all present, then all sides should be the same, // so we can just one set of color/style/width super::serialize_directional_border( @@ -170,8 +170,8 @@ pub fn parse_border(context: &ParserContext, input: &mut Parser) // TODO: I do not understand how border radius works with respect to the slashes /, // so putting a default generic impl for now // https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { try!(self.border_top_left_radius.to_css(dest)); try!(write!(dest, " ")); diff --git a/components/style/properties/shorthand/box.mako.rs b/components/style/properties/shorthand/box.mako.rs index 0825a8fc314..2465a91ae8a 100644 --- a/components/style/properties/shorthand/box.mako.rs +++ b/components/style/properties/shorthand/box.mako.rs @@ -19,8 +19,8 @@ // Overflow does not behave like a normal shorthand. When overflow-x and overflow-y are not of equal // values, they no longer use the shared property name "overflow". // Other shorthands do not include their name in the to_css method - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { let x_and_y_equal = match (self.overflow_x, self.overflow_y) { (&DeclaredValue::Value(ref x_value), &DeclaredValue::Value(ref y_container)) => { *x_value == y_container.0 @@ -132,8 +132,8 @@ macro_rules! try_parse_one { }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { try!(self.transition_property.to_css(dest)); try!(write!(dest, " ")); @@ -268,8 +268,8 @@ macro_rules! try_parse_one { }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { try!(self.animation_duration.to_css(dest)); try!(write!(dest, " ")); diff --git a/components/style/properties/shorthand/column.mako.rs b/components/style/properties/shorthand/column.mako.rs index 563ef210fdf..e8ccf00bf47 100644 --- a/components/style/properties/shorthand/column.mako.rs +++ b/components/style/properties/shorthand/column.mako.rs @@ -48,8 +48,8 @@ } } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { try!(self.column_width.to_css(dest)); try!(write!(dest, " ")); diff --git a/components/style/properties/shorthand/font.mako.rs b/components/style/properties/shorthand/font.mako.rs index aae11eb3cf6..555b098e575 100644 --- a/components/style/properties/shorthand/font.mako.rs +++ b/components/style/properties/shorthand/font.mako.rs @@ -68,8 +68,8 @@ } // This may be a bit off, unsure, possibly needs changes - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { if let DeclaredValue::Value(ref style) = *self.font_style { try!(style.to_css(dest)); try!(write!(dest, " ")); diff --git a/components/style/properties/shorthand/inherited_text.mako.rs b/components/style/properties/shorthand/inherited_text.mako.rs index e7c19127a15..64ef03b1138 100644 --- a/components/style/properties/shorthand/inherited_text.mako.rs +++ b/components/style/properties/shorthand/inherited_text.mako.rs @@ -15,8 +15,8 @@ }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { self.overflow_wrap.to_css(dest) } } diff --git a/components/style/properties/shorthand/list.mako.rs b/components/style/properties/shorthand/list.mako.rs index 6e1abf337fe..955d93f7c16 100644 --- a/components/style/properties/shorthand/list.mako.rs +++ b/components/style/properties/shorthand/list.mako.rs @@ -92,8 +92,8 @@ } } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self.list_style_position { DeclaredValue::Initial => try!(write!(dest, "outside")), _ => try!(self.list_style_position.to_css(dest)) diff --git a/components/style/properties/shorthand/outline.mako.rs b/components/style/properties/shorthand/outline.mako.rs index d09fe2152b2..852fce2b292 100644 --- a/components/style/properties/shorthand/outline.mako.rs +++ b/components/style/properties/shorthand/outline.mako.rs @@ -49,8 +49,8 @@ } } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { try!(self.outline_width.to_css(dest)); try!(write!(dest, " ")); diff --git a/components/style/properties/shorthand/position.mako.rs b/components/style/properties/shorthand/position.mako.rs index 9fc33e00f42..5064c375215 100644 --- a/components/style/properties/shorthand/position.mako.rs +++ b/components/style/properties/shorthand/position.mako.rs @@ -38,8 +38,8 @@ } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self.flex_direction { DeclaredValue::Initial => try!(write!(dest, "row")), _ => try!(self.flex_direction.to_css(dest)) @@ -107,8 +107,8 @@ }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { try!(self.flex_grow.to_css(dest)); try!(write!(dest, " ")); diff --git a/components/style/properties/shorthand/text.mako.rs b/components/style/properties/shorthand/text.mako.rs index 2bcfbfcd7b9..d09e00b6ba4 100644 --- a/components/style/properties/shorthand/text.mako.rs +++ b/components/style/properties/shorthand/text.mako.rs @@ -46,8 +46,8 @@ }) } - impl<'a> ToCss for LonghandsToSerialize<'a> { - fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + impl<'a> LonghandsToSerialize<'a> { + fn to_css_declared(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self.text_decoration_line { DeclaredValue::Value(ref line) => { try!(line.to_css(dest)); diff --git a/tests/wpt/metadata-css/cssom-1_dev/html/cssom-setProperty-shorthand.htm.ini b/tests/wpt/metadata-css/cssom-1_dev/html/cssom-setProperty-shorthand.htm.ini deleted file mode 100644 index 0107a131efa..00000000000 --- a/tests/wpt/metadata-css/cssom-1_dev/html/cssom-setProperty-shorthand.htm.ini +++ /dev/null @@ -1,35 +0,0 @@ -[cssom-setProperty-shorthand.htm] - type: testharness - [shorthand font can be set with setProperty] - expected: FAIL - - [shorthand border-top can be set with setProperty] - expected: FAIL - - [shorthand border-right can be set with setProperty] - expected: FAIL - - [shorthand border-bottom can be set with setProperty] - expected: FAIL - - [shorthand border-left can be set with setProperty] - expected: FAIL - - [shorthand border can be set with setProperty] - expected: FAIL - - [shorthand list-style can be set with setProperty] - expected: FAIL - - [shorthand outline can be set with setProperty] - expected: FAIL - - [shorthand background can be set with setProperty] - expected: FAIL - - [shorthand overflow can be set with setProperty] - expected: FAIL - - [shorthand border-radius can be set with setProperty] - expected: FAIL - From c55911905b8fa1720843af46b8c0b97e5da7d472 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sat, 20 Aug 2016 13:22:28 +0530 Subject: [PATCH 07/10] Fix unit test --- tests/unit/style/properties/serialization.rs | 110 ++++++++++++------- 1 file changed, 70 insertions(+), 40 deletions(-) diff --git a/tests/unit/style/properties/serialization.rs b/tests/unit/style/properties/serialization.rs index 61e49221c9a..7187c92b9f8 100644 --- a/tests/unit/style/properties/serialization.rs +++ b/tests/unit/style/properties/serialization.rs @@ -679,18 +679,44 @@ mod shorthand_serialization { */ mod background { - use style::properties::longhands::background_attachment::computed_value::T as Attachment; - use style::properties::longhands::background_clip::computed_value::T as Clip; - use style::properties::longhands::background_image::SpecifiedValue as ImageContainer; - use style::properties::longhands::background_origin::computed_value::T as Origin; - use style::properties::longhands::background_position::SpecifiedValue as PositionContainer; - use style::properties::longhands::background_repeat::computed_value::T as Repeat; - use style::properties::longhands::background_size::SpecifiedExplicitSize; - use style::properties::longhands::background_size::SpecifiedValue as Size; + use style::properties::longhands::background_attachment as attachment; + use style::properties::longhands::background_clip as clip; + use style::properties::longhands::background_image as image; + use style::properties::longhands::background_origin as origin; + use style::properties::longhands::background_position as position; + use style::properties::longhands::background_repeat as repeat; + use style::properties::longhands::background_size as size; use style::values::specified::Image; use style::values::specified::position::Position; use super::*; - + macro_rules! single_vec_value_typedef { + ($name:ident, $path:expr) => { + DeclaredValue::Value($name::SpecifiedValue( + vec![$path] + )) + }; + } + macro_rules! single_vec_value { + ($name:ident, $path:expr) => { + DeclaredValue::Value($name::SpecifiedValue( + vec![$name::single_value::SpecifiedValue($path)] + )) + }; + } + macro_rules! single_vec_keyword_value { + ($name:ident, $kw:ident) => { + DeclaredValue::Value($name::SpecifiedValue( + vec![$name::single_value::SpecifiedValue::$kw] + )) + }; + } + macro_rules! single_vec_variant_value { + ($name:ident, $variant:expr) => { + DeclaredValue::Value($name::SpecifiedValue( + vec![$variant] + )) + }; + } #[test] fn background_should_serialize_all_available_properties_when_specified() { let mut properties = Vec::new(); @@ -700,29 +726,31 @@ mod shorthand_serialization { authored: None }); - let position = DeclaredValue::Value( + let position = single_vec_value_typedef!(position, Position { horizontal: LengthOrPercentage::Length(Length::from_px(7f32)), vertical: LengthOrPercentage::Length(Length::from_px(4f32)) } ); - let repeat = DeclaredValue::Value(Repeat::repeat_x); - let attachment = DeclaredValue::Value(Attachment::scroll); + let repeat = single_vec_keyword_value!(repeat, repeat_x); + let attachment = single_vec_keyword_value!(attachment, scroll); - let image = DeclaredValue::Value(ImageContainer( - Some(Image::Url(Url::parse("http://servo/test.png").unwrap(), UrlExtraData {})) - )); + let image = single_vec_value!(image, + Some(Image::Url(Url::parse("http://servo/test.png").unwrap(), + UrlExtraData {}))); - let size = DeclaredValue::Value( - Size::Explicit(SpecifiedExplicitSize { - width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), - height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) - } - )); + let size = single_vec_variant_value!(size, + size::single_value::SpecifiedValue::Explicit( + size::single_value::SpecifiedExplicitSize { + width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), + height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) + } + ) + ); - let origin = DeclaredValue::Value(Origin::border_box); - let clip = DeclaredValue::Value(Clip::padding_box); + let origin = single_vec_keyword_value!(origin, border_box); + let clip = single_vec_keyword_value!(clip, padding_box); properties.push(PropertyDeclaration::BackgroundColor(color)); properties.push(PropertyDeclaration::BackgroundPosition(position)); @@ -751,29 +779,31 @@ mod shorthand_serialization { authored: None }); - let position = DeclaredValue::Value( + let position = single_vec_value_typedef!(position, Position { horizontal: LengthOrPercentage::Length(Length::from_px(7f32)), vertical: LengthOrPercentage::Length(Length::from_px(4f32)) } ); - let repeat = DeclaredValue::Value(Repeat::repeat_x); - let attachment = DeclaredValue::Value(Attachment::scroll); + let repeat = single_vec_keyword_value!(repeat, repeat_x); + let attachment = single_vec_keyword_value!(attachment, scroll); - let image = DeclaredValue::Value(ImageContainer( - Some(Image::Url(Url::parse("http://servo/test.png").unwrap(), UrlExtraData {})) - )); + let image = single_vec_value!(image, + Some(Image::Url(Url::parse("http://servo/test.png").unwrap(), + UrlExtraData {}))); - let size = DeclaredValue::Value( - Size::Explicit(SpecifiedExplicitSize { - width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), - height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) - }) + let size = single_vec_variant_value!(size, + size::single_value::SpecifiedValue::Explicit( + size::single_value::SpecifiedExplicitSize { + width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), + height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) + } + ) ); - let origin = DeclaredValue::Value(Origin::padding_box); - let clip = DeclaredValue::Value(Clip::padding_box); + let origin = single_vec_keyword_value!(origin, padding_box); + let clip = single_vec_keyword_value!(clip, padding_box); properties.push(PropertyDeclaration::BackgroundColor(color)); properties.push(PropertyDeclaration::BackgroundPosition(position)); @@ -801,17 +831,17 @@ mod shorthand_serialization { authored: None }); - let position = DeclaredValue::Value( + let position = single_vec_value_typedef!(position, Position { horizontal: LengthOrPercentage::Length(Length::from_px(0f32)), vertical: LengthOrPercentage::Length(Length::from_px(0f32)) } ); - let repeat = DeclaredValue::Value(Repeat::repeat_x); - let attachment = DeclaredValue::Value(Attachment::scroll); + let repeat = single_vec_keyword_value!(repeat, repeat_x); + let attachment = single_vec_keyword_value!(attachment, scroll); - let image = DeclaredValue::Value(ImageContainer(None)); + let image = single_vec_value!(image, None); let size = DeclaredValue::Initial; From 12f272587edb78e89d3588b5d59bfa5f993eae28 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 22 Aug 2016 14:49:56 +0530 Subject: [PATCH 08/10] Add multiple backgrounds CSS reftest --- tests/wpt/mozilla/meta/MANIFEST.json | 48 ++++++++++++++++++ tests/wpt/mozilla/tests/css/bubbles.png | Bin 0 -> 163626 bytes .../tests/css/multiple_backgrounds.html | 31 +++++++++++ .../tests/css/multiple_backgrounds_ref.html | 47 +++++++++++++++++ .../mozilla/tests/css/rust-logo-256x256.png | Bin 0 -> 37076 bytes 5 files changed, 126 insertions(+) create mode 100644 tests/wpt/mozilla/tests/css/bubbles.png create mode 100644 tests/wpt/mozilla/tests/css/multiple_backgrounds.html create mode 100644 tests/wpt/mozilla/tests/css/multiple_backgrounds_ref.html create mode 100644 tests/wpt/mozilla/tests/css/rust-logo-256x256.png diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index ee90a1be5d4..0546548d847 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -3564,6 +3564,30 @@ "url": "/_mozilla/css/mix_blend_mode_a.html" } ], + "css/multiple_backgrounds.html": [ + { + "path": "css/multiple_backgrounds.html", + "references": [ + [ + "/_mozilla/css/multiple_backgrounds_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/multiple_backgrounds.html" + } + ], + "css/multiple_backgrounds_ref.html": [ + { + "path": "css/multiple_backgrounds_ref.html", + "references": [ + [ + "/_mozilla/css/multiple_backgrounds_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/multiple_backgrounds_ref.html" + } + ], "css/multiple_css_class_a.html": [ { "path": "css/multiple_css_class_a.html", @@ -12832,6 +12856,30 @@ "url": "/_mozilla/css/mix_blend_mode_a.html" } ], + "css/multiple_backgrounds.html": [ + { + "path": "css/multiple_backgrounds.html", + "references": [ + [ + "/_mozilla/css/multiple_backgrounds_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/multiple_backgrounds.html" + } + ], + "css/multiple_backgrounds_ref.html": [ + { + "path": "css/multiple_backgrounds_ref.html", + "references": [ + [ + "/_mozilla/css/multiple_backgrounds_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/multiple_backgrounds_ref.html" + } + ], "css/multiple_css_class_a.html": [ { "path": "css/multiple_css_class_a.html", diff --git a/tests/wpt/mozilla/tests/css/bubbles.png b/tests/wpt/mozilla/tests/css/bubbles.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd4db86005ad2cb78753ff669331009a3fbdf31 GIT binary patch literal 163626 zcmdSA`9IWa_%J@C=u||B$P(csp&}x*p{(aHwhSYp#hRtTU{p>ep%ThkDH@Zplx2o7 zBxFw-W1o>_m|?~?2D3fyiO=(Wy`JwM@VuU1&igd(`@XLG+P6FLA3MuEf64s?0)h5i zxqQh11lkV#@3sc99l+=I$ge2ib1>Z8HQX`SFC2C))E9LAda$>z@|D1AH+&s@uU(J2 z)8=~?Bplay<H0F}k9U$laePR1L>9YIN>vuk0 zn|Zc4aK%R5;ZtIfU*So8eQ4orKT{jq>82xTp%zC`DlK=4r8JujU)(xYc;tzcblVGa zVHIu~|zhFFV&arH8C-P($Q%q&O*_$gj|<#!)xu3N%i zBp&!D=*MdnP#t9Rdbzi5p?kzYLcq^&ngn}PS+tHy%dJ0Z6!zOp-u`Rr&yd(Y6UX&y zPH2`$Jg^=($0BroKS)5ob2o-^{r}mb*bFtBey~eoc>Crm%-x-v2ZSZ-UoFWP7HkdK zpKQ@&>vjI8(Eppn{(nt4{%_&CC6w`fM3^GKf2Ts}w!H%O8@&SkA77JA5jnLoP3^8U zC4$lQkS+NsTL|oo_!li7svpXv$h8qR1+L-iYBPl5!nD(DB>7|1!;T;LBZs=B^{fFG z`Qky(#QoI;n0#U=52IlXkbsJLAq|p zm$jy(b_~f=I#e6UUD_w^^brzAS?bRW;0R!?0lX^#j- zqa1hg^Lm(mS+g8}#pw7y$Hb@2r$A7S2e0;KTP?_Vey==E?1!*N3!9$&&{OBuXScse zt#;VSf0z>fKkKKe9d~k7I7xO@u2pj5P^jj%V=A&w#T#B-XLG?u!y@-isc>rbiP9LJ z54t*R-dahDw_QkCK+)y-AxQNk*3bo}sSsyotu~UxrK)h;UsxGq!UCPjNf8}&vypq-Ced^Z7e4xqar4gsnO=vtLqK>0myLqlqlU=3u`rA@*5=ee|DTBhl^g<|6OQ!=v9|Z%lkX^RXj#8-TkPI+jshYC->Ug7^@kQ*@H7 z`q25?v(y=0l6F?Admq*qs=e~GxLPn*BUqiRfUpYwaEyp|WUGdlu0|Mw1LF`H2gUR_K= z<7ciW`Qj#8L$V?RwIY%e8+x~|Ju@~o;i&HTxKbpQVxd9)ciBWpSpX>PxN~mHmm!wJ zECh3~KV)E=2_i@ekt#XX_H*E$d{Ug6w@A0+&U)rCTLFNQFk!R`%6r`rAg>Yq#k; zj~4Yd;ao+P1h_FHMoy#)(FAQY$VxLiwVOpwG6lcaTz&R9_fa*MzzlDe(Kv8 zONe#%+o>ynwS4$1*5sC7Dpq#-#GR*<#|xzf>0ZZHal@1<#p{+4_V2W9PUXgz?~kmA zp6mPL1R8Q`C+IpYQe+(Fz?6|em-p5AYv0Oy2M-+noxPqjL7x-7^qqAZeIt~smCluM zabnH2Lt>5on2lFDl2#tsG!7UmRIn|iioJH+*0+7W8RPl!i7LuisM>|4X#~oo$PqUI z)ztuig1RJhiljImFKId8jFmW7b!mK3P$Lr)blLaWck6Y?KKjh3Ux)qAS|}U7`(w1? z*Y{u4^q!@cPCwDo{EC~|@zg}fXZSFShr#7wA5HiOw?kliY9ob3;su20 z%zh=t!L`gEk$h;lV7z#4%*Tyotj$S z^@pM}hEV>HOWZNDUyY;yiu23HN zhmOAVk3ySZc7)EiSN@%Ts|hf`+Qe$d*A^p-bDPw^zfz!q$9&|i1MsbaR4MDMOVMI>P2juXRj<9bBm0SbV$j+B=|=SF3$;cPsB z?xj~ULgeF^v36z}q;!n`Bl8h;+t7|Un<-*zITIgzW?#@NwT7*Ib+EGNL$)72Gui=N z4eYKoNx!G`D1v_xn%6GD4h`&J-qzQ8U$7Z%c{Q&6Dq;+hR(r&RefW4;dT(y~KdG^S z3JA-e#VN5G#618;;eW_i<`v8Jhq`4c^-o40CoTwXuyV5%EOZSV{#X6*EbH>7eZFwO zI^M^up&ZgxikLr^rC05<7%7J1Zx%4gkOGLhN@ z@}qf$G|(69gjV}}R(*9hB%@vTIX5>ZOeFr#?QXKnR;EhU$IqcFF&hFth9d@ODBrK; z!DL^IXO}*qjkOsLp3{gtoE{76X{%iN`>>bIo|IU=_xb`&uzk_4{)7qdwBWoMkg?{8OI^PU2S8hnDfMiZyU0$zc@b1-`8E=|MLv6tpJ+qNl{!VCH%npa0v)vs) zfCHOenBQ>NDMy@&p6yYB&tW-{cIZY3evLB{v39NIgGnYHgM z;}UwjSUYc``YAd1EHMpZQB3)5qPicFX0`YGwSi}n0IKmmRZDeyfP5hW9f%q0)K~18 zx?LzGLKmEr9JZDrdAeSK!WDoqpUP)BGjKl*La%Qj>)D$q(`2gRbDMPJ#6!Dp4rI(+ zds3Osg;u}eu*E#pd_0?8QvXDC%W>RsiyC|AdS5;_viBZQq2qp-dC^z}6|-%f)cVrQ zg#W7=D-lZvE~nL9jyGada2V$QBEz?9FWbf#ZpwjQ<9>3J0IxAl$X(4eM1j2SeN5%z za{Kb>x--MeXMrQo?Gn}~1buy`Bp;6AvIzUhJaFNjR2Tbv`BK3p@Uz*5C$0ZTm7!$$ zZo@*Z#omExfB=#sIJlNZBo7(Py&C8Gf_6@`BSxny;vdi&z@QWgjKJqDw<;!GX$n5l zWR_y}$5S_G&46;?J!Z@j*CF_Mbap8BNV;#mq4S z@@TzdDt_&c!*0-W6+Ua0hoHL4Og|zZ=O}DvGGogVxpz8?7j#2ZOl2UzW<}{1h)TQf5L~Nt2UA;;`Q~B0TTR_ zcV@&<4BcAoTuh}AaTWaaTckF2TR}lclqP#moF1_SqBA%8nLWI|$Rzmp-(5L!Z8ISJ z{AOE7T=OMzl?g~9^p$wS%#!kjua7BHnjCWH7TO8Z-5ueH zmfcflK+K^T zW>TxVB5(WQqVAB9527I{%p(&~eF}fKt}n@pw~Mr?Jz zu=@asT4>%gmYJeU6ag3w0?m>D~ZsA zhw#uqYc-LlVbB^_54}0}Zl6fJ0EX6n%KM5B9tjBJzB>ts%G=1`aA9#UY!6h>H5;mt3Z8#8RpA&m|AHek1o%WA2P4IhVTC;`-?2 zn?aD{??Kz1Z!gAP%?vB>J1bSw)o_{41Vs?Kv(ha6O_}G$aL$8{$9r{+cB=k!XyzL` zK;oR>GIrP-1}6J3zbqZvig-Snj zqLyKYHbpJxuiiFdKJ7oq#d$W@1VBA9QiHfrMI?4a(8#4HEQykhP?rdkiQLG7h(Ed# zqN!!?dxgQH1# zd&VLmGR<-=RwULxZ*-;ezrY@a%W7q`QpH;P1-ajAVtnVxtGMW{Ap|ke;OeIBzTy(W zZGKP611{G`reu;>i7d~wcCY6t*SDyW zK0wh?7s_YN72bHKs+%Fws)(S4mb5c}G7aJaZZh&%F2a^K*PPMzlSapgV_>80sW%w) zViKwxMJ85ftd|gP3BYyJ1CRH-wZ0%qg;|+`l&JV|WD1&9n9e00{X=G%6tHBn%g?i8^=0 zsY=jFQgA1UA22+_^q_AkN45ky@m2%=d*unDrNhDL^3Tzx!e6oSx~qFXJ-|oW+DN1b zsrWm(Ssb!P@U@626!DV+<5%`p8um8POD98!e}u?%!e#my3HjVw2w@HxtpVBMt5vus zI=h(2DS`xthpx$p#0yZ=0-w-3vPw_V)m>dmN@;MFI+PnDagGt8uw^ZiOKH=H-4W2JSdY_AD-#SJpupK zr7ENhzyfLH{$Na=5D^pwy$#cmg^8Nqn*)-5XYdd#4T;s^vJcch;TzQfkKVG<4&GuTP3a6 zQgQ5sl03^~fm|~jF((oafCC&9!i zoHhJir64b)ELg8GybXiCqBgTjl7q`>|4C}2VqB%_&Jv3unbX*#ib}DQBp zV$9%tj=~nOi&{)>3B-UBZ9>#RwVGg7r{wI^IN2XP@qfF(&}x_s6wzEPG6>yM^z+2` ze`8qVX4Lsmc>$iUZj`r@a2R?g(*X@Qm%~K)TZP*~-V_h8b-p&l67Ul+#$O1(--A%rCW?L#n8DiG}Ck00vgyCLUQAkzb3-!HvpXaLk1K3fT zUEw?IoTb^@JSXXjgD@pt!ORkSt(0^>o8^&xOr2#BQmslHgZRvn?eG#2q-_$X zQ9e70!@gmhu{g_L+3hQn(9PP~E16W&rG=lI5L->__=4q9&sF2Rl*1fU<$v*_4zntU zx)_V`#<67#Q;uc%rH$X<3<&=Crnc69<0S5KaI1Hh*mw*I{w>mdu;bn%hn+&IWNdpN zFMfcpvugF!u5ITgLzdNyxZSpDW$@|^R$>C;))iC{{9o#m?yt{_S4{v0X4Vo;#c>;T znzy z8m$1Y@=#6q>BO7`I-UztSC?~yXCtL4NmJh_lUIK`BhG21Dt1BEN zVc}zj_LEm7wOfAvmI#;TEg*}qJ(Kc$nnc_!djJF?6@O8H&GePs1(Ev12nYNG@?J{*sfBe(QrBQpwMS+IWXmqEyMm6^bRge;xSKlae!n`u1FVYbsf`jbW! zAm2VSmI;qDr=PS`DZT$W+xqCoX8anH)oK%n#u~;BF z;8t599OQvh za*>p9%bQdSrYwAi#hOerjnLU7s_8eEs; z*q5GcF8_J^ZCJM0uL=+mhvc3qVhB2%dm?t;rGbvNmMV~1Dc zZpc!f|qY-s`u*@hXbAI})J9EK`y8qM&N&~Z{b#AR}W3;x<7yXVk( z(imhPGU35u)@R4rzc{3@z%FK~{W4p+5n6!lU&H8RZmQ6!Zd;6L9<4OgBpdK%fB{;Q z@pzmBXtWQb(ICtt4KVJ|=-=6hjqd_(F!Z<(AEZcDZ&%IaL-!z3#LO;i3`@Y`@S2&K zTElei4tzFEhS0@S)#Sm4<9Z{mk+|=#>`IaxPQoS#9yw& zxg%cyw&7nrxjhEggajzcZ99p!_x;g24aRc(RKMasI~UK;P&mBS9BHL z4eU8rlr&Wv{Gp-~R#jL`Y<)={Mb7Q4QFinaQU?AC$_=nZyUNLT#A&214!B;GS9nm~ z;~6f3c7JSe?oYgS&hihmL6^-($Zbo{Wj%tURh^o7v7?W8p};Et<)%SP!_&e|V-N}nxDwy{?O41bVw(W#@UmVYI$L(o?}Y&? z#e@wesrJ4NtsmAgyyuB|GQ%lJbiAx`=p9Xugk2fp=LB1f`T>^8Up(t+s`5Rf46K9g9D}!u;v2e zFiy3e%Nz+7hW739^MMzjn4YR1=2iEZ^d6SAzGoSho6W~*q%Q!aIpTXMMeUoy0_gFM zH-V#)*WaeMD@Is5?96Woo$t`kLMY|>2ZK{3g~fMmOSKk>D&N0GT}0A5Y8_9}87XKB z|Mx|xK|+B3Ms|tb%Y65A+E;LfSSxE`<^rF*d2U(&a4tSgsoP#H;0akry(=&MnD9q2 zBo;;ScDo(^Ug3M?G2&;8XLoCB7#q06A(%nx6)jfm=k%Xlj*cEKg%-4Gxub#E0e6qz zs*+<&lFVgmu~DS zQ7X+#NvRjhS)Crrw<7N!jVXU>Al%^0bWQr9^A-6$*jqDD1R*KhA~I}<04jVRWt%k7 zJXG2w&Rwz}aaf*5vmbCAnLFijEj zLS(S}f6+%nt{X(ikl#^bdbbZK3ZuK2i9i)><8J*!#y3pFHivzG(yq?juuzj{v^*+F zat-&~-%=CaVNQVp-hyXd-7|sUP6LGq zE}`OpLczyI@K>xD*BdCh8AYxKAM4T*3UU#RpYOPr=}fr|wL9yephOJy*Sts0FFNV5 z_Vg~rgq7Eu5BZYq8Y3m#HV*pRy1XDW+QwIS2K!@`01!foQV>n{y=)5QA zm2?WFc=Jde?wDtmm8B<6g8X(AUO-qG1G;t<^OVJ^C&WE2tpv&w)_}VS9X+O#aj5mn zxM8aY#`JY**y~_g=Z8Pp19{COotA_QXP6fdb|J$-bR_liMYFM{C8L9$HxMGm6l#;SSuG7qUF;X56^o)z8oy*eAyoW<-HY&2TlOBY83Lu z@~qYl+=I@st50=>^9UEss3!cDRQ)yMoQ*@J0Lu&zHH$zEB5 zH+0cz!fgYox)1M<%w`*(+LZj1MnLj=-C%dn*$%T6Nrw-WI;Aqdkg&_8iqzhmRDWc* zyhr>5ft~Ec@DRPXxaO(Z@xtu)@c-U!3q{+%uUI) zPwn2!YG2`a5SjNCd}zY$S_ik=^4HuG;?f8{wCh@2llze*ql5sc_*n&E@ql3tVneP+ zOZXhX$oN6`JX#$X%fDM#!7;dBDaNDH@%=~ZTb!Mk`UGj>!Shqw>swAGZCbDcfU2Ow zUM>r2gJl+4s1oCOm5?NINz`Ap{2|f%HXk0;f-F&)uXe;d+`Mq7T|!*a5YOb9xaX=n zgH1HrgRYF#42ex{BJ^+p?jybuqoy}Ka_0s9MzUmHZmyrvEPw-6Zg&43zTtf_A@^Cb za>)DWxXj>{&clBM=M~P?s`g{_r%YmhN345Mhq?1L-(y|j!u@8gm&gN6A?c+{|FiNx zKoe^ncXFI3hcW>ic*oqhhmaU0P_kUbWQ@ftj>4KrDV@%4iP>*zfAI%50-e2#CWJ`9(F~4j) zIB2?;#kmj3oZ7g_tlo#vVTMm9Qa5~Vt@>lC-k*H0mY1ETHnqj&q_SJVnnGO_;UQ}> z<6xILJP|NiM~8Qn4e?9GRcZc7do}NWj=mON+~^dZdrXQ79Xc=y^=ucjjk3%Z|#; zbn^2r02Eqa5gm_x&0YnSnTP=#80aL*-h(QLwDgqUxCWp$D3953V4x(mC)63O^Fd0O zrl@E&)`9b(;I$hSYKn4U&`w(mHKwFOH4@hOQLwGSh&h{6zhZW zhr{H<3h{S5p7SrkAV3_^T?6xe(y0{op-l_>cMT z5gvlr0zP{L8k`V?e@$xy0_}}!=n_KZZf7C{Av#K^Y$g57q7LbFRvrfG^StHBg?k3k z8Ks7FkmIK72~hER0@5|ARQcitahlZX%Z&$gqS|iiBpEDRZuIi$f>t5FMXJvLb@iq< zsZMN}r$XFC;07y!q*&2kip2(0WCNU9W3-4>;V-a?C=-5A7gI1V!vk9A!7dSjJ_Kez zTerWXbprk*UKcCpbNjMLLgpk^m6-38zh1K$;-;Jj^lljN9C7;mn$rr0K>dWV(Fo07 z9nay#w8V3otNBT46=qj_`Izk!i}s2cI9v47q0FW$(Jyj$<+0Z-_X6scDN)h~RTSmbD+t`6RXj1QreYboLF1R}NjYErfnCuQ1&Y3O*>Q?9mQM}xy3XYgiE1MjcKf2eM)BFsMuB?QhnR_ zw$`xvMd~5R1#{8KGdgD%BV&k?R9+C1Ymqr_O@Px;o}@9gGozA2Q+y|ZbMgVKluvkO zbA4#8(m>1ZP;gDi|ANCq_H zQhd>)tsxKvUP&EbEY>>GLUKn5`Ylo;Vsk1S~A4ufCCLX zKLTOQ_mw6vwn6){+Q%p3%90nDPEMltl6)>KEQ;K_V{<55Ja5Ha6d_aiQ(+YY#!B)p zqN@+g)FT+R0No$cQg30)-!p$x^R!LBcF?@Oh+in!woq#S^Ml1q^$o>tV;p|s+rR*p z3Xe4f=udC`t`8fF_+@u-vsG;OPeK4-6IT*U1M>PsM5NACif&g#RYTV;qBwDp+oL~%@W@Av^0 z3k%+n9dP9X`}kL4bXx>0!c67wB%Fj!yL88AlHnDiEK%ybZ}>fJtJW&$`15b9`Wixj zcJ?8qRK}V6lde2t+?+vI=FQW*HfZZbCn z+waOl7k@7Om&^V^F3nq#Z*;KFa@&x<<`UjK`pimqH5!mTccZ^KDDz0U+~5-hEZ}lBBl@)iV(I%x26_#UdSP4l73m4DuXp6Pl$k4TOE;d4@-OCY9q~!`^TU*3F zpMu5ZRqCl$ibC)(g>i8!FT5;>sU~rGRx>ge4ZUw(6mgIoxdd}faFU$7RP8DfFKI_O z>@~V)fUqj7f=3$j3%9)mXEe5i{^$txcy2`*F2E@E5Ep_Tjg8f4oREZtIk^;7bZ&5{ zimfJzL3pv9q!Lf#hzf0Ob)KEL(&M+snh2FE&St5Kl%usM#s&vXr#BZoc(BM?u+nU# zxH4HMYyFq;>H@(ULGB28DgoHGKA0+qL!d6sK^Pxi2Q`R&RQdk;HVRvS!fh+_9Fns> zrwV@J`=-2ytcKJwNG_uxAv%++v4|a`RGHL;7?@FFBk3?zyEzq1TIK;3W?$o zzY~K|Kjcbon6q3IRxS~txL?e!m~MV!u1QHVtmY`umH<0I3f2-T70rlwg{Cro&rumi zR_}7gXUJq)7ZN!@EB6$RvpMWlK)Ahr6`(9AQ1GH1p5Ll z{r`|6_n2|8MNS@I8~B)DuklxhO!tzO)sQyFQy3>6Hhp_Rj<#=z#<%_>5tSICv*Yn4 z3N$b=!jf=bFGTSr3n9MR}oZK!803?S?DcnO|T{RXc!PCg&>1ue% z9TpVmoQzDzJ@%46=}zl`!rRKb3zw6{;`k#5Yy!+Ph($`*^V# zD*DHa_){|M29q(X%gEWKU7WciA3?`P@Rj)rV`m9DR!yn}jFjY5#;dHH5mG?qy8>O| z2C)q+>WS`&G1!N#G)g3Xxu6slmEaU{PWqm!+#xx|`S(4BfK1h-7*p;ic_SKTb^{T( zC{Xx{c3D}a*U$Y9~N2wVw zjGS-dd#>eSRc3Q&zv~kA6yEegnUaL~9)8+?91I)?bqk559(_=q@z}qKHyqrgI1>zAAV_SA0^#kOdu zA1Ixf&n*)XNSoIIEg{nr00srB$2AK_cz4k>N4E;Ow`4kawO;;;?~6bY=W_e8CF-kz z4mzRn?KmIP$LJf<=Xww*JYx*KlzzoVWb6gdXpq&E+81xhOGR+Z@^IttcIiL{iPh+$ zq8o1p1H@D8ZJstuQJqnQQ)kX#s?x9eZ$<*TrNB&~b?E488c@Nu^w?b&sYav`dL(b_ zqb~ktNphMM?@EeTw34YYd5CPQy=(Z0h509S^nDn`k324yYKlwu57r!w2Rb*Lxk1XR z$DLWVU{>i>>3iepNRbby{t~x+tWR+7&`|#OnHj~+rW7!zv#$4YMoezB^FYBEQi#i05+P4D>^Q~2H?H`kuqVSxc)(guX@AJLO%rv{2Sm9E{! zMQT0I8^GQ0DmJD6r=gfSLG^7qHh}@69e+!9*PoX#XNbhwv-h#P!ni?b|Ip@tQYk-e z-sr!ydLwidm{Qq z1Arzo^CUs6f_k)35+v>%q1>f~NXF_BNssf{(U}NUGx0s*d+d+@l6Ts}drZfZIN2OfPbJkx~$9A#bh0$eLhE*+>mou3}5Ce)dD~`gq=A?-SR*ojxT6iLq|}uDWN~|5UpEH z)0|=~U)$bykdDH5r`F4^ofz%9`zi%5;e?CR%dZ}zp%tSg;k#SjlaB#aHXe7CGxTu4;exE&j@e^*jMJOW# zP#6yO+`TPv{Gk0RQ(NgwBWo?**52eG1s@U_G-mY{w zrSD$ich$i3#4786&Q+;A%r!rLul)&5> z=9cK3B3vK)DAu6z{fRhc)`V}T_bO=uHPs-QVh+2emFAI48!0{w?n%!7&JKvCwnc9& zU?D`xMkNy2CNH0iM&?-*49-yL)F+;J3!e%?JA-iZ>6fcr&B@Nh-+nG(S3c_#B9;4z^J|+3Kni)S|4h9ed2EK4yAZZ_jWS(~K z`ejq%r>c(yjDCw;GF>5A^S!@bVeLwxTr%44_Ll?tS;_UktSG159Z{_st=g`?a5L$g z+O;{LPQF%sB;AH?5H|X}9h4Sa3c+{>L|(rhj3PYgk)nJmQqA9*mJ53)@H#gnL(K=I z&pRhvFDH#c>?yg$-SUUMaMfO%m}_WX$-RpH)z=728MsW`Sz;{GMknt8EqWP&#bRr# zPs=6eCchTPwNbBTO_e{#VjWzLMa&22XS?WSJ5ucQv2rG(9_71@GLBmsV&6y4l>oEo z3s_ME1?I^!;L}Mu!<9GeO~Z@*V`5Y?c&A~EgNEZ%om<-Ua}X)w!~BudhN1FMPC%+t zm+Zojw0^28_Vhz*$1+1SWhy2+FZyKRPG}CTIy6?jYp&KnRv`+r0SK4t)w;@mjl?y6 z+JIdDL-e)k6uG0t7qL#mMgpjvFme(KU%t(WPiA$1zY^ z;jStnBIYK@bspfQG%p%WD(#kOgobPP_azme%6f0>!{t3jC3%7NqA)(t?m*3#8+CnA zSWlELaULRCCEsi5RE+Nxa(xuP7}wO1sgr-T;(8nQ`Sa(z&)rwqNEEupd;Q140=}Jj zf$7<5`=_GS02#_}zcgl)kkq;kv~;%BI}iJa+(n5#dPvG@UXa>@ELrbNu8!NNVF}MI8SDfo z)Buq^B$pDRb)ifRC;(^MM>NQ)ymZf{;R+PM$JtzYWCG$&%FP!^dsum0mHO#I>V4^E z-@5&7&*$H^O+M{jBDUQ}q9OK{-`aQ4V#4hdz3i^%&bRHRhZpSZS?^#&DF;8^hH2iL zKo{T5gLe;>8ep+^=SQo9Z-#_~9Kn;)tuwXO=Q*`W%lbOTW7+RFXTi=$!WkccqWf3; z_uO|Af%S4fu*J(T7iopqU?76(@e6H;ENP?rp`_2x$P+Mf1o&|@8m^TdE0yVFmYNHr zV@lGGIe!|iM)2L>toi&IC@%UAV`<98*4CE$fKI0)o?BIuPi*!Abv24->w3?~ymb!N z%#Al$$Iv;o7|$Jtu3f$E&U`VXkBI{Y3&DMHsvI`-r_GwoHBujD3>d;?+S;E8())S6 zpf@t&_HF81BJxX3ElR@_%C1L@b9+u3nO58^K7;v4xScy{RYI5UaOM{2ea3s$LBp?T z->zLjH2L{Mt13F!GkH?U!n=^> zqu_@jzl1y!9s=XZ*1)iUJo5IJ=h&9o+UOk`h3aheBK6a|4T^SPcFoKT|{deo9 z@66W_Vxd$+^BLe3n>w$>Ge*?mpqGOv(9nvoXNK!!&1A_Tf&daPA^U%o+I~P%)Gb`@Mc6jyLztfD{L3 zR`_?LGYy8`cR;remXy_|6cK7Wk7*Iov(pVT5QAnNzhzywRZZg>b{P6 z%5RPn3mQITzE*vbIEaZ}X7lVf32b2q^F@=aPd&I;1&jkX^AOCC6fvP977wLqYAtdv ztwV-I$IPSQJWW0)TC?MEaCgK-bO#E7P)Yx>{1xIJTua+!{{?z6AwE#y0dxPj(e*>f zF<403?`Ad{%ULqeA%)B)J$P`jpfqq4JCj^ZQY2O0VDX;!J~!W&md2uwRx>_vUi-zG zZ3XQ_;K^wGydyIFm-%;T>!3$=lkc6@WTKoCo4$h-V4)zgShZ^=0d#sR&i!?mbA69RK2p-*x4e0OifK#6H`AJPH?4{8B_7 z()X9Ej-@)50u~|+rt9f^3pyeVI!Rp#}~Cnd-R#rzceYCRgD@jo#r)`o+-X zDN+~pbLIAXX#_aIF`>w1P8(YFiRNO)OC&~P;aF(Q`V*!n9joll#b3BUBiJIz!MT-Fc>Mi*;hU7pWce}2m=z?W6?qi;TJ%x+cm}t-sA{TV5i=2I112gGt0Q~g znOpa-uo&F6WP>2gMlq_TI*>F5B!1+ad^1*3YQS*)1Xk}9&Jc}o%NkTYAv|zg_?&=R z)3yom>*LLW^yQyepf7+7FEp1K3peo6yf(tVs4KAYhx>n1nKJKxuFJ6bCV8~h^^w|? zm3qP$;(4rxi;4935a3L`0j+X%a*W8GTVU+HBcYD!f$CVMJP}f}&eU-~{mLK4rxM&- zT3WR6)F&OJ^;-Tyhva?qFo2(or4jN^kt9CKz)mFLMH?D7PdC|ycxm-)UBok!!1kl1)4eVur z4#eqJV6tGQRwG@xj2@E|qHDxdX@IK{?L%?TXt@y8ay(gUtk{!R`)&i4@bCn)+H-@= zYe)^Ju5yiE0FT{w94b|$1vS_3X0k@0qeTUqPYy$V0y%8!3j%ZnNK?h}W8jAgD<6QQ zq;GUoAE?F)x!BB=7?VS2q*F z7}sFXx$iCMmMrf-F?E`FLt=P{0XbaxDmMn~!TTnlyP=cza2fC{Iy;OThqj;IutS@5 zGUurj2G|U7jJOXoX5-7K?U~y6KHh!M`le$W&YO=HYr9({rP+Vc>^F;P3U@4;h(%s# z+t?`l*;)2tHmJcu)pj-9AftZea}jTFEv3keeT}m9VivjoEeVGVpEG&k4|KWi`H=8N zACsQxVnJ+&L79+?Xjzp|zOVf0OP5zi{N1Y#4K-I68WnnK8)x`^{o*&=Q}lV`RAq4% zm3~_<<2bFprl|H#$G1z%znhb4`ze$jInv?^BE8+~Svi%5%b^t|^jsX<%=K-efuGews!f<+*b)X@wYn)<3*JSxgYhHiJt5kcefhFCm* zt@z;;o@snXW<==>Z61TGMcrv#yYv|zaCT4f)6+gt%lY6^56@V7SSZ&54V4Fw$lq)Q z7|sf4`!Iau6^#Son*tMfcX3s|9g?id4t)0aR`WH3e@&z*kEfc5lN8vY(76|SeddO* z{fvN#7P~$!UmV-=Q99P-m~$y)Wzd3G=QGh&-P)4HR#(ruQQeLkfZ$FWDQ14CfO>1C z<^WGJV{$lTgi$9y{&I&iI zE|hv&x%+D;$X9+WI#%L=Tg%9!w^XJ%mfUz`Srm8D=rnU0{8|4jkeNd{{Ld`)A9o;> zTt*3XPjb-QuJiYg)x;n9J5glk3#pxVp1Wv=*$V#gKrw$3Ar+|Ewp zp0w*P7LVw>p3H5VwozA14Q#F;4^&*fy!ZGEWhJISG5&nUs!z`)^6Yd-0|P!Zv3Twm?RoySK@FdkoAA~IVTDT#goucpm5SeVezD!v zCPwQBQkq`zeY4*l{&ie<8d0^kt?P5~SLiHLu50#7ta@Hqw?>+Ce?_iuN}BZ@i&3+2 z=ohE_V~6Zd#!|kGP85MI{|^FtFDS|xXUW0Zn}7auZDAr5^Hulhuwv?lsawvBpH~`02I3GZrUKnjWhj)bDlGl$Px>u}~jW$olV`$R&?+qjOEFEs%H&%dV=j zyVkVI2cBkm{DEf7$*&t+_P^z=h7TS5etj-s!bs-Y+yhV~ydsdBRP}p+ zJp(%O|6#H$ApdCSy^s6R%CMn|fKzFeKT4`b^=yBkFP_>p`b}6^84`bap8Im7egWVF zZQt%a21+^cV;vqIrOE8wv!x-@2X?yXUX+b0WxRb~^S9QB-f#V{(h~n=HT^gKym#ek z%CPiWh?e4dG}1^>k8&YyZ+E1--^3G?N;FyLqT|03%x!=miE_hFi$2b6A5 z2|>DJXi!?ZyK9J%?jfWRX%G;l8-by5Xprt^NC5!>k%o8f-~V~MeUA5w2Om6O?`xg= zJl8tcy7qNQUF2YT<|iR4K+e_*L}lzKkmZKfOYlA;L1{>F`-sIrDbUA@z_kHr#WkZe zFq9aup@(fzHkg$95rwTUIM84GE~09dVwj<1Ya8yb{7C&?Zo5U8%Z*lIR?@V`YYU@2 zf!Q)`JI=aZO_%ohsJas8je29lbtC`rhzc)h?EkEg9JxXnlpA8oY-^e{)MDz_x;MO; z&JKc3q}DkVsVbkf(py{JIa24YmTCDQz`oqk{1Hxqx&mmloc&@F?(M^F2X{guyF z5h*T}E2lPvR75P>3l6PmVH6|5F(43^nWMs z|Nhz1*VDs08R{5^c+Td!PweTvKpxVY!whgQNO)yDgDF|fj$x5AO_OQaYc>a^MD(F( z`*#MqoN%-eususdRwL-1+>zXeXoJewzdJ<*U9BU7LOFegDgO=nY9%J?aspgmNJ5-9 zMnwN@n~3| zEw@$?J!r~piLkM!%{~6r%%xko`*D=?U#s83u{AN_#DL|;-&QrVKpZ>v; zBqM##hi^^0`DHv_J3yAV9gXba@RmffV!cxtQ0Ja z^}H$$IUhQKXCh>!MMJk#ctpP({J^@|5{Jt3?A}3x2>f}`+Y4f{(zRVx)tVp%L-j_& za$N@ZP=_*hd#!VP4)jaU@kohN;rizVOD1;Xq4p+u$$&RH+Gg{i>Rx>=IYURF8imJ) z1a4Y>B6qpkP2mYR9R9&a{Qe$2!8bN;cSb~x{lo@Q#N%`__8PUnAVnz30usQy51HnU zo8g@eK3ThMHM=WF?EE>@dAS@)O{Z1y(+B@~3S?;d{8f426FP1#uK(F*9CDwXPqc?h z!I(S%^^)}BgAJQ$J0*dLXl%`L6W1v1)ys&gY$A``ud2}rEkNJ|!kg(tJ^yHJzon%K z`aEZ58204hD7y;>fFLfd5~A&2AR{C_O6c48eiXat8!WK!1bJRn^PHU`@QA{U3bM!( z^t>l~C$D#$)(oEXn{Xy}tO5I?9jFRV&ucaToi0ms0!=S5yJ(lP8RX!1*b|RG(m+R~ z1?>2bY7*$2=#TTimALR=1E9jiz_WLe7S^g)pfnqopablFg}lX@9r%u_6JCI+r-SIB z_EJJU#vJ;bJl*D}y~RB-7BHvmV-%b}v_=fotznTaARZ_vwyh zVnUyIXb8wEtJ!(B&RMY4z%->~Q~1HBx%}W7eFx2(cAu!~^%;fcS@(%e@P%@xp13&g zX`KUweci-9U>9!B@kUSkIR^)H)3w(4ei#|?wSJ-wEB{B5YZW^&+Pkh0HFx7jIKdYT zpeSHQ^5)j-N<3U#e3A4J@x~k@o)1dS{)aa%6Io?LaxY&FdUQW7-~IrW4KiA0xzl?a z419UO`j_g9@BFiCf;Mt%8ekRQVG%CC1^7V1&S1IsOFP=SL@0_X6xhsQ&v^c8%0qlt zW^N?m<_8Jnkl|9=IUGf>R0GmnK5S~Dhs{V5Mmm{{G~PD0LKf|KQ%Cg;hE2E6{2DLO zJ9LWre+WQ@y-Lf=J#nKFeHr2@bA1`3_xh-P*0M*fhg7G2l9Q3rF0}g3eO|lVs1`QL zx>#Kirb{G39&ty-ExGBkvj{Af@8BP^B3=>gY|L}&$MdUO?;n%;s!aVVo-Ab=u0yC) zw5&|EI)I<}itFoZJ5pFij5*P)OkxVYapQxI2{{gk|;mVF=!$tcr74bFf$hhtheSWe{$g{4J^hHlS z9P*SY*8uMWW_w`ZF#5gJo8G$5O~IS7oxBU&Ks-0(mV;iw=V=G#wMIL)$(1!q4Ds zurEX&#ghIv!33Gib0{dfF=LKz-w>kt_XAMT+*s?kzRdtnnG-8%MQC8|nvGhpEWhZa zY>0oG(CJZ{9V(|2SN0U680+fFZScH#T0)shh zMwXd#*G%(|q@IpRis*V!6{CgasPWAb@RKz8`{l&c)v1`71sAoH4QZd^7O3fT)75i{y`v#r1R|wYT{$`1fb}x>ZR({)NCp1!tr$AxITVXpq+a zr8?NW{xG^Xfw@D^@P`=UoI)u*i2b-_{aP9THILDDiEalaxzB7BO8v<#PcI8F#G_4= zZXyndHq6q&2ltFRq?WqBkcftoJ)rb}8onU4f)^1Jf$k{AKO@Y=%zANh_3};iR1AV0 z`rKt!{;_O<`SN>!p1G_Qa7?>tWwLEf_YCyJxZgA)?&k*5)RgyauCDmvr9?DuiB9SZwijdtNMg5UZwT`8 z`qg415**wt_WMn~?ZMn_Y-5nTiTby4skqN$8i8lGQ1EKCF2gU)O-*LI(a1f6Q1G;(I2biCOz021Nh;kmy^PFTic zF&C$6nigk|$fl~y&ap1?cXk9(3~TJpm>Fn>?$CFr2s-(-e+bhTH)Vf#(K6#%{JE`y zDuWTA2sgGZ`(YKoiFj1-aHW($0wr?74Z`l5U z1bBbi16uKVI_J~NKVt5#>8_~?fvC#+UQu<9=`DK}H=XJC4{CuPoE}6aS5g$Q|4obs zHnE{kr=!AsFbfC;9@e#oKbMYrX+(z{>^oXH8Vlnvvd^m2UDqsn>sRu%6_)ZypzqR! zuRc1z=bugkrR^``AttDQ-c)}4So8gW zK4bDLD}pFM>NbU#1Aq||3oqzhaDF4po?4dB`^e69wIk5Z-ulVY3n%r9t^c8iIH^ZO zh?tkzGe*EYhS{$oX_-}LZfG0=vo%yVl+9yy+py!UYAcfj!}*G@P^gsBif?V`{IfrN#V_r#7|TKaL!L`YzsB1 z$5vtIq;HT+Fq)7ka4i9?#?n{jk zZ)A##yg`N3mA0#T$ez3k4@dy25TT&AB&CWo2Z`C>54bz^0P45n>Wa~n`YYI zBBMUvq1I;?v4lgpxt!2vIq^Zv`?b^lK7&4-^R2?Oy|`Qs2u<<8;9iKtx(P%d%{tDAJaNj;Fx)+rnKG9H zT6afFt2?g`AI-Tg>!%LdCI{Vtkf~Ltz{-LA-{7`_dZ5T?$i%lQ!%6Qway@rtZney5 zR^(XcL1H#}qpaRm_3%84)uT}( z;m0ivMOB0Xgp329>)sT>iFGSCg~f7ner9-1i9}im%gZCW&a<1u4Tf>`8zZb(U+>zM z#uRJm-bTrdezspG^a*>=UC#cE=klWDqe5=+N~4P&i&m-7QUZ>YbrfKP;Q^=@VEI_Lz7p|{4~ zV>2T{>&8%hfF{S&{>%NZX?nGXj)*tpl5EC`76Hh(9=VeYoonoZHAeb1HyH#jON=jE z(@kd{W9)SSUot8jrD|3uY$qJ*Q&JAQSb(@_uwV4VC5z=@VF{>A@fp5;y=+IJU}>ky=LWJWU8yFn%2$2Ji%UYpy!-6%{6wI+M{q8{_N&?3+V^XQ4aeug)q7soT#KtB z9vim`>T!tLl*gR?#2}{#PEx_AYv1VFF zaeOEhkxr70c`<1+kxDLb#_+_^j;7C$#R>y%w#w}^-2z1MN1kH`cpzJ{+q(I1d77v# zzh4}C1uiQr%QHwS#}8vhem5W^SJk~tteA9X~L8DP?V z6nf}}tV*S}T3ZTBi4SDnhXZvhOtGgOff$S^ACe9_%bO&StlYx``{i05__>I?sldIQW_?FOv#jy>#LvQ4F_w@>X znr}~$wRmRhcxjU}pt_F!c#(k3`yQ8*)~y1*_r(IF`^0r4vfY z#zAT$lrWPyMNNq$ zpZ=Zdcoixd-FZPDT+A^!cd@*1cGoE(%>PB4EcV7Rog=|t+>|f(l~Hg|ga6z912%R- za-D!9MajDaF@-9!d>sQ#p4VC?fvru|ofSy5K6#9flQ(CFjfVy{@tYQTcO#JB9f5E0 zeqe6V8X)4q+TBG0(d9sS8;c2>sk9h1xt|BnRJvf z>>vjDI>=i=^6!N07Ux1VQNY%sW$P_uitrjK*&XxN2ei(JbI z8G(M4d)(lghdcL^OwU|Uz-`Z9Fg;;ZfRpZAe1(1o|A#^A7e!MGOA8e?wv(Bsa!k!- zP1SA-^!Ib1N|)tZm5WABBiF~|QBgy&!zAi1^X3h7_tM)VOA<&9`j{Q@6|Viv>IO}c z-Z(?P`M`W@pAIVmeS3Vbj>f->On1`V832{fbbb?VLG|$y>^mfHEIsum>XKX(xlPcw z-jRQ^RT(FR5m!IS1WeaXq>92x zv3W+aVs5yIV87OT>Sy!^Z;2i@AI^>BSLUjM_uq`=uIabI6!=|M0_-#)=ObZZT{zWq zOQf;AScSDdmOl19U!2QZkdX>>bF;pi*kpNi8x*`iBJDUR*p7qj;q$u3-TiCDHEfczu0CEyiUEpokRy5_mA1Kemg9(I)e) zbsYnlI!08aVhnONb8hf(ZouXK)H~=bc5S}-qN`$z@o#UXKMCm*A+M7zmp_a4L%dm* zf3odwaAjaiCd+(Ie!e%ZjlRK@1$nY_1=b)37lP$g0DfAeD4NB<(oTUJqPAaio03M` z7dOGK*4AG6^YwS=d!o&1+YL@at>tCx3gzrW z_44u-^(|$*HcO3T?m2M|S$p;z&uErvk^8)3E}RJI-(;J={nhuaeyK^uyi#Ox(ZgwX z6}{fW<@Mi{Nq`7486Y~}9akkwX#COAVt61kr|RDlK6scEi8nzs3IfEs4Smlm{IY?g z$<_rvmd=pvPL{m7K-UW076r4zuk@dff7NsU)PR`)Kh8mkkmu8`YA*#E=3M%_bC8j(T@oC@4(YEd73mv|Vmf^^C$E4m%%QI?ze>+UK&o zC7L)hU%99&yl%b0#=>q1$4o{>mXd?@CsZbaZn*AMpro0*Xs+pz@JHU15p6D$I^nwQ zOjVOqQX3#=o~Bix*0X$ha?d(F|E+&HNWHYWS0>1G;6i( zIE3E>5;iMpEl+f6_1gxxN6_--vISK6ew_Q^#=r{@y#leLm4>xHdLqxAD$Q&1#n&&o z@0yJJ`fZH=iJ%8Ef_#!=|09%END6Ap@9D6Mc+OtHgT>DnZPNVSoaZgD1PZFa6QZSo zmfMK46e{;IHmiE$|X;1D)bN+BAIoTC>H5l(s`>5<8W%yK~#QFH=# z5zJo=-z3;T8dQmk_$|ap?+Qy(wni@DjHNzPF<6}?$K~V4qE+2$PXdXpHLWs6*h7~x zaC?*vsf;I&T+?K z2B!!L9UB&^0bB)Hr!*mGlP)e%oRWP|aT;WK^^)N~T}L7|r4tjR3um(Z1sw6I82bE3 znkMXq0F45pB&S{#Yk&M}Zrb~$`*W3xa(R$|V32-Q>am6K^ltd-W@<2V?p$d}DTp_f z=Yrk`$Dv*CpA6Yswg?CDy#*XMIRAxBJ zB2i)nW^S@oZp%xnruUj{96?i9R^_%&C?WR|6rRRAcp;1sW0ZnJI+D4`~apl{t4EnZwCT-&fx`L|*W)^0NW)Z90VR5JnW0vw0hakKFS z@+>?#R)A-&#~pM1f*CSCePK!ZEXKREA9WAC#nBz_8e_7qK^a4rNJe;n0Q0Zeo~d_S z-D?{=BL121rLpS@Fvma>H1|qbnK>wr%X53@u&eouJZ|#chRWf)-e$jOBJjPm`t#TQ zJXWgg>KHwee2%8V58NHn3=#U&uW#Vz((K$>sVYV&#!0_BcXmv;@S4Qp8(n2CsfV&X zm1uoRukksH#g-NciOw{iS>NZQ|EE25`svhSAU_AEY%oevINAdUV7!;+h#T=Te!3;y zBU33!(e^>t>fo2v6)&r2Nw|ra{5PAHOO~X)h<2= zUzuK0KU^L*G`g6To3-v34|{il=BJi~N-y=aOiG=YJ~k`W8(&=5iLeCT2U=DHF^-~V z1#^&83FCP)@6*DGFORK_vt0R-Ft<^hT~{$Jjuow)^@LDFOT5bQ3h}rdpMN^q2}=oa zWz_(iA@oT8BHksC!NiX~jU^Xioj-aazX0#0| zIqr-OvfqON0!ifLDlJvxF z4mg$yKI-$z1o*fRN>Or{WV@;wI%aVWjag>sk8W(By_cjn`?nbtrH+IR2JdwF4JKli z9HWI2yM<78GxTS=as#Oq0IQxsoL`J)lAuP2 zk{dJ}_rNH0Z~B`9JzH+{l?bI+yW`=Ua=tPO=^YHngWdmpY!C@4AX>p2$6kshx0L^B z4>C?6pEog4LT50eF)9({YL&dI58XTWh##L8yGja11i`Hsy~HmInUC-Qk4LVDguDL; zS;nrDe)tDNsSavfB|H3|`jkt3t<$;6RjaGb{O@NE>Dq{*R{R>w+TFfk62jTfuT3b) zkyNX&v%kzntkH_X=jht@TM`L*Vk=vc*yN^_Vyxu_z|HPf9a(GA_l^3 z&)E7XUV-7g!-=}s1A{3-u}HEOh-RTZ#bl1m1K9<3UY)PLq%=#N(9+a;kRtwp#LyRJ zfPdb*iRYVTS##jk<;klsLsiJOT7%mUa?9m>L;Ai3Id!)@fw^6c(J8*8OGZ)MauKOZ z|xBHUjzSFN(C?v0yZHo?&RjfE}@L+<4e zA73Mw%Ll#FTIN492EHZvY*<-=Qu%&5eUylzTN(ag@&|^x?VkFWEWh&3;(siotjOE< zR7MLm?%j$--1ur}kB#O*cvs(u|6pC5=GtFWlbq-y4L{}dO}H#kJo}enLdb)MjIO+@ z1YE}4h;y~{g26}nC$;7hK`9TzlaD*A5K^CbLmyV`-Awpn#uDjUYVEVGpo%u|QM%gF z)Dn3raW>Zp(bl0^vBK^c(V2SL7})e1vY416L8UK6nXhpVN48R`c<~GSb}v5QVc~Tc zQQ(^RJ$$3|3inlqiOe9dlH$g01Cv6Tk?Buemfpe_l8sihfH1V7Rf<8HUDFu5z3(36J-H3=oS` zSeISw%x&>EW^a_N$mTKrc#El@-^s=`EP6BRcby^b)oSjniY7|YA=?4J|NYZD>GvN- z2|PlNn(Z_GnN|3_om{!P-78I4d=Yg2%dCzkE9ZGofnFz<$y4ayW8eB z`|9D)%l-*dk}oEcu@r2BUQSf_w+G}#+wizz8S)B)<{0b8qpEQqWtc-3(PW6%kegKd zY@C~1okp{fkS2^kvxu`q(h-$=fAp&~HmQlm$x(cPamZ)5j(2ew*Kt_i75=}YN#BU> zByzv2;Ynb_X^efr``i0>YzWt?@ggoxG#UFJTFNk@xq;@(qxyE&PoZB7T*QZk@;RSi zn|Dw+B>EGuF!R^l?-5=rVRrG^jeS;~YTFSWby;d;{8bQwSizgEahJ_B&X4yBh+zSk z#HZsnjekl{WcpV%+EAr&ZRR!7i8g3{Q3G5&+3xog7}F>YpknNO%OUe~FA!N@pUDd0 zPB2mFmsEkGlMSo+X2ew?_(2dl$pDiOzRYi}3Cv6j72EYL{tlwKg93N<^DtE95|~C} zwYmjsV#^+w@7I?GTD6}d|IPzt`Xk|Az$P6P%J5n2P9`=}bEFfypl^Dwi>Co(uP`1u z{+Rh!2%|Y!_}(|>K1Wo?P#4Cxq0P-1bcx=}ZMTjc-C`GX!s08^^vx(fJ3pFB`km;~ zqWCk^?6P<>z3#NKsTzk81&78~)7@Y71-j)R$y=C^lVU>wHlUdNXDr3qR2rANNBGmO zJ4WIuC**QjKg2-7i_QLX^(-`r#Y1)9z^so&pBtb1 zlyzOhsOGf$KqF@(3V#rOsz2%8)~*SI>@ZY4rD_s*%3?rj7*~~xy}Ncv<$s3SH(CgQ`Q@_q8TSZQUuXFRy^N$iS=jjikB%*8cB{Pilj5K23|04jCH^)_qRK` zDPwD~v_0WQFo&XkqoJWeVgQ$sK|Ss{SzhYWeJ(g+vFe{CUr65=a-*3WEg?FPfz)tM zu5VZ2tRA}XVE5<%mb?z)xyWyM*#wy5@iDC;-(>zbQ|0ABE}2pEs|rL4cGT>|`vOnz zTlmh$5#7A5ecsg%<{3$bWrlS!mi1_!{M$r!MH`Hay3Fg+-EjSBjtLhETeQtEI>R^FBe*+%` zAZiQ}8cbd!4*0Z}mF-W;-56=)di;}p3JD#HJ~b9H%M}IA^C@oMbUSvmEaBvYl~4QI zZ8b(+0UrHfA93J!cBON9F3f0uVEi=_8QWB4Z)n`2U{P4~2R0Qc!Nps4hnsy}EhX*P zeCcX8xpSg^K=K=Z(G!n=O+qis-{R(;-(Qkj{{U9`kZGSqO%bcfj3v*KIdzzX44p?c zS3j=$d0~8XEAkO(?$)QJwx^7Is$1|{%p3d^wxH6|Gi2MQD`>QT;>$R_fgy#0U%pwQ zF^9{v{z^ph)u!~5I9(l`6$!FqnO5}FM?iKCj81vDjxA#Uto#D(KE7h3RCNQ9tpB6W zj8kZ%e6SnSbayocHza6UEt3NXXrIlxx6vL;FFPgin4&{Ly#Xr4hDI3JzvECU$ zmHI~AVRm5w@K-c6V)!lnLr&14Hmg%Fj&hW)&)wXN`^#OCVVDrDg;`zY4{qb&J!={3 z$x?H{>=(7X4%IFO21~WQlQYzs7h}ZLz2o>>aF|!NZruN>6z8b#!d@a$g8* zw;X>)B1>o*RXREH9Ug@51?b^Lp3a{@B<)QgSJ}rN{btT4$7y+X+B0t^IrZ)N!Lv)1 zVuVcGl&S!JwAWbG>y#;PaR%2r~E9+Y+#~QYW#;cOQgoOg2sC3fKYCQ2h zC|{6HuI~P&WG96na=zQrdZ*AMbr6k%aV1!k$sNz*XHw zQ*$3#(Z&@o4}7way?d5J-5i%EGADAGf1Y}Y^j6dXP3f4UprHkmx{4nfqPZ&1HZ=K2 z>CbH^*`^u~^T9d!oAap&;yW|cjd$;1dbd5b%mmbEwkmM~^0hNTl3@qWF8n{0m9Zb* z)hy>ee)vN(GPa6Ha3m*e9uCw%?NdL%p8@+M86GpOGxAQO;sGH}bG+tJ%SGo4;vTwW`lafs&FoVQO z03RazSYmgESCR#J)o|z1R;Bu%^`6QVM6}*~+(%>TB`fXDex{GPLHYV^@@xE1JcWAS zi7f3q&`QHx^^Q*D9I3#0u*8h}I@4zGrU_w&lS;X(CXW(CZK^^{7?Of?6^Q?~Y+3L=4a+R!L1^59lLVoJ z^}s%+O;AZmX%tGt=oj$Uucc|qm`BHZzrJ;08}6oa|>D`NNAoOIwfW|3LzX0LC%eZy1*<|?-2kt7rDBqx{zgV_rW#48LUd&Hz*UFHgnP-0&J3dEXt09} z0NOQQj#e!+1>FI|FmA>WX3lt1hFX^M#p8f7JHFz;RjN|^F8lFA~C%NJ! zbLyCynvxMllALb+gD65KcKWg;b$(BH)TX}?>s_f2 z6CLdvg{bQh=VvDQ33$6ixd8}PV>aZS#GsX9;l5^62;XBsu=jMsS9j<0(+@0vIMMfG zh(45GlOHanx7dM%{P!o>@{8301QU3cj~!Q}jaz*3YHMh-41T27s>D}1O^mdV<&!)h z(@p&mJSJ*rLw!9>kkZJVqO~~7CKNms&Um`rf;O!5oP{C5=CU~GD7LrOX9IJJzv=R} zgEYaa(~Y8!7$Him89SzV29;_yQ20KO%-kU6{R1EZ7qKz=E%l64ykpo( z)UN%q>2o96yv%OZ1deDr^H_PA?W{dLE!)%b(Xy3_W%tto5@OF$-4wRo2DdC=p_O*3 zmj^x!I*)dbwqt8_|CFFKdsO9veL|orIW*0~u%h3JdIvfierVyz9XuMcuCVQQ|9y2A z^jsfEqx5;QgvCdYELJ*6&hcd7<410cw%P6B^qIE%_PM5k^JD#mZ(t<7vZS~tzv^kT zR2k0*PdB#5>VpM+yKF%et8o)#?D{(iP zdP^CHK1U7Z7e+yjPQglOz24q`P=f(zpOUHJq{`q6WmjEAJvI`4U{GTsy}0poM;k|e z6wL{*XIRMk7PdHsH0!eL%R+s9IRc_i>Ln^QL-j9aQ^@?<^rS25>RZ)bG02 zZVj?&l-o|IzVzha@m@Uw-Nh~-Z-A+yqol<#)NK^X9(*!c3QdWVmq2RX93O|?uB!J_ zN#@OJ8)K~o++uuDOhqPQK&Byv+=z5^h!fl2Q<0&_)Af=xoR1b8Zu*arYWrZ+S8S6{ zjP=@y@r8_3ID_pVWYX{MZJ%ZW2oMFl&o_{M5`J0SdM@)sma`p{Y}Ll6w`+kk)tQm1 zoPg65w8{d_Zo#WP$%*@*WcD!7JR0ky91|m6I3Ybm;uLlndn5`O9tkQew^%gw(w|raN*6nAps1ReXYi z|NSl3gKKy{KXWcQS9(HRLS&QM(&TCI?c|v8af{!`#f913&g;Z}=KGQAhf_?RXDEJc zL7hU$g5DoQg6}^kJYpf~ynfz!xuVURrc(S)dTB`JHaz3)m(2q>>BH&*vW?c|oWMx( z_Pgt#((~DydAYx4QUIBc*d6z)&o8`!6k)2;NmY1^Kg+=KQqe}>B54$;mP;E-NpE?` zA|VqQMx8C91?K^6^IOyG`yy2j#R4v|6=G)V*buj{y ze|!nR7}bl&4hnE8BLLBbF!xc_NO4D?b1VEcB@g{ZiPSeGmU}-Wq^K;U4Z_{r+=&_bz)9n*U@-eSnLsf>Kwf4BHlVCD1E-q?uj4*b@Vlo8wE z2nTUyXuIP~jE(%B_J(|aqk9EV+9=|{wvFA&o{X*YLIauXA(=(TII%&K#w%6wb;zM=MPW82&;I5^*Z zcH!V3VQ9-reX+x&4Dwf^)(wq8b{t^d$GN7ch^ z>M#oj(>j80q=mz8h(0pBc0-WSXjn+#&#h_eH(N%yd3k+VC06K84E(M2oLX=;-EHO6 zEAO^MUm+PhmBwh_XY+(}i5Dws1 zL-73X+*4M5^JCtfodVyK#MR}iy^hXI+b90=7hM@< z%`QvIh264TOO22a)xTyD0GXoSD`Km9oNOu{xt5)pvp$wNBLIL&CA^u2x9S46hf<4w zAFUvJx~_^|LXpbjkKW30@c+n&YL%9@zgu#EOr~1>Z-fyt zN(M)dUC~nvDa)Ztx99}YBp$iPmMdv#WPmW>okk*216tI~8W?Xh3g!FYC#|nu>^hmz z2_5TPfEN(w{y$IPAHQaRKLo%^{#Jt(LukF`*1xWZuH-XBv(FZR3kBoJh^ve>;Awn* zxZW%*jI}K6&f{0{tY>TX-QKWCNss$uc|eo)&>4S9Zscj8(NjTlk~NtNjbQ@U9;IEL z0*Ojb(Bj8H)AXfkPal=LEUi9b1z>Rw%NTkP{gpccWp;?7!FD!Mti~@+_fgrApVtZD zSPRo;>JZFT2^cy!)4|3Ki+KC}yUx`;0q$Qq3jOwI2s3&yxCBrCiPh&gUdjkdLOH2s ziDl^5(A5t*y0eRj6TiIB%k;SZqn?kD4m$D`O-y%sex7gfNkis3TjoxY|7fnqDMV z?HTu*yg1GO`IX`{48QKAU=Y+MJR#D{oVXT8xIg^mE(X8ufvPTNnEMin=PW% z$sUtQri@tEg(rXT)_U9XwBOwoN9bJG;%D0wk zl)MZ5wO-DPWi2QF0my2MI7@U2|hU@sZv*nrZ|ck(JQxlS-qxz3&ATS7PxpYgsj z)uLBHQ6|}Fj{K?RM2(99dFtgHvz11?EK;Pb_y30&o}8&ZAz64zPQWXOJBJhfe%<4i zhP*08-J3A71RL8tJ5G65G$ClR@lc_^@#J2IQV6-|_%a^L|3BR^_|D5QC6h-y|MeMq za4Y-jrwwA3sAp2te`8>((dLft%C8yRifcyhD$0W)J5Bu!C&U@;Pl=8^A83V0r$yjS zl;kY~rhcmj#|q=+xKlL;nX4%GWMsnuQEB&H+rZyr9E{eeS~@zZbPuZqbEXDt<5+XV`WP zcQNNTz9fStgzdjyDZvP2$B8K#9z0fpda+l6qdERgE1?0f8tV$Osv9B#&}naHzy^!rFdd2rLKUSY+?dk?nXXWobsDKpjABRR4b_7@*C>F9wi~4RObVFb-oya>lF6X^Aj9 zx{W%r`y<>S-|CaV^*_)B%1A!pcXgGTcp&w7>oqw7Cyj$%CnwV1eQ4{9Z#%3S?A=Sy zvJ1+ybHCSc=#1wLQiEAKmxD2-KAk7v&Q+#r&SB5tw&2UrL`Rl9g6YFbbF-~E-kp#l zVxq{#UJNo99uZAHOeIX-VExOT)~JQAk%ghZZXXej9xEE~_RDw_{S`R0GR4DU?-VhOI%iYepRPat;p|K)4%1hkYqwuuDSWL6ZZUq*jj8_7qLM4$G3g0 z4;g5;jD6J|Kin+}Ua*|K5dRNQl88i*;AEI)>?J~5(Xvz#4(keO0jEO`?!UT8n>;AT zhSNQj^qD?ZT(L(Z*4;pri%s{x$ z*7+qEbt8VZPS|_(v8_az`eQOZk=u|Fh`P-RHaMqU-&#>@eu~*eL=JNwnjt^Og7EES zp$g5!duJ8D{f{0?<{%+B&Q<^>zl#Pt!BHtd>kRvkU9;>}a0ngTt1q!nwUirBN=!m7 zX+k+>4O`u(J8zSZq7j8ZIpHToUlj#O{ zt(Fd$MP-| zp-GQ5Iyo7S9EibkIOM=Gb|?uAwUAJN){9m#wcNp<9x9nn_ZJbOCVIOF<}nJn zAZ#$LochPq{xHUa%v6=@2Th2U&5SCh4&_l7NJoe);=ix?TqTXeno*yA82^Rf+vlW^ zOnT*KaEAr8N8wS74Zf0pI71RUvQq~DpmOJ9#QLo2vk8zvKif?Qbv)bUn|I&GZyi&M zr-Gm6G?@Jwup`KAQ-VAwTBichP zm~$hzZ|dcL>`uJ&z7c{;f=f;0d`7sex){u>vJ?Al@D=D9atC7UlauNsVaM&!?|uuV zdLAr(OBkpbAFjYiY?{l4ics}FnIQn#hTAL^rK2HIlcuY+xj+-S7ZJhP5t?Q7>0v`N=QiRivioFC!EwhNx@J1u8~@!6TQJa zoz$wKkLKj-wAqCFeq5y^4ld6#EK9M&-+0mf5un^x9Mk&11dXsV#RShJ0n}sli>vUb z`%g!;RC2ZK1g)NZ{F-F32uZNIe{V4l->eOc-21YW_O``y086Fppy;A7_ro~m^>iRQ zg2J_)b6@hRETf(Kswck(WNb9O38lmv1=;i6?TgycYj>*$en_)&C@_sZ0pG~fm!{{* zZ~0BVoSKz!GmcN^x~8M{;pLtRi{+j7rB$ zRDZ)PdbUK0Gpf2IJB{eS49h{2Hi(QcuG`_h&^qLtS|c{t{oF_+TiQcr%^E%7=9}a4 zvN;8WZ$#JRffR2D&(IEe;q>0^end*!Xf`G3DX@iv@w^G_2%EyjX+M0;`T7s&pWhvZrz zML{Arbe#l0s+)(WXeD1nsUc1QVe7h@(+8$IU(v|8SoOiq&%6jaGUfM`Ab+w1JwQQr zySAx?&~gGbdD8e?<72;E6T$Nh$(M{ttK>=3+&^J~$~%(&Yu|IAAY-jvwiZH-OgY0Z zz2)OXU?17PYz~LPyg?^!Od7-L0_Wod&wjzW*?$_5j24N(Rh4_(US+(NWZZ>8_4Yf~ zg+zJ;Wxs_Yo)Hr;srpB4Qp9dYyF~U&9`GD~&}RB6WXVA)-g!`NYC9dsTT#V06vdeG zv!W$$9mCk`{!&cRw2lomeU%DwR8?Zf%wuw*Uidn~%2K6CTB^rLGS~fg`=y8Ta(nT_ z5y)!!+0M!XBOdNnD6<*;N80J_rG49Bt|Jl3#%tchG8c35&Zm9%5$3Jn2hynjD9ixd zyz-hhdM%)M=2(dHwzsFfp*v>}H+WN1Rl)s7e{WnCbx;%C^W^-t>O zQ~FH4Snr@EwtmL2%<}@u*rL)ca>$d5Y9U;>VTw4GUPReJ*CdfKZ<@sB=99E9$RhS= zZq2%+_KOk6(<2C)qfq|6#M`lnJN_;7GLF6fL{+XHpRRqg-mUhZwI*gD*|B6e5}%tw zxGLJe_0F*=T|f`M_CzL(3>9KnQ^f`<*+DM=hE2Z^F)K=7U-dgn!VaA)Tg@X=Kk*l1 zKn`3?VSb!?McITe`zwoXDQ!3(VVbgMS$+`Xf-pbOJDxkkRm16|c%->$d34RT-aJKU z%u%dU=CT&cWjEbGOJ-%#Az*mP*MFyq3JzV-zlJ+ZxHeXHbDrB&o;~)y4TVf^@e9E-;;FHFi|K8^V_sp)i`-bqRt$2vg3pnuJsw%d$-;-LF=1DmcRftO=~ zQ@SWWF%h@?V|JogBFG@|}AeeFx>ztDx5$ zpPoIk*wqyH#bPN)KV#oV9W=B^LeblB-t=+ZnYtTY9RD1n8M`lgWD{=29asV{81-&~ z7+aPfrTvXj@TU<$Tx2qO`E`vVZVE^)ey=o#dmcaC{G-smE#sj*yL02d`RH95D4$W3 zNi&ZLXl?kl7qV2$M__SI-l1LlvUuZsx4-Vi_@j;P=$&HK0kK6&!5`J)G33Fnp$$W{ z&&iCd?z-WY?e4PVoaa|Xk4BA4$#Q?q+rOy^qs{mH{r%Q;dsJ&?Dyhe$d^WbC;?x!f zF@H$gj_rHhY@o+yVs!PRb)9^5*MnYC`@F;P#>Hkn z5XDGpxLZE%9rB=mY8)4)M3>8B)4a_-mQY>t;vOq%bqT#3`$wWv>X`@PAhZ6iizk|x z+W_M^DFNTh%jn~qG|ze!xx9LtmD2Fc1wYO2%xKN@D-~e?qzvkaEBaQW`6J&k+uG{3 z?G#Rx9V@VcdyEl35H#~!n>KZSL-^{vNOd=OuEoA$s{3M;8w*{3$SBh2t?MDL- zyaOd(%Fe2=e9`{#m&wJ6IMWJZ;We^dRf%{N2b~EBEBv3L_Ozs5dGfN9W@o7R^Kc=M zx8!&ij{=-)<>u6{3@~?%`qvS?wIwzpPIz6g$HE-&OGw?#giA9bF67p<<@XZ;KK9+hAjr>u zU|LqAqd&k#{%p(Clig7vK!2d!nHxsoxcn&Oq0BWYW7ln@h{KtiYP$f^l+bB_BRh{_ z6%J_2e79PpS=Tq>PO2rU(FV7;x^ec?)xRslq>f_3BiMH_fQUnH5rq4=jh__f;%ZGX z9*1wu$@M(VbEIZL2*WxvDRLPZBApGu7Xd{`YQ+KF(GN^$idwM)#CLLI!jVwp&FqsIM}OdavH6#}8!l20uZ@`W zOEk_4dfNw*dr;jHw^?bG>3IVD^=jF99mxkzcBC*;+)Qt9TW-N{1f-E zC;Fq_k3r}}{@seFueJW0LeogRNe4lO8}+~l@p2YW`ZMHV0)(ODQy6I zjFn$9Rzdq(`ps{0xn~!VI5Z~=0HBZjHJ5ABzi+wxKFil2tZvWW^<*Cw(nHQ7>p2CKpIdkHns^D8BJ)wuo5c!&|AqZ7}+3MwFU- z$rT70!TZGKvU6>uq0W4Z9={gmnh60zN>*DycS8TpMN23xzsNvs;~^Qz(~hScFxYW; z>0&6kTq&!;2H)9maYpEP_=CcucWEE*&FpGNr)DvyPS_8huQHP;CPKrwm2@FY9azCC zj7moVl4^u=n6AyBKw^G4_jStvCMv-*`tR}Ca99zhE8y0K{4d!IsfAcUs0&^3ZgCYVBy75-`}^fQ&9<} zPdTq9yE|NK)SUZHNC;~iz3*j=Oz~J6V(zLq4#WJW@9rW3R0f|Ae^l{Lu>Dk|34;n0 z$_&v$v3=)kmcD=jWALi5>FLD7D)t@s(4ZkQ z;KnKL5czU2MZOZ3xQuC!+2GQ?WEW}YOg1*}7l^L*f%l-E|6>uAPB;#zHqRs_Y6b82 zQe~NFj-4p`EQ#$bV|{Zz*`32jI?R>;8RKRvYc)JyAo4e#DG*jG{-aIU~zKmQ|sCgLdcs0?k->}`un0$S!`#h1Ru)K6i~ zO6B`unT>LDElG}I3ygVIXzO7Imk~zM9j>~BPrz|0QSl_?aT?R!Rj&lAPk1pKYe`!4 z>*r2z{56U^Y4a3*#{@j3^0oEy#W={DO$V#aZLQY2z)vsOK1~dpszzaXY*uO1k9nfb zfeN}9xAos{2=`+Fq&!exajcaM{mE8i1Ib+~$XtqUDV}keH>hwWIvRAg*DS2eaSidv zu!LQ~p;z^8Jw*AJ*h{vl^_vDOtW5t6P@)3FfnwJdU>xdy$0+WNeSCu9AGD6*VPtE} zDSQ|{f#1NgdmJJCBG3qwP7jrz9@In76?OQFygt`y^d$&7ok{ETg{%iUDpt`P{G7x4EzHD}WxHXzhtaFT@H8Ake2wlWX}SY1)>2m{6w}Cvlc=I2FKMdOp9?0$8bYZ5)2-LjmSOLR{-!y!jnv6$ z$!l-1uWzXM@+am++kBUAqbTn9tuP@Pb@v0Z08f#Ahp&Gq`oYvH#)66k#_h-i%V&Kj z3oQh@dG!^`wx(9~9zU*)3)HvkqN7KY zIEwWgq@+JC9RDaVl}`}cgDTcu&cEOOD0v~sk#>ky{7+C>G3;Fn2Wn%>4}Vh;+AdB= zxMh%`ZIG-TjaoETZM!i35r_YLFXwPT!LY~kFw%mulO}Sh+`8LXOR=kh8s@?AH5AQk zP1ElCnyUAL`CiZAXAyM?}LBA~GdE!`kc}Y%w2evwY^Pm>L`memtiw=du7qWwQK$6-9;x@giTk5kWy+}y(8>#A$5X0k<(pi^Gdlj zQ6;s?=H!JvNzDd7*D6c`RiTee(U_*F*L2)u}J~`o+#MMEotqUx|q^H&x5;A@UlS?hMbDH z@*6iE@Mzi}L~sNx+X{|J-lDxXz6cnPZn!-T*JyqspyQO5q6$S5an&DFZ#I(-F#%fD1S>cF~m-^9?Ro_Cyz4w;e&6G@z{k< zR+x9N`o|d%T{IdC>Jrxy%1IR3F6+}viOqgHJ+9^YE88{9m695ibwE>)ZQ+=Ki?Bz zt**baTmP*!8=HM4oL@j|=k(7r`p-TbXI4CqEzpx+KGyui zt}QOY;7nKAc2!8!M!cG))aP3Aczp5LBkMs{_C6Y0j(JoAbo}nGA`2kf@yTo_a(jOM#8M zWFSa22d;b^CnC;op0Pp#Z>wbEl31A|)%-)Zw=jaudZ71d7=6 z04sS#$FAKa(%vOAS-l{FU31ajW@ZLuKeA}Hhs*OK?H>827q*q`be>+*3+rW^%qX@% zBq?}^rp1-p4p4r_ZpLj!9r%JSo(SkqAlL}FC^(pyc8t1wC-sUHxcqBV{7wZ1)ir1j z7Fj5&MUc840E4+U6YgZXZCO{)b}5}_vfX(xA1k(?nR@BHy?NxY{(I_JXrRX_NYDE} zhOozpo)m!EX4R^p925Y#$<9djvgTmcurL;htNU3J4AKzTv{;)mg`Vt`ZfTZ==^TEG z*y-cHt5;V=sqB{oruPqr5qva}%ns0{8+k{)xD_{>5-+IFPQgbc?d?vA_iFmIbw0<0)+MosLgWo~~(4lpMmbKW};BlvrZzT+dIQDI(#?h-rhLrE?Df=nr~+R`ZP?*-qgFd4z` zczH&647w)(4(S18+%ZOiDd=UxgNCtXwh`OgD zy=<`TRv?1kN`bbBDZDUBRZQP{itVyG(o2GZm@}t{@Oy2bKNM$C-KgaA?Y{0TjGp4{ zc2p7}XR7Kof{B5jXKJz3@>5I<`SoZl+kCh%k55;l$}P>TLqtjZaOVqA8k{_`@b>$T zl=0QwM$Vi*L`oV#&wO zM|Xa7XAK76f{vCnFmJy47;wk;Kg2kw=@Tz}pIgX@|Itsu8rSK*zrLDAb)(+byHNbOURy7AJEn z$O}C%*#n7S7~*|jtAwo@xg;c%D@r@*l5xd2G(XcPXE^Nhc(doYjua#b9yk%Mac^ez zZZ(V3@21^xzIzbKO>tJG>?x$LT0!&Cu^|l$aZdOv6W^3wW@p06^Q!Kcm=z`K`|uZROdrT+?yJPTlto!6o`#I(ove;A?tBm> z0_6{}cWaSEx}!(Ln71r#%53qYcx6>m+eF0*MTF4WeH8Z(H%(n|nkYXVJ87H9a!Ub1#c660$ zn`YVZabMDFg&MOgjF!86g~D}G0k>F{Pa`297`R2k3fF%b>rwn(TPtANbq|=IMr@V^ z$ZEMn-V0VGv#2QbfEZ0g=d4uuck>2#W~@Uz3qe7{pegc_iF{CGC;+#tJpgmq z??oT(mPICbKsdhdm^TH$RCoU%V+;^J=kiPV10D(eaP)>7P@&hKy0sR>-qq9TU&}MsHJ~RE}VMH#??l=>d zufwF1IFlUk?UD|qt?hv`xkcNB>BqDiWOGDz-;D&(-0g2%p|Ac5gdsPm|COrT_V%(B zg^)eK%c3peF;(6s3lX2c$+nSszQ5kFqF-{WbmBGio}ve5B3&0U$R?lj3^xW{^V=79x~Ta zn9})JZ>V1_ZFG%wXk2Mh9NB6r-067!5`rK3KAnH=75>a-ucK$rxo+udo$#i67qE+F zRyPt+_N^ha{>s(tZLgb2?6cXTs{_i2zBwKmG&;^*rLBvvU^H4UBkyAX<+K4TSG<74 zMkQozsTMO=p0grS1Z3Thf^F(Oh-}C}y{qj8hk)_^rdwUr6_13-+h3l?%6+wZcceQ@ zjE_0({8Zu9)|R-C8Nta}rv$2uGf?Kjnx4j%`0GBp+yy;ZTX`V3Lno+lBzI-B`F9I! zGcd8C>mau}(KVH4?NXH9x-oPvZwZw@T2%#D zlA7?2uJ4`y#fFT(*bMdKh4A%sS>b(^-f2JUENl{Mc6P}3pzl#3^xR!L5?}X^`*L;} z_Q-))23F{hT~AN$9yD9&=D~-igIi``^XTl;r%v%%Iyx%-Xz$v``L4*d1lPy^WI+B3 zlApFGGrtY+T4@#QL*lE4hRz@Y(MB5wlY$S#iYn)Pib3X5azZOQjD!L;oPfZ78)#SP zxgdVrewy)k1s-cLfrtPP2+)nSCQW6DB;7uF-#f8L2Is4SQEBp&N!pN1fbopV$qqCc zZ;uWT%J(yBiJY>>k)3@xDD04kX8KVY$cM8~sNGyAv)0XV0}7JCu%o7F??@;TukE1- zwKpL+BJ2nHAu9FG>PP9HoNwxP9Q=G;;jDZ=C-rm}KY%Lv9$HdJFD671th$r^-#^(E zR1P;=Tw~k1^`q$eG(0sno!lWBr$CyvYki)FHdB9xY;HLgQjpvPHG0b=MnN+LublN5k`zcNxf?)%4ZiZ|051XC?i$p*rfg+T%g^+0J)?L;{ znmq39Wz|-5lY>uWXLwI82KtP2qZUI@P|UsI<3$~seuac1gbj2y(g$LHZB^^z>`N+~ zwNtuTO}crz=BCq+deJyYbe#u+we1+MYG^Oq+V|><;b$%aw_*p!PjC;b2Xprqvr$zDA$*CX$Pkw z*siM&C`7xK(fr<@^Ju}DOfg>T{%&HsECd!NI8U$BU2x`LNP6gg0J4tby#7`#HC>WJ zrGKRi`qYzb&R%%IvBCLfN`1PPt5IF51i{tIw^?m&Nw~9q0D7d|+ghTS?;| zhn;vUi@iA2TyvNrobgRj0G5H3qV6<&S>3DlHt*vYfRJkj`TZY^+m(LJF_hoYxOF;h z6O3h;qTRUeD`l9ZG=hm7xfYF|Prke$(1`RwpH*1STOUFkG z^R~CMg`Dpz3Ddq~lR^s%emlszqcqZS)d|#1;44HR-9qq!hS0>;uXhB&^P1 zRQ%Q}NN(ck_h5z`o`rD238NdiZ%lmAtc)lnteg^Nc}gsdS4Pmq9IKN#!X-2h)$Y&K z?#?Mo1@~3VQ8FQ12Hf9q8~Y-0B!f3E?^N}9iHU|M*eYitV8tPzB(ygzpJ={FbVaIY zS#_F{tM*2`xiw&%eNazv3HzmCL!~BhBWW#4&Ek4RK^^Lx0$2I5@{U@@)92hPD{Rlb zP=8$|t^S{C4%qrZp@~}&hnbSkB8@g=pv}`Svu*? zWX{TCrF$fp#P~(XEBUl4j@u2Z?sI{)bSU-~x)%{~5{5r)khOx=UqMSc8EyBsyR{OHsH{-V_K>T
9|GCro@xF=3Ue-Or|f83H4$H&iSC{8Q| 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 + + + + + + + + +
+
+ + diff --git a/tests/wpt/mozilla/tests/css/multiple_backgrounds_ref.html b/tests/wpt/mozilla/tests/css/multiple_backgrounds_ref.html new file mode 100644 index 00000000000..d3af6fe5881 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/multiple_backgrounds_ref.html @@ -0,0 +1,47 @@ + + + + + + + + + +
+
+
+
+
+
+ + diff --git a/tests/wpt/mozilla/tests/css/rust-logo-256x256.png b/tests/wpt/mozilla/tests/css/rust-logo-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..63506dd85efce44f8433942a6f4e54d718a97046 GIT binary patch literal 37076 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 Date: Mon, 22 Aug 2016 18:40:56 +0530 Subject: [PATCH 09/10] Fill extra layers in background style struct before handing off to Gecko --- components/style/properties/gecko.mako.rs | 18 ++++++++++++++++++ components/style/properties/properties.mako.rs | 4 ++++ ports/geckolib/gecko_bindings/bindings.rs | 2 ++ 3 files changed, 24 insertions(+) diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index f076c9a5905..0676df08c57 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -1178,6 +1178,24 @@ fn static_assert() { } } + + pub fn fill_arrays(&mut self) { + use gecko_bindings::bindings::Gecko_FillAllBackgroundLists; + use std::cmp; + let mut max_len = 1; + % for member in "mRepeat mClip mOrigin mAttachment mPositionX mPositionY mImage".split(): + max_len = cmp::max(max_len, self.gecko.mImage.${member}Count); + % endfor + + // XXXManishearth Gecko does an optimization here where it only + // fills things in if any of the properties have been set + + unsafe { + // While we could do this manually, we'd need to also manually + // run all the copy constructors, so we just delegate to gecko + Gecko_FillAllBackgroundLists(&mut self.gecko.mImage, max_len); + } + } <%self:impl_trait style_struct_name="List" skip_longhands="list-style-type" skip_additionals="*"> diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index a61f69483ac..1c3c87501e3 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -2034,6 +2034,10 @@ pub fn cascade(viewport_size: Size2D, } % endfor + % if product == "gecko": + style.mutate_background().fill_arrays(); + % endif + // The initial value of outline width may be changed at computed value time. if style.get_outline().clone_outline_style().none_or_hidden() && style.get_outline().outline_has_nonzero_width() { diff --git a/ports/geckolib/gecko_bindings/bindings.rs b/ports/geckolib/gecko_bindings/bindings.rs index 82732911007..56c794be08a 100644 --- a/ports/geckolib/gecko_bindings/bindings.rs +++ b/ports/geckolib/gecko_bindings/bindings.rs @@ -333,6 +333,8 @@ extern "C" { pub fn Gecko_DestroyClipPath(clip: *mut StyleClipPath); pub fn Gecko_NewBasicShape(type_: StyleBasicShapeType) -> *mut StyleBasicShape; + pub fn Gecko_FillAllBackgroundLists(layers: *mut nsStyleImageLayers, + maxLen: u32); pub fn Gecko_AddRefCalcArbitraryThread(aPtr: *mut Calc); pub fn Gecko_ReleaseCalcArbitraryThread(aPtr: *mut Calc); pub fn Gecko_Construct_nsStyleFont(ptr: *mut nsStyleFont); From 466df01e712ef2640d5bbf749850f892a67a88d6 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 22 Aug 2016 21:06:58 +0530 Subject: [PATCH 10/10] Review fixups --- components/layout/display_list_builder.rs | 40 +++---- .../helpers/animated_properties.mako.rs | 13 +-- .../properties/shorthand/background.mako.rs | 105 ++++++++---------- tests/unit/style/stylesheets.rs | 35 ++++-- 4 files changed, 99 insertions(+), 94 deletions(-) diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index 8b967d54ec1..ce3df3f4c47 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -516,31 +516,31 @@ impl FragmentDisplayListBuilding for Fragment { // Use 'background-origin' to get the origin value. let origin = get_cyclic(&background.background_origin.0, index); let (mut origin_x, mut origin_y) = match *origin { - background_origin::single_value::T::padding_box => { - (Au(0), Au(0)) - } - background_origin::single_value::T::border_box => { - (-border.left, -border.top) - } - background_origin::single_value::T::content_box => { - let border_padding = self.border_padding.to_physical(self.style.writing_mode); - (border_padding.left - border.left, border_padding.top - border.top) - } + background_origin::single_value::T::padding_box => { + (Au(0), Au(0)) + } + background_origin::single_value::T::border_box => { + (-border.left, -border.top) + } + background_origin::single_value::T::content_box => { + let border_padding = self.border_padding.to_physical(self.style.writing_mode); + (border_padding.left - border.left, border_padding.top - border.top) + } }; // Use `background-attachment` to get the initial virtual origin let attachment = get_cyclic(&background.background_attachment.0, index); let (virtual_origin_x, virtual_origin_y) = match *attachment { - background_attachment::single_value::T::scroll => { - (absolute_bounds.origin.x, absolute_bounds.origin.y) - } - background_attachment::single_value::T::fixed => { - // If the ‘background-attachment’ value for this image is ‘fixed’, then - // 'background-origin' has no effect. - origin_x = Au(0); - origin_y = Au(0); - (Au(0), Au(0)) - } + background_attachment::single_value::T::scroll => { + (absolute_bounds.origin.x, absolute_bounds.origin.y) + } + background_attachment::single_value::T::fixed => { + // If the ‘background-attachment’ value for this image is ‘fixed’, then + // 'background-origin' has no effect. + origin_x = Au(0); + origin_y = Au(0); + (Au(0), Au(0)) + } }; let position = *get_cyclic(&background.background_position.0, index); diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index 6eb79de97e3..e3d0a1a3db5 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -162,16 +162,9 @@ impl Interpolate for Vec { fn interpolate(&self, other: &Self, time: f64) -> Result { use num_integer::lcm; let len = lcm(self.len(), other.len()); - let ret = self.iter().cycle().zip(other.iter().cycle()) - .take(len) - .filter_map(|(ref me, ref you)| { - me.interpolate(you, time).ok() - }).collect::(); - if ret.len() == len { - Ok(ret) - } else { - Err(()) - } + self.iter().cycle().zip(other.iter().cycle()).take(len).map(|(me, you)| { + me.interpolate(you, time) + }).collect() } } /// https://drafts.csswg.org/css-transitions/#animtype-number diff --git a/components/style/properties/shorthand/background.mako.rs b/components/style/properties/shorthand/background.mako.rs index 31cd555ab23..f507af9ec56 100644 --- a/components/style/properties/shorthand/background.mako.rs +++ b/components/style/properties/shorthand/background.mako.rs @@ -12,16 +12,15 @@ use properties::longhands::{background_image, background_size, background_origin, background_clip}; pub fn parse_value(context: &ParserContext, input: &mut Parser) -> Result { - % for name in "image position repeat size attachment origin clip".split(): - let mut any_${name} = false; - % endfor - let mut background_color = None; - let vec = try!(input.parse_comma_separated(|input| { + + % for name in "image position repeat size attachment origin clip".split(): + let mut background_${name} = background_${name}::SpecifiedValue(Vec::new()); + % endfor + try!(input.parse_comma_separated(|input| { % for name in "image position repeat size attachment origin clip".split(): let mut ${name} = None; % endfor - loop { if let Ok(value) = input.try(|input| background_color::parse(context, input)) { if background_color.is_none() { @@ -33,71 +32,59 @@ } } if position.is_none() { - if let Ok(value) = input.try(|input| background_position::single_value::parse(context, input)) { + if let Ok(value) = input.try(|input| background_position::single_value + ::parse(context, input)) { position = Some(value); - any_position = true; // Parse background size, if applicable. size = input.try(|input| { try!(input.expect_delim('/')); background_size::single_value::parse(context, input) }).ok(); - if let Some(_) = size { - any_size = true; - } continue } } % for name in "image repeat attachment origin clip".split(): if ${name}.is_none() { - if let Ok(value) = input.try(|input| background_${name}::single_value::parse(context, input)) { + if let Ok(value) = input.try(|input| background_${name}::single_value + ::parse(context, input)) { ${name} = Some(value); - any_${name} = true; continue } } % endfor break } - Ok((image, position, repeat, size, attachment, origin, clip)) - })); - - if !(any_image || any_position || any_repeat || any_size || - any_attachment || any_origin || any_clip || - background_color.is_some()) { - return Err(()) - } - - % for name in "image position repeat size attachment origin clip".split(): - let mut background_${name} = if any_${name} { - Some(background_${name}::SpecifiedValue(Vec::new())) - } else { - None - }; - % endfor - - for i in vec { - % for i,name in enumerate("image position repeat size attachment origin clip".split()): - if let Some(ref mut buf) = background_${name} { - if let Some(bg_${name}) = i.${i} { - buf.0.push(bg_${name}) - } else { - buf.0.push(background_${name}::single_value::get_initial_specified_value()) - } - } + let mut any = false; + % for name in "image position repeat size attachment origin clip".split(): + any = any || ${name}.is_some(); % endfor - } + any = any || background_color.is_some(); + if any { + % for name in "image position repeat size attachment origin clip".split(): + if let Some(bg_${name}) = ${name} { + background_${name}.0.push(bg_${name}); + } else { + background_${name}.0.push(background_${name}::single_value + ::get_initial_specified_value()); + } + % endfor + Ok(()) + } else { + Err(()) + } + })); Ok(Longhands { background_color: background_color, - background_image: background_image, - background_position: background_position, - background_repeat: background_repeat, - background_attachment: background_attachment, - background_size: background_size, - background_origin: background_origin, - background_clip: background_clip, + background_image: Some(background_image), + background_position: Some(background_position), + background_repeat: Some(background_repeat), + background_attachment: Some(background_attachment), + background_size: Some(background_size), + background_origin: Some(background_origin), + background_clip: Some(background_clip), }) } @@ -111,7 +98,6 @@ } } use std::cmp; - use std::iter::{once, repeat}; let mut len = 0; % for name in "image position repeat size attachment origin clip".split(): len = cmp::max(len, extract_value(self.background_${name}).map(|i| i.0.len()) @@ -123,15 +109,21 @@ return dest.write_str("") } - let iter = repeat(None).take(len - 1).chain(once(Some(self.background_color))) - % for name in "image position repeat size attachment origin clip".split(): - .zip(extract_value(self.background_${name}).into_iter() - .flat_map(|x| x.0.iter()) - .map(Some).chain(repeat(None))) - % endfor - ; let mut first = true; - for (((((((color, image), position), repeat), size), attachment), origin), clip) in iter { + for i in 0..len { + % for name in "image position repeat size attachment origin clip".split(): + let ${name} = if let DeclaredValue::Value(ref arr) = *self.background_${name} { + arr.0.get(i % arr.0.len()) + } else { + None + }; + % endfor + let color = if i == len - 1 { + Some(self.background_color) + } else { + None + }; + if first { first = false; } else { @@ -144,7 +136,6 @@ }, Some(_) => { try!(write!(dest, "transparent ")); - try!(write!(dest, " ")); } // Not yet the last one None => () diff --git a/tests/unit/style/stylesheets.rs b/tests/unit/style/stylesheets.rs index 68e0b8e9577..528dcd67084 100644 --- a/tests/unit/style/stylesheets.rs +++ b/tests/unit/style/stylesheets.rs @@ -191,19 +191,40 @@ fn test_parse_stylesheet() { } )), Importance::Normal), - (PropertyDeclaration::BackgroundPosition(DeclaredValue::Initial), + (PropertyDeclaration::BackgroundPosition(DeclaredValue::Value( + longhands::background_position::SpecifiedValue( + vec![longhands::background_position::single_value + ::get_initial_specified_value()]))), Importance::Normal), - (PropertyDeclaration::BackgroundRepeat(DeclaredValue::Initial), + (PropertyDeclaration::BackgroundRepeat(DeclaredValue::Value( + longhands::background_repeat::SpecifiedValue( + vec![longhands::background_repeat::single_value + ::get_initial_specified_value()]))), Importance::Normal), - (PropertyDeclaration::BackgroundAttachment(DeclaredValue::Initial), + (PropertyDeclaration::BackgroundAttachment(DeclaredValue::Value( + longhands::background_attachment::SpecifiedValue( + vec![longhands::background_attachment::single_value + ::get_initial_specified_value()]))), Importance::Normal), - (PropertyDeclaration::BackgroundImage(DeclaredValue::Initial), + (PropertyDeclaration::BackgroundImage(DeclaredValue::Value( + longhands::background_image::SpecifiedValue( + vec![longhands::background_image::single_value + ::get_initial_specified_value()]))), Importance::Normal), - (PropertyDeclaration::BackgroundSize(DeclaredValue::Initial), + (PropertyDeclaration::BackgroundSize(DeclaredValue::Value( + longhands::background_size::SpecifiedValue( + vec![longhands::background_size::single_value + ::get_initial_specified_value()]))), Importance::Normal), - (PropertyDeclaration::BackgroundOrigin(DeclaredValue::Initial), + (PropertyDeclaration::BackgroundOrigin(DeclaredValue::Value( + longhands::background_origin::SpecifiedValue( + vec![longhands::background_origin::single_value + ::get_initial_specified_value()]))), Importance::Normal), - (PropertyDeclaration::BackgroundClip(DeclaredValue::Initial), + (PropertyDeclaration::BackgroundClip(DeclaredValue::Value( + longhands::background_clip::SpecifiedValue( + vec![longhands::background_clip::single_value + ::get_initial_specified_value()]))), Importance::Normal), ]), important_count: 0,