SvgRandomArt.cs
  1. //
  2. // This code is part of Document Solutions for PDF demos.
  3. // Copyright (c) MESCIUS inc. All rights reserved.
  4. //
  5. using System;
  6. using System.IO;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Collections.Generic;
  10. using GrapeCity.Documents.Pdf;
  11. using GrapeCity.Documents.Text;
  12. using GrapeCity.Documents.Svg;
  13. using GCTEXT = GrapeCity.Documents.Text;
  14. using GCDRAW = GrapeCity.Documents.Drawing;
  15. using DsPdfWeb.Demos.Common;
  16.  
  17. namespace DsPdfWeb.Demos
  18. {
  19. // This sample generates some random abstract art using the SVG path API
  20. // provided by GcSvgDocument.
  21. public class SvgRandomArt
  22. {
  23. private Random _rnd = Util.NewRandom();
  24.  
  25. public int CreatePDF(Stream stream)
  26. {
  27. using var svgDoc = new GcSvgDocument();
  28. var svg = svgDoc.RootSvg;
  29. svg.ViewBox = new SvgViewBox(0, 0, 100, 100);
  30.  
  31. // Random art:
  32. for (int i = 0; i < _rnd.Next(6, 12); i++)
  33. AddFigure(svg, _rnd);
  34.  
  35. // Border:
  36. svg.Children.Add(new SvgRectElement()
  37. {
  38. Width = new SvgLength(100),
  39. Height = new SvgLength(100),
  40. Stroke = new SvgPaint(Color.FromArgb(_rnd.Next(256), _rnd.Next(256), _rnd.Next(256))),
  41. Fill = SvgPaint.None
  42. });
  43. // Clip:
  44. svg.Clip = new SvgClip(new SvgLength(0), new SvgLength(0), new SvgLength(100), new SvgLength(100));
  45.  
  46. // Render the SVG image to a PDF:
  47. var doc = new GcPdfDocument();
  48. var page = doc.NewPage();
  49. var g = page.Graphics;
  50. var s = svgDoc.GetIntrinsicSize(SvgLengthUnits.Points);
  51.  
  52. var margin = 72;
  53. var rect = new RectangleF(margin, margin, page.Size.Width - margin * 2, page.Size.Width - margin * 2);
  54. g.DrawSvg(svgDoc, rect);
  55.  
  56. // Done:
  57. doc.Save(stream);
  58. return doc.Pages.Count;
  59. }
  60.  
  61. int Next100()
  62. {
  63. return _rnd.Next(100);
  64. }
  65.  
  66. void AddFigure(SvgSvgElement svg, Random rnd)
  67. {
  68. var pb = new SvgPathBuilder();
  69. var startX = Next100();
  70. var startY = Next100();
  71. pb.AddMoveTo(false, startX, startY);
  72. for (int i = 0; i < rnd.Next(20, 80); ++i)
  73. AddCurve(pb, rnd);
  74. pb.AddCurveTo(false, Next100(), Next100(), Next100(), Next100(), startX, startY);
  75.  
  76. svg.Children.Add(new SvgPathElement()
  77. {
  78. FillRule = SvgFillRule.EvenOdd,
  79. Fill = new SvgPaint(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))),
  80. Stroke = new SvgPaint(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))),
  81. StrokeWidth = new SvgLength(rnd.Next(20) / 10f, SvgLengthUnits.Percentage),
  82. PathData = pb.ToPathData(),
  83. FillOpacity = Next100() / 100f,
  84. StrokeOpacity = Next100() / 100f,
  85. });
  86. }
  87.  
  88. void AddCurve(SvgPathBuilder pb, Random _rnd)
  89. {
  90. switch (_rnd.Next(5))
  91. {
  92. case 0:
  93. pb.AddCurveTo(false, Next100(), Next100(), Next100(), Next100(), Next100(), Next100());
  94. break;
  95. case 1:
  96. pb.AddSmoothCurveTo(false, Next100(), Next100(), Next100(), Next100());
  97. break;
  98. case 2:
  99. pb.AddQuadraticBezierCurveTo(false, Next100(), Next100(), Next100(), Next100());
  100. break;
  101. case 3:
  102. pb.AddSmoothQuadraticBezierCurveTo(false, Next100(), Next100());
  103. break;
  104. case 4:
  105. pb.AddEllipticalArc(false, Next100(), Next100(), _rnd.Next(360),
  106. _rnd.Next(2) == 0 ? GCDRAW.ArcSize.Small : GCDRAW.ArcSize.Large,
  107. _rnd.Next(2) == 0 ? GCDRAW.SweepDirection.Clockwise : GCDRAW.SweepDirection.CounterClockwise,
  108. Next100(), Next100());
  109. break;
  110. }
  111. }
  112. }
  113. }
  114.