SvgRandomArt.cs
- //
- // This code is part of Document Solutions for PDF demos.
- // Copyright (c) MESCIUS inc. All rights reserved.
- //
- using System;
- using System.IO;
- using System.Drawing;
- using System.Linq;
- using System.Collections.Generic;
- using GrapeCity.Documents.Pdf;
- using GrapeCity.Documents.Text;
- using GrapeCity.Documents.Svg;
- using GCTEXT = GrapeCity.Documents.Text;
- using GCDRAW = GrapeCity.Documents.Drawing;
- using DsPdfWeb.Demos.Common;
-
- namespace DsPdfWeb.Demos
- {
- // This sample generates some random abstract art using the SVG path API
- // provided by GcSvgDocument.
- public class SvgRandomArt
- {
- private Random _rnd = Util.NewRandom();
-
- public int CreatePDF(Stream stream)
- {
- using var svgDoc = new GcSvgDocument();
- var svg = svgDoc.RootSvg;
- svg.ViewBox = new SvgViewBox(0, 0, 100, 100);
-
- // Random art:
- for (int i = 0; i < _rnd.Next(6, 12); i++)
- AddFigure(svg, _rnd);
-
- // Border:
- svg.Children.Add(new SvgRectElement()
- {
- Width = new SvgLength(100),
- Height = new SvgLength(100),
- Stroke = new SvgPaint(Color.FromArgb(_rnd.Next(256), _rnd.Next(256), _rnd.Next(256))),
- Fill = SvgPaint.None
- });
- // Clip:
- svg.Clip = new SvgClip(new SvgLength(0), new SvgLength(0), new SvgLength(100), new SvgLength(100));
-
- // Render the SVG image to a PDF:
- var doc = new GcPdfDocument();
- var page = doc.NewPage();
- var g = page.Graphics;
- var s = svgDoc.GetIntrinsicSize(SvgLengthUnits.Points);
-
- var margin = 72;
- var rect = new RectangleF(margin, margin, page.Size.Width - margin * 2, page.Size.Width - margin * 2);
- g.DrawSvg(svgDoc, rect);
-
- // Done:
- doc.Save(stream);
- return doc.Pages.Count;
- }
-
- int Next100()
- {
- return _rnd.Next(100);
- }
-
- void AddFigure(SvgSvgElement svg, Random rnd)
- {
- var pb = new SvgPathBuilder();
- var startX = Next100();
- var startY = Next100();
- pb.AddMoveTo(false, startX, startY);
- for (int i = 0; i < rnd.Next(20, 80); ++i)
- AddCurve(pb, rnd);
- pb.AddCurveTo(false, Next100(), Next100(), Next100(), Next100(), startX, startY);
-
- svg.Children.Add(new SvgPathElement()
- {
- FillRule = SvgFillRule.EvenOdd,
- Fill = new SvgPaint(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))),
- Stroke = new SvgPaint(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))),
- StrokeWidth = new SvgLength(rnd.Next(20) / 10f, SvgLengthUnits.Percentage),
- PathData = pb.ToPathData(),
- FillOpacity = Next100() / 100f,
- StrokeOpacity = Next100() / 100f,
- });
- }
-
- void AddCurve(SvgPathBuilder pb, Random _rnd)
- {
- switch (_rnd.Next(5))
- {
- case 0:
- pb.AddCurveTo(false, Next100(), Next100(), Next100(), Next100(), Next100(), Next100());
- break;
- case 1:
- pb.AddSmoothCurveTo(false, Next100(), Next100(), Next100(), Next100());
- break;
- case 2:
- pb.AddQuadraticBezierCurveTo(false, Next100(), Next100(), Next100(), Next100());
- break;
- case 3:
- pb.AddSmoothQuadraticBezierCurveTo(false, Next100(), Next100());
- break;
- case 4:
- pb.AddEllipticalArc(false, Next100(), Next100(), _rnd.Next(360),
- _rnd.Next(2) == 0 ? GCDRAW.ArcSize.Small : GCDRAW.ArcSize.Large,
- _rnd.Next(2) == 0 ? GCDRAW.SweepDirection.Clockwise : GCDRAW.SweepDirection.CounterClockwise,
- Next100(), Next100());
- break;
- }
- }
- }
- }
-