CssTransformOriginProperty
More information available at:
https://developer.mozilla.org/en-US/docs/Web/CSS/transform-origin
using AngleSharp.Css;
using AngleSharp.Css.Values;
using AngleSharp.Extensions;
using System;
namespace AngleSharp.Dom.Css
{
internal sealed class CssTransformOriginProperty : CssProperty, ICssTransformOriginProperty, ICssProperty
{
internal static readonly Point Default = Point.Center;
internal static IValueConverter<Tuple<Point, Length>> Converter = Converters.WithOrder(Converters.LengthOrPercentConverter.To((Length m) => new Point(m, m)).Or(Keywords.Center, Point.Center).Or(Converters.WithAny(Converters.LengthOrPercentConverter.Or(Keywords.Left, Length.Zero).Or(Keywords.Right, Length.Full).Or(Keywords.Center, Length.Half)
.Option(Length.Half), Converters.LengthOrPercentConverter.Or(Keywords.Top, Length.Zero).Or(Keywords.Bottom, Length.Full).Or(Keywords.Center, Length.Half)
.Option(Length.Half)).To((Tuple<Length, Length> m) => new Point(m.Item1, m.Item2)))
.Or(Converters.WithAny(Converters.LengthOrPercentConverter.Or(Keywords.Top, Length.Zero).Or(Keywords.Bottom, Length.Full).Or(Keywords.Center, Length.Half)
.Option(Length.Half), Converters.LengthOrPercentConverter.Or(Keywords.Left, Length.Zero).Or(Keywords.Right, Length.Full).Or(Keywords.Center, Length.Half)
.Option(Length.Half)).To((Tuple<Length, Length> m) => new Point(m.Item1, m.Item2)))
.Required(), Converters.LengthConverter.Option(Length.Zero));
private Length _x;
private Length _y;
private Length _z;
public Length X => _x;
public Length Y => _y;
public Length Z => _z;
internal CssTransformOriginProperty(CssStyleDeclaration rule)
: base(PropertyNames.TransformOrigin, rule, PropertyFlags.Animatable)
{
Reset();
}
public void SetPosition(Length x, Length y, Length z)
{
_x = x;
_y = y;
_z = z;
}
internal override void Reset()
{
Point default = Default;
_x = default.X;
default = Default;
_y = default.Y;
_z = Length.Zero;
}
protected override bool IsValid(ICssValue value)
{
return Converter.TryConvert(value, delegate(Tuple<Point, Length> m) {
Point item = m.Item1;
Length x = item.X;
item = m.Item1;
SetPosition(x, item.Y, m.Item2);
});
}
}
}