public void Parse(CssReader reader, GradientBuilder builder) { var isRepeating = reader.Read().Trim() == CssToken.RepeatingRadialGradient; var token = reader.ReadNext().Trim(); var internalReader = new CssReader(token, ' '); var(hasShape, shape) = GetShape(internalReader); var(hasStretch, stretch) = GetStretch(internalReader); var(hasRadius, radius) = GeRadius(internalReader, shape); var(hasPos, position) = GetPosition(internalReader); builder.UseBuilder(new RadialGradientBuilder { Center = position, Shape = shape, Stretch = stretch, Radius = radius, IsRepeating = isRepeating }); if (!hasShape && !hasStretch && !hasRadius && !hasPos) { reader.Rollback(); } }
public void Parse(CssReader reader, GradientBuilder builder) { var isRepeating = reader.Read().Trim() == CssToken.RepeatingRadialGradient; var token = reader.ReadNext().Trim(); var internalReader = new CssReader(token, ' '); var flags = None; var(hasShape, shape) = GetShape(internalReader); var(hasSize, size) = GetSize(internalReader); var(hasRadius, radius) = GeRadius(internalReader, shape, ref flags); var(hasPos, position) = GetPosition(internalReader, ref flags); builder.UseBuilder(new RadialGradientBuilder { Center = position, Shape = shape, Size = size, RadiusX = radius.Width, RadiusY = radius.Height, Flags = flags, IsRepeating = isRepeating }); if (!hasShape && !hasSize && !hasRadius && !hasPos) { reader.Rollback(); } }
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)); }
public void Parse(CssReader reader, LinearGradientBuilder builder) { var color = (Color)ColorConverter.ConvertFromInvariantString(GetColorString(reader)); if (TryConvertPercentToOffset(reader.ReadNext(), out var offset)) { builder.AddStop(color, offset); } else { builder.AddStop(color); reader.Rollback(); } }
public void Parse(CssReader reader, GradientBuilder builder) { var color = (Color)ColorConverter.ConvertFromInvariantString(GetColorString(reader)); var parts = reader.ReadNext().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (parts.TryConvertOffsets(out var offsets)) { builder.AddStops(color, offsets); } else { builder.AddStop(color); reader.Rollback(); } }
public void Parse(CssReader reader, GradientBuilder builder) { var colorString = GetColorString(reader); var color = Color.Parse(colorString); var parts = reader.ReadNext().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var offsets = GetOffsets(parts); if (offsets.Any()) { builder.AddStops(color, offsets); } else { builder.AddStop(color); reader.Rollback(); } }
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); }
public void Parse(CssReader reader, LinearGradientBuilder builder) { var direction = reader.ReadNext().Trim(); if (TryConvertDegreeToAngle(direction, out var degreeToAngle)) { builder.AddGradient(degreeToAngle); } else if (TryConvertNamedDirectionToAngle(direction, out var directionToAngle)) { builder.AddGradient(directionToAngle); } else { builder.AddGradient(0); reader.Rollback(); } }
public void Parse(CssReader reader, GradientBuilder builder) { var repeating = reader.Read().Trim() == CssToken.RepeatingLinearGradient; var direction = reader.ReadNext().Trim(); var angle = 0d; var hasAngle = TryConvertDegreeToAngle(direction, out angle) || TryConvertTurnToAngle(direction, out angle) || TryConvertNamedDirectionToAngle(direction, out angle); if (hasAngle) { builder.AddLinearGradient(angle, repeating); } else { builder.AddLinearGradient(0, repeating); reader.Rollback(); } }
public void Parse(CssReader reader, GradientBuilder builder) { var repeating = reader.Read().Trim() == CssToken.RepeatingLinearGradient; var direction = reader.ReadNext().Trim(); var angle = 0d; var hasAngle = TryConvertDegreeToAngle(direction, out angle) || TryConvertTurnToAngle(direction, out angle) || TryConvertNamedDirectionToAngle(direction, out angle); builder.UseBuilder(new LinearGradientBuilder { Angle = angle, IsRepeating = repeating }); if (!hasAngle) { reader.Rollback(); } }