Exemple #1
0
        internal bool TryConvertNamedDirectionToAngle(string token, out double angle)
        {
            var reader = new CssReader(token, ' ');

            if (reader.CanRead && reader.Read() == "to")
            {
                var defaultVector   = Vector2.Down; // By default gradient is drawn top-down
                var directionVector = Vector2.Zero;

                reader.MoveNext();

                while (reader.CanRead)
                {
                    directionVector.SetNamedDirection(reader.Read());
                    reader.MoveNext();
                }

                angle = Vector2.Angle(ref defaultVector, ref directionVector);

                // We start rotation from Vector(0, -1) clockwise
                // If gradient ends in I or II quarter of coordinate system
                // we use angle to calculate actual rotation

                if (directionVector.X > 0)
                {
                    angle = 360 - angle;
                }

                return(true);
            }

            angle = 0;
            return(false);
        }
        private (bool, Size) GeRadius(CssReader reader, RadialGradientShape shape, ref RadialGradientFlags flags)
        {
            if (reader.CanRead)
            {
                var size = Dimensions.Zero;

                if (shape == RadialGradientShape.Circle)
                {
                    var radiusToken = reader.Read();
                    var isRadius    = OffsetConverter.TryExtractOffset(radiusToken, out var radius);

                    if (isRadius)
                    {
                        size = new Dimensions(radius, radius);
                        reader.MoveNext();
                    }
                }

                if (shape == RadialGradientShape.Ellipse)
                {
                    var radiusHToken = reader.Read();
                    var radiusVToken = reader.ReadNext();

                    var isRadiusH = OffsetConverter.TryExtractOffset(radiusHToken, out var radiusH);
                    var isRadiusV = OffsetConverter.TryExtractOffset(radiusVToken, out var radiusV);

                    if (isRadiusH && isRadiusV)
                    {
                        size = new Dimensions(radiusH, radiusV);
                        reader.MoveNext();
                    }
                    else
                    {
                        // Revert radiusVToken
                        reader.Rollback();
                    }
                }

                if (size != Dimensions.Zero)
                {
                    if (size.Width.Type == OffsetType.Proportional)
                    {
                        FlagsHelper.Set(ref flags, WidthProportional);
                    }

                    if (size.Height.Type == OffsetType.Proportional)
                    {
                        FlagsHelper.Set(ref flags, HeightProportional);
                    }

                    return(true, new Size(size.Width.Value, size.Height.Value));
                }
            }

            // Value -1 means undefined for RadialGradientShader
            return(false, new Size(-1, -1));
        }
Exemple #3
0
        private (bool, Dimensions) GeRadius(CssReader reader, RadialGradientShape shape)
        {
            if (reader.CanRead)
            {
                var size = Dimensions.Zero;

                if (shape == RadialGradientShape.Circle)
                {
                    var radiusToken = reader.Read();
                    var isRadius    = Offset.TryParseWithUnit(radiusToken, out var radius);

                    if (isRadius)
                    {
                        size = new Dimensions(radius, radius);
                        reader.MoveNext();
                    }
                }

                if (shape == RadialGradientShape.Ellipse)
                {
                    var radiusHToken = reader.Read();
                    var radiusVToken = reader.ReadNext();

                    var isRadiusH = Offset.TryParseWithUnit(radiusHToken, out var radiusH);
                    var isRadiusV = Offset.TryParseWithUnit(radiusVToken, out var radiusV);

                    if (isRadiusH && isRadiusV)
                    {
                        size = new Dimensions(radiusH, radiusV);
                        reader.MoveNext();
                    }
                    else
                    {
                        // Revert radiusVToken
                        reader.Rollback();
                    }
                }

                if (size != Dimensions.Zero)
                {
                    return(true, size);
                }
            }

            return(false, Dimensions.Zero);
        }
        private RadialGradientSize GetShapeSize(CssReader reader)
        {
            if (reader.CanRead)
            {
                var token = reader.Read().Replace("-", "").Trim();

                if (Enum.TryParse <RadialGradientSize>(token, true, out var shapeSize))
                {
                    reader.MoveNext();
                    return(shapeSize);
                }
            }

            return(RadialGradientSize.FarthestCorner);
        }
        private RadialGradientShape GetShape(CssReader reader)
        {
            if (reader.CanRead)
            {
                var token = reader.Read().Trim();

                if (Enum.TryParse <RadialGradientShape>(token, true, out var shape))
                {
                    reader.MoveNext();
                    return(shape);
                }
            }

            return(RadialGradientShape.Ellipse);
        }
Exemple #6
0
        private (bool, RadialGradientStretch) GetStretch(CssReader reader)
        {
            if (reader.CanRead)
            {
                var token = reader.Read().Replace("-", "").Trim();

                if (Enum.TryParse <RadialGradientStretch>(token, true, out var stretch))
                {
                    reader.MoveNext();
                    return(true, stretch);
                }
            }

            return(false, RadialGradientStretch.FarthestCorner);
        }