public override Color CreateColor(SvgDrawContext context, Rectangle objectBoundingBox, float objectBoundingBoxMargin , float parentOpacity) { if (objectBoundingBox == null) { return(null); } LinearGradientBuilder builder = new LinearGradientBuilder(); foreach (GradientColorStop stopColor in ParseStops(parentOpacity)) { builder.AddColorStop(stopColor); } builder.SetSpreadMethod(ParseSpreadMethod()); bool isObjectBoundingBox = IsObjectBoundingBoxUnits(); Point[] coordinates = GetCoordinates(context, isObjectBoundingBox); builder.SetGradientVector(coordinates[0].GetX(), coordinates[0].GetY(), coordinates[1].GetX(), coordinates [1].GetY()); AffineTransform gradientTransform = GetGradientTransformToUserSpaceOnUse(objectBoundingBox, isObjectBoundingBox ); builder.SetCurrentSpaceToGradientVectorSpaceTransformation(gradientTransform); return(builder.BuildColor(objectBoundingBox.ApplyMargins(objectBoundingBoxMargin, objectBoundingBoxMargin, objectBoundingBoxMargin, objectBoundingBoxMargin, true), context.GetCurrentCanvasTransform(), context. GetCurrentCanvas().GetDocument())); }
public ILinearGradient Construct(LinearGradientBuilder builder) { var linearGradient = new LinearGradient { Angle = builder.Angle, IsRepeating = builder.IsRepeating, Stops = new GradientElements <GradientStop>(builder.Stops.Cast <GradientStop>()) }; return(linearGradient); }
private void AddLinearGradientDirectCoordinatesApproach(PdfDocument pdfDoc) { Rectangle targetBoundingBox = new Rectangle(50f, 450f, 300f, 300f); AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder() .SetGradientVector(targetBoundingBox.GetLeft() + 100f, targetBoundingBox.GetBottom() + 100f, targetBoundingBox.GetRight() - 100f, targetBoundingBox.GetTop() - 100f) .SetSpreadMethod(GradientSpreadMethod.REPEAT) // For the RELATIVE offset type "0" value means the target vector start and the "1" value means the target vector end .AddColorStop(new GradientColorStop(ColorConstants.BLUE.GetColorValue(), 0.5, GradientColorStop.OffsetType.RELATIVE)) .AddColorStop(new GradientColorStop(ColorConstants.GREEN.GetColorValue(), 1, GradientColorStop.OffsetType.RELATIVE)); GeneratePdf(pdfDoc, null, gradientBuilder, targetBoundingBox); }
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(); } }
private void CreateColorBasedOnAbsolutelyPositionedLinearGradient(Document doc) { // The below such linear gradient spans across the whole page and therefore color created from it will be // different based at the location of the page AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder() .SetGradientVector(PageSize.A4.GetLeft(), PageSize.A4.GetBottom(), PageSize.A4.GetRight(), PageSize.A4.GetTop()) .AddColorStop(new GradientColorStop(ColorConstants.RED.GetColorValue())) .AddColorStop(new GradientColorStop(ColorConstants.PINK.GetColorValue())) .AddColorStop(new GradientColorStop(ColorConstants.BLUE.GetColorValue())); Color gradientColor = gradientBuilder.BuildColor(PageSize.A4.Clone(), null, doc.GetPdfDocument()); doc.Add(new Paragraph("The \"createColorBasedOnAbsolutelyPositionedLinearGradient\" starts here.").SetFontColor(gradientColor)); String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In dapibus aliquam quam. Aliquam at tincidunt mauris. " + "Curabitur mollis leo venenatis diam bibendum consectetur. Etiam at lacus ultricies, vulputate dui nec, mattis ex. " + "Sed quis leo in purus consectetur sodales. Nam sit amet felis orci. Aliquam non lacus ut nisi hendrerit sollicitudin " + "a at ligula. Vivamus condimentum vehicula nulla a blandit. In sit amet ex hendrerit augue iaculis consectetur. " + "Etiam semper risus pulvinar, faucibus ex eu, tristique felis. Integer ullamcorper ipsum ac nisi vulputate malesuada." + "Nunc sit amet ipsum sollicitudin, consequat lectus ac, finibus erat. Vivamus malesuada a leo vel consequat." + "Maecenas ac blandit velit, at eleifend ipsum. Praesent dui orci, molestie a semper eu, varius nec augue. " + "Ut vehicula libero ligula, id tristique nisi convallis et. Curabitur nec velit ut nisi commodo rhoncus " + "non eu ipsum. Pellentesque eget mauris ex. Nullam et lectus et eros sollicitudin tincidunt. Phasellus " + "commodo erat nec diam consectetur elementum. Cras pellentesque commodo est, vel viverra nisi " + "vulputate ac. Curabitur interdum nulla at viverra varius. Donec porttitor erat lacus, ac efficitur " + "arcu malesuada dignissim. Aenean pretium ex tortor, a porttitor quam mollis vitae. Etiam id nibh dolor." + " Curabitur vel ligula tortor. Etiam vestibulum velit neque, a mattis tortor vehicula sed. Sed sit amet " + "ipsum leo. Mauris et tincidunt ex. Donec vehicula, magna eget convallis suscipit, nisi tellus ullamcorper " + "massa, eu commodo lectus massa ac orci. Fusce nec gravida justo, ac lacinia metus. Etiam porttitor " + "massa odio, vestibulum semper ipsum tristique eget. Donec semper elit nibh, tristique placerat arcu " + "egestas et. Pellentesque leo metus, sodales in nisi ut, condimentum dignissim eros. Duis maximus eu " + "mi faucibus mattis. Quisque leo urna, hendrerit eu finibus nec, ullamcorper at nunc."; Paragraph paragraph = new Paragraph(text).SetBorder(new SolidBorder(gradientColor, 5)); Table table = new Table(UnitValue.CreatePercentArray(3)).UseAllAvailableWidth(); Cell cell = new Cell().Add(new Paragraph("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")); table.AddCell(cell); cell = new Cell().Add(new Paragraph("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")); table.AddCell(cell); cell = new Cell().Add(new Paragraph("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")); table.AddCell(cell); table.SetBorder(new SolidBorder(gradientColor, 9)); doc .Add(paragraph) .Add(table); }
public void Parse(CssReader reader, LinearGradientBuilder builder) { var parts = reader.Read().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var color = parts.Length > 0 ? (Color)ColorConverter.ConvertFromInvariantString(parts[0]) : Color.Black; if (parts.Length > 1 && TryConvertPercentToOffset(parts[1], out var offset)) { builder.AddStop(color, offset); } else { builder.AddStop(color); } }
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_ValidColor_SingleStopWithColorAndOffset(string color, Color expectedColor, float expectedOffset) { // Arrange var reader = new CssReader(color); var builder = new LinearGradientBuilder(); var definition = new ColorChannelDefinition(); // Act definition.Parse(reader, builder); // Assert var result = builder.Build(); using (new AssertionScope()) { var stops = result.SelectMany(x => x.Stops).ToArray(); stops.Should().HaveCount(1); stops[0].Color.Should().Be(expectedColor); stops[0].Offset.Should().Be(expectedOffset); } }
public LinearGradient[] ParseCss(string css) { var builder = new LinearGradientBuilder(); if (string.IsNullOrWhiteSpace(css)) { return(builder.Build()); } var reader = new CssReader(css); while (reader.CanRead) { var token = reader.Read().Trim(); var definition = _definitions.FirstOrDefault(x => x.IsMatch(token)); definition?.Parse(reader, builder); reader.MoveNext(); } return(builder.Build().Reverse().ToArray()); }
public virtual void BackgroundLinearGradientClipOriginNoRepeatTest() { PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new ByteArrayOutputStream())); byte[] bytes = new byte[] { 54, 25, 47, 15, 2, 2, 2, 44, 55, 77, 86, 24 }; PdfCanvas pdfCanvas = new _PdfCanvas_589(pdfDocument.AddNewPage()); DrawContext drawContext = new DrawContext(pdfDocument, pdfCanvas); AbstractRenderer renderer = new DivRenderer(new Div().SetPadding(20).SetBorder(new DashedBorder(10))); renderer.occupiedArea = new LayoutArea(1, new Rectangle(100f, 200f, 300f, 400f)); Rectangle targetBoundingBox = new Rectangle(50f, 150f, 300f, 300f); AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder().SetGradientVector(targetBoundingBox .GetLeft() + 100f, targetBoundingBox.GetBottom() + 100f, targetBoundingBox.GetRight() - 100f, targetBoundingBox .GetTop() - 100f).SetSpreadMethod(GradientSpreadMethod.PAD).AddColorStop(new GradientColorStop(ColorConstants .RED.GetColorValue(), 0d, GradientColorStop.OffsetType.RELATIVE)).AddColorStop(new GradientColorStop(ColorConstants .BLUE.GetColorValue(), 1d, GradientColorStop.OffsetType.RELATIVE)); BackgroundImage backgroundImage = new BackgroundImage.Builder().SetLinearGradientBuilder(gradientBuilder). SetBackgroundRepeat(new BackgroundRepeat(BackgroundRepeat.BackgroundRepeatValue.NO_REPEAT)).SetBackgroundClip (BackgroundBox.CONTENT_BOX).SetBackgroundOrigin(BackgroundBox.BORDER_BOX).Build(); renderer.SetProperty(Property.BACKGROUND_IMAGE, backgroundImage); renderer.DrawBackground(drawContext); }