mirror of
https://github.com/servo/servo.git
synced 2025-07-25 16:20:36 +01:00
style: Move animation of svg-related bits outside of animated_properties.
Being in mako is unnecessary, and makes it harder to debug and such. Differential Revision: https://phabricator.services.mozilla.com/D10843
This commit is contained in:
parent
8b49ef813f
commit
c88a483322
3 changed files with 215 additions and 205 deletions
|
@ -27,14 +27,12 @@ use hash::FxHashMap;
|
||||||
use super::ComputedValues;
|
use super::ComputedValues;
|
||||||
use values::CSSFloat;
|
use values::CSSFloat;
|
||||||
use values::animated::{Animate, Procedure, ToAnimatedValue, ToAnimatedZero};
|
use values::animated::{Animate, Procedure, ToAnimatedValue, ToAnimatedZero};
|
||||||
use values::animated::color::Color as AnimatedColor;
|
|
||||||
use values::animated::effects::Filter as AnimatedFilter;
|
use values::animated::effects::Filter as AnimatedFilter;
|
||||||
#[cfg(feature = "gecko")] use values::computed::TransitionProperty;
|
#[cfg(feature = "gecko")] use values::computed::TransitionProperty;
|
||||||
use values::computed::Angle;
|
use values::computed::Angle;
|
||||||
use values::computed::{ClipRect, Context};
|
use values::computed::{ClipRect, Context};
|
||||||
use values::computed::{Length, LengthOrPercentage};
|
use values::computed::{Length, LengthOrPercentage};
|
||||||
use values::computed::{NonNegativeNumber, Number, NumberOrPercentage, Percentage};
|
use values::computed::{Number, Percentage};
|
||||||
use values::computed::length::NonNegativeLengthOrPercentage;
|
|
||||||
use values::computed::ToComputedValue;
|
use values::computed::ToComputedValue;
|
||||||
use values::computed::transform::{DirectionVector, Matrix, Matrix3D};
|
use values::computed::transform::{DirectionVector, Matrix, Matrix3D};
|
||||||
use values::computed::transform::TransformOperation as ComputedTransformOperation;
|
use values::computed::transform::TransformOperation as ComputedTransformOperation;
|
||||||
|
@ -42,12 +40,9 @@ use values::computed::transform::Transform as ComputedTransform;
|
||||||
use values::computed::transform::Rotate as ComputedRotate;
|
use values::computed::transform::Rotate as ComputedRotate;
|
||||||
use values::computed::transform::Translate as ComputedTranslate;
|
use values::computed::transform::Translate as ComputedTranslate;
|
||||||
use values::computed::transform::Scale as ComputedScale;
|
use values::computed::transform::Scale as ComputedScale;
|
||||||
use values::computed::url::ComputedUrl;
|
|
||||||
use values::generics::transform::{self, Rotate, Translate, Scale, Transform, TransformOperation};
|
use values::generics::transform::{self, Rotate, Translate, Scale, Transform, TransformOperation};
|
||||||
use values::distance::{ComputeSquaredDistance, SquaredDistance};
|
use values::distance::{ComputeSquaredDistance, SquaredDistance};
|
||||||
use values::generics::effects::Filter;
|
use values::generics::effects::Filter;
|
||||||
use values::generics::svg::{SVGLength, SvgLengthOrPercentageOrNumber, SVGPaint};
|
|
||||||
use values::generics::svg::{SVGPaintKind, SVGStrokeDashArray, SVGOpacity};
|
|
||||||
use void::{self, Void};
|
use void::{self, Void};
|
||||||
|
|
||||||
/// Convert nsCSSPropertyID to TransitionProperty
|
/// Convert nsCSSPropertyID to TransitionProperty
|
||||||
|
@ -2535,205 +2530,6 @@ impl ComputeSquaredDistance for ComputedTransform {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Animated SVGPaint
|
|
||||||
pub type IntermediateSVGPaint = SVGPaint<AnimatedColor, ComputedUrl>;
|
|
||||||
|
|
||||||
/// Animated SVGPaintKind
|
|
||||||
pub type IntermediateSVGPaintKind = SVGPaintKind<AnimatedColor, ComputedUrl>;
|
|
||||||
|
|
||||||
impl ToAnimatedZero for IntermediateSVGPaint {
|
|
||||||
#[inline]
|
|
||||||
fn to_animated_zero(&self) -> Result<Self, ()> {
|
|
||||||
Ok(IntermediateSVGPaint {
|
|
||||||
kind: self.kind.to_animated_zero()?,
|
|
||||||
fallback: self.fallback.and_then(|v| v.to_animated_zero().ok()),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<NonNegativeLengthOrPercentage> for NumberOrPercentage {
|
|
||||||
fn from(lop: NonNegativeLengthOrPercentage) -> NumberOrPercentage {
|
|
||||||
lop.0.into()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<NonNegativeNumber> for NumberOrPercentage {
|
|
||||||
fn from(num: NonNegativeNumber) -> NumberOrPercentage {
|
|
||||||
num.0.into()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<LengthOrPercentage> for NumberOrPercentage {
|
|
||||||
fn from(lop: LengthOrPercentage) -> NumberOrPercentage {
|
|
||||||
match lop {
|
|
||||||
LengthOrPercentage::Length(len) => NumberOrPercentage::Number(len.px()),
|
|
||||||
LengthOrPercentage::Percentage(p) => NumberOrPercentage::Percentage(p),
|
|
||||||
LengthOrPercentage::Calc(_) => {
|
|
||||||
panic!("We dont't expected calc interpolation for SvgLengthOrPercentageOrNumber");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Number> for NumberOrPercentage {
|
|
||||||
fn from(num: Number) -> NumberOrPercentage {
|
|
||||||
NumberOrPercentage::Number(num)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn convert_to_number_or_percentage<LengthOrPercentageType, NumberType>(
|
|
||||||
from: SvgLengthOrPercentageOrNumber<LengthOrPercentageType, NumberType>)
|
|
||||||
-> NumberOrPercentage
|
|
||||||
where LengthOrPercentageType: Into<NumberOrPercentage>,
|
|
||||||
NumberType: Into<NumberOrPercentage>
|
|
||||||
{
|
|
||||||
match from {
|
|
||||||
SvgLengthOrPercentageOrNumber::LengthOrPercentage(lop) => {
|
|
||||||
lop.into()
|
|
||||||
}
|
|
||||||
SvgLengthOrPercentageOrNumber::Number(num) => {
|
|
||||||
num.into()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn convert_from_number_or_percentage<LengthOrPercentageType, NumberType>(
|
|
||||||
from: NumberOrPercentage)
|
|
||||||
-> SvgLengthOrPercentageOrNumber<LengthOrPercentageType, NumberType>
|
|
||||||
where LengthOrPercentageType: From<LengthOrPercentage>,
|
|
||||||
NumberType: From<Number>
|
|
||||||
{
|
|
||||||
match from {
|
|
||||||
NumberOrPercentage::Number(num) =>
|
|
||||||
SvgLengthOrPercentageOrNumber::Number(num.into()),
|
|
||||||
NumberOrPercentage::Percentage(p) =>
|
|
||||||
SvgLengthOrPercentageOrNumber::LengthOrPercentage(
|
|
||||||
(LengthOrPercentage::Percentage(p)).into())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl <L, N> Animate for SvgLengthOrPercentageOrNumber<L, N>
|
|
||||||
where
|
|
||||||
L: Animate + From<LengthOrPercentage> + Into<NumberOrPercentage> + Copy,
|
|
||||||
N: Animate + From<Number> + Into<NumberOrPercentage>,
|
|
||||||
LengthOrPercentage: From<L>,
|
|
||||||
Self: Copy,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
|
||||||
if self.has_calc() || other.has_calc() {
|
|
||||||
// TODO: We need to treat calc value.
|
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1386967
|
|
||||||
return Err(());
|
|
||||||
}
|
|
||||||
|
|
||||||
let this = convert_to_number_or_percentage(*self);
|
|
||||||
let other = convert_to_number_or_percentage(*other);
|
|
||||||
|
|
||||||
match (this, other) {
|
|
||||||
(
|
|
||||||
NumberOrPercentage::Number(ref this),
|
|
||||||
NumberOrPercentage::Number(ref other),
|
|
||||||
) => {
|
|
||||||
Ok(convert_from_number_or_percentage(
|
|
||||||
NumberOrPercentage::Number(this.animate(other, procedure)?)
|
|
||||||
))
|
|
||||||
},
|
|
||||||
(
|
|
||||||
NumberOrPercentage::Percentage(ref this),
|
|
||||||
NumberOrPercentage::Percentage(ref other),
|
|
||||||
) => {
|
|
||||||
Ok(convert_from_number_or_percentage(
|
|
||||||
NumberOrPercentage::Percentage(this.animate(other, procedure)?)
|
|
||||||
))
|
|
||||||
},
|
|
||||||
_ => Err(()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<L> Animate for SVGLength<L>
|
|
||||||
where
|
|
||||||
L: Animate + Clone,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
|
||||||
match (self, other) {
|
|
||||||
(&SVGLength::Length(ref this), &SVGLength::Length(ref other)) => {
|
|
||||||
Ok(SVGLength::Length(this.animate(other, procedure)?))
|
|
||||||
},
|
|
||||||
_ => Err(()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <https://www.w3.org/TR/SVG11/painting.html#StrokeDasharrayProperty>
|
|
||||||
impl<L> Animate for SVGStrokeDashArray<L>
|
|
||||||
where
|
|
||||||
L: Clone + Animate,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
|
||||||
if matches!(procedure, Procedure::Add | Procedure::Accumulate { .. }) {
|
|
||||||
// Non-additive.
|
|
||||||
return Err(());
|
|
||||||
}
|
|
||||||
match (self, other) {
|
|
||||||
(&SVGStrokeDashArray::Values(ref this), &SVGStrokeDashArray::Values(ref other)) => {
|
|
||||||
Ok(SVGStrokeDashArray::Values(this.animate_repeatable_list(other, procedure)?))
|
|
||||||
},
|
|
||||||
_ => Err(()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<L> ComputeSquaredDistance for SVGStrokeDashArray<L>
|
|
||||||
where
|
|
||||||
L: ComputeSquaredDistance,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
|
|
||||||
match (self, other) {
|
|
||||||
(&SVGStrokeDashArray::Values(ref this), &SVGStrokeDashArray::Values(ref other)) => {
|
|
||||||
this.squared_distance_repeatable_list(other)
|
|
||||||
},
|
|
||||||
_ => Err(()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<L> ToAnimatedZero for SVGStrokeDashArray<L>
|
|
||||||
where
|
|
||||||
L: ToAnimatedZero,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
fn to_animated_zero(&self) -> Result<Self, ()> {
|
|
||||||
match *self {
|
|
||||||
SVGStrokeDashArray::Values(ref values) => {
|
|
||||||
Ok(SVGStrokeDashArray::Values(
|
|
||||||
values.iter().map(ToAnimatedZero::to_animated_zero).collect::<Result<Vec<_>, _>>()?,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
SVGStrokeDashArray::ContextValue => Ok(SVGStrokeDashArray::ContextValue),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<O> Animate for SVGOpacity<O>
|
|
||||||
where
|
|
||||||
O: Animate + Clone,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
|
||||||
match (self, other) {
|
|
||||||
(&SVGOpacity::Opacity(ref this), &SVGOpacity::Opacity(ref other)) => {
|
|
||||||
Ok(SVGOpacity::Opacity(this.animate(other, procedure)?))
|
|
||||||
},
|
|
||||||
_ => Err(()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
<%
|
<%
|
||||||
FILTER_FUNCTIONS = [ 'Blur', 'Brightness', 'Contrast', 'Grayscale',
|
FILTER_FUNCTIONS = [ 'Blur', 'Brightness', 'Contrast', 'Grayscale',
|
||||||
'HueRotate', 'Invert', 'Opacity', 'Saturate',
|
'HueRotate', 'Invert', 'Opacity', 'Saturate',
|
||||||
|
|
|
@ -22,6 +22,7 @@ pub mod color;
|
||||||
pub mod effects;
|
pub mod effects;
|
||||||
mod font;
|
mod font;
|
||||||
mod length;
|
mod length;
|
||||||
|
mod svg;
|
||||||
|
|
||||||
/// The category a property falls into for ordering purposes.
|
/// The category a property falls into for ordering purposes.
|
||||||
///
|
///
|
||||||
|
|
213
components/style/values/animated/svg.rs
Normal file
213
components/style/values/animated/svg.rs
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
//! Animation implementations for various SVG-related types.
|
||||||
|
|
||||||
|
use properties::animated_properties::ListAnimation;
|
||||||
|
use values::animated::color::Color as AnimatedColor;
|
||||||
|
use values::computed::{NonNegativeNumber, Number, NumberOrPercentage, LengthOrPercentage};
|
||||||
|
use values::computed::url::ComputedUrl;
|
||||||
|
use values::computed::length::NonNegativeLengthOrPercentage;
|
||||||
|
use values::distance::{ComputeSquaredDistance, SquaredDistance};
|
||||||
|
use values::generics::svg::{SVGLength, SvgLengthOrPercentageOrNumber, SVGPaint};
|
||||||
|
use values::generics::svg::{SVGPaintKind, SVGStrokeDashArray, SVGOpacity};
|
||||||
|
use super::{Animate, Procedure, ToAnimatedZero};
|
||||||
|
|
||||||
|
/// Animated SVGPaint.
|
||||||
|
pub type IntermediateSVGPaint = SVGPaint<AnimatedColor, ComputedUrl>;
|
||||||
|
|
||||||
|
impl ToAnimatedZero for IntermediateSVGPaint {
|
||||||
|
#[inline]
|
||||||
|
fn to_animated_zero(&self) -> Result<Self, ()> {
|
||||||
|
Ok(IntermediateSVGPaint {
|
||||||
|
kind: self.kind.to_animated_zero()?,
|
||||||
|
fallback: self.fallback.and_then(|v| v.to_animated_zero().ok()),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<NonNegativeLengthOrPercentage> for NumberOrPercentage {
|
||||||
|
fn from(lop: NonNegativeLengthOrPercentage) -> NumberOrPercentage {
|
||||||
|
lop.0.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<NonNegativeNumber> for NumberOrPercentage {
|
||||||
|
fn from(num: NonNegativeNumber) -> NumberOrPercentage {
|
||||||
|
num.0.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<LengthOrPercentage> for NumberOrPercentage {
|
||||||
|
fn from(lop: LengthOrPercentage) -> NumberOrPercentage {
|
||||||
|
match lop {
|
||||||
|
LengthOrPercentage::Length(len) => NumberOrPercentage::Number(len.px()),
|
||||||
|
LengthOrPercentage::Percentage(p) => NumberOrPercentage::Percentage(p),
|
||||||
|
LengthOrPercentage::Calc(_) => {
|
||||||
|
panic!("We dont't expected calc interpolation for SvgLengthOrPercentageOrNumber");
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Number> for NumberOrPercentage {
|
||||||
|
fn from(num: Number) -> NumberOrPercentage {
|
||||||
|
NumberOrPercentage::Number(num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn convert_to_number_or_percentage<LengthOrPercentageType, NumberType>(
|
||||||
|
from: SvgLengthOrPercentageOrNumber<LengthOrPercentageType, NumberType>,
|
||||||
|
) -> NumberOrPercentage
|
||||||
|
where
|
||||||
|
LengthOrPercentageType: Into<NumberOrPercentage>,
|
||||||
|
NumberType: Into<NumberOrPercentage>,
|
||||||
|
{
|
||||||
|
match from {
|
||||||
|
SvgLengthOrPercentageOrNumber::LengthOrPercentage(lop) => {
|
||||||
|
lop.into()
|
||||||
|
}
|
||||||
|
SvgLengthOrPercentageOrNumber::Number(num) => {
|
||||||
|
num.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn convert_from_number_or_percentage<LengthOrPercentageType, NumberType>(
|
||||||
|
from: NumberOrPercentage,
|
||||||
|
) -> SvgLengthOrPercentageOrNumber<LengthOrPercentageType, NumberType>
|
||||||
|
where
|
||||||
|
LengthOrPercentageType: From<LengthOrPercentage>,
|
||||||
|
NumberType: From<Number>,
|
||||||
|
{
|
||||||
|
match from {
|
||||||
|
NumberOrPercentage::Number(num) =>
|
||||||
|
SvgLengthOrPercentageOrNumber::Number(num.into()),
|
||||||
|
NumberOrPercentage::Percentage(p) =>
|
||||||
|
SvgLengthOrPercentageOrNumber::LengthOrPercentage(
|
||||||
|
(LengthOrPercentage::Percentage(p)).into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <L, N> Animate for SvgLengthOrPercentageOrNumber<L, N>
|
||||||
|
where
|
||||||
|
L: Animate + From<LengthOrPercentage> + Into<NumberOrPercentage> + Copy,
|
||||||
|
N: Animate + From<Number> + Into<NumberOrPercentage>,
|
||||||
|
LengthOrPercentage: From<L>,
|
||||||
|
Self: Copy,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
||||||
|
if self.has_calc() || other.has_calc() {
|
||||||
|
// TODO: We need to treat calc value.
|
||||||
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=1386967
|
||||||
|
return Err(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let this = convert_to_number_or_percentage(*self);
|
||||||
|
let other = convert_to_number_or_percentage(*other);
|
||||||
|
|
||||||
|
match (this, other) {
|
||||||
|
(
|
||||||
|
NumberOrPercentage::Number(ref this),
|
||||||
|
NumberOrPercentage::Number(ref other),
|
||||||
|
) => {
|
||||||
|
Ok(convert_from_number_or_percentage(
|
||||||
|
NumberOrPercentage::Number(this.animate(other, procedure)?)
|
||||||
|
))
|
||||||
|
},
|
||||||
|
(
|
||||||
|
NumberOrPercentage::Percentage(ref this),
|
||||||
|
NumberOrPercentage::Percentage(ref other),
|
||||||
|
) => {
|
||||||
|
Ok(convert_from_number_or_percentage(
|
||||||
|
NumberOrPercentage::Percentage(this.animate(other, procedure)?)
|
||||||
|
))
|
||||||
|
},
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<L> Animate for SVGLength<L>
|
||||||
|
where
|
||||||
|
L: Animate + Clone,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
||||||
|
match (self, other) {
|
||||||
|
(&SVGLength::Length(ref this), &SVGLength::Length(ref other)) => {
|
||||||
|
Ok(SVGLength::Length(this.animate(other, procedure)?))
|
||||||
|
},
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <https://www.w3.org/TR/SVG11/painting.html#StrokeDasharrayProperty>
|
||||||
|
impl<L> Animate for SVGStrokeDashArray<L>
|
||||||
|
where
|
||||||
|
L: Clone + Animate,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
||||||
|
if matches!(procedure, Procedure::Add | Procedure::Accumulate { .. }) {
|
||||||
|
// Non-additive.
|
||||||
|
return Err(());
|
||||||
|
}
|
||||||
|
match (self, other) {
|
||||||
|
(&SVGStrokeDashArray::Values(ref this), &SVGStrokeDashArray::Values(ref other)) => {
|
||||||
|
Ok(SVGStrokeDashArray::Values(this.animate_repeatable_list(other, procedure)?))
|
||||||
|
},
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<L> ComputeSquaredDistance for SVGStrokeDashArray<L>
|
||||||
|
where
|
||||||
|
L: ComputeSquaredDistance,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
|
||||||
|
match (self, other) {
|
||||||
|
(&SVGStrokeDashArray::Values(ref this), &SVGStrokeDashArray::Values(ref other)) => {
|
||||||
|
this.squared_distance_repeatable_list(other)
|
||||||
|
},
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<L> ToAnimatedZero for SVGStrokeDashArray<L>
|
||||||
|
where
|
||||||
|
L: ToAnimatedZero,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn to_animated_zero(&self) -> Result<Self, ()> {
|
||||||
|
match *self {
|
||||||
|
SVGStrokeDashArray::Values(ref values) => {
|
||||||
|
Ok(SVGStrokeDashArray::Values(
|
||||||
|
values.iter().map(ToAnimatedZero::to_animated_zero).collect::<Result<Vec<_>, _>>()?,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
SVGStrokeDashArray::ContextValue => Ok(SVGStrokeDashArray::ContextValue),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<O> Animate for SVGOpacity<O>
|
||||||
|
where
|
||||||
|
O: Animate + Clone,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
||||||
|
match (self, other) {
|
||||||
|
(&SVGOpacity::Opacity(ref this), &SVGOpacity::Opacity(ref other)) => {
|
||||||
|
Ok(SVGOpacity::Opacity(this.animate(other, procedure)?))
|
||||||
|
},
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue