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)); }
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); }
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); }