7 internal enum SvgPathState
28 SKColor Foreground, SKColor Background)
47 SKColor Foreground, SKColor Background,
float OffsetX,
float OffsetY,
float ScaleX,
float ScaleY)
49 SKSurface Surface = SKSurface.Create(
new SKImageInfo(Width, Height, SKImageInfo.PlatformColorType, SKAlphaType.Premul));
52 SKCanvas Canvas = Surface.Canvas;
53 Canvas.Clear(Background);
55 SKPath Path =
Parse(
SvgPath, OffsetX, OffsetY, ScaleX, ScaleY);
57 SKPaint IconFill =
new SKPaint()
59 FilterQuality = SKFilterQuality.High,
61 Style = SKPaintStyle.Fill,
65 Canvas.DrawPath(Path, IconFill);
67 return Surface.Snapshot();
85 SKColor Foreground, SKColor Background)
104 SKColor Foreground, SKColor Background,
float OffsetX,
float OffsetY,
float ScaleX,
float ScaleY)
106 using (SKImage Image =
SvgPathToImage(
SvgPath, Width, Height, Foreground, Background, OffsetX, OffsetY, ScaleX, ScaleY))
108 return SKBitmap.FromImage(Image);
120 public static SKPath
Parse(
string Path)
122 return Parse(Path, 0, 0, 1, 1);
137 public static SKPath
Parse(
string Path,
float OffsetX,
float OffsetY,
float ScaleX,
float ScaleY)
139 SKPath Result =
new SKPath();
140 SvgPathState State = SvgPathState.ExpectCommand;
141 StringBuilder sb =
new StringBuilder();
142 float[] Numbers =
new float[7];
147 char Command = (char)0;
150 foreach (
char ch
in Path)
157 case SvgPathState.ExpectCommand:
178 State = SvgPathState.ExpectNumber;
187 State = SvgPathState.ExpectNumber;
191 AddCommand(Result, Command, Numbers, ref LastX, ref LastY, OffsetX, OffsetY, ScaleX, ScaleY);
198 State = SvgPathState.ExpectNumber;
203 Numbers[0] = 2 * Numbers[4] - Numbers[2];
204 Numbers[1] = 2 * Numbers[5] - Numbers[3];
207 State = SvgPathState.ExpectNumber;
214 State = SvgPathState.ExpectNumber;
219 Numbers[0] = 2 * Numbers[2] - Numbers[0];
220 Numbers[1] = 2 * Numbers[3] - Numbers[1];
223 State = SvgPathState.ExpectNumber;
230 State = SvgPathState.ExpectNumber;
235 throw new Exception(
"Unexpected draw command: " + Command);
239 case SvgPathState.ExpectNumber:
254 throw new Exception(
"Invalid number: " + sb.ToString());
258 Numbers[NumberIndex++] = f;
263 AddCommand(Result, Command, Numbers, ref LastX, ref LastY, OffsetX, OffsetY, ScaleX, ScaleY);
264 State = SvgPathState.ExpectCommand;
290 throw new Exception(
"Invalid number: " + sb.ToString());
294 Numbers[NumberIndex++] = f;
298 throw new Exception(
"Unexpected numerical character: " + ch);
300 AddCommand(Result, Command, Numbers, ref LastX, ref LastY, OffsetX, OffsetY, ScaleX, ScaleY);
301 State = SvgPathState.ExpectCommand;
310 throw new Exception(
"Unexpected state: " + State.ToString());
319 private static void AddCommand(SKPath Path,
char Command,
float[] Numbers,
320 ref
float LastX, ref
float LastY,
float OffsetX,
float OffsetY,
float ScaleX,
float ScaleY)
325 LastX = Numbers[0] * ScaleX + OffsetX;
326 LastY = Numbers[1] * ScaleY + OffsetY;
327 Path.MoveTo(LastX, LastY);
331 LastX += Numbers[0] * ScaleX;
332 LastY += Numbers[1] * ScaleY;
333 Path.MoveTo(LastX, LastY);
337 LastX = Numbers[0] * ScaleX + OffsetX;
338 LastY = Numbers[1] * ScaleY + OffsetY;
339 Path.LineTo(LastX, LastY);
343 LastX += Numbers[0] * ScaleX;
344 LastY += Numbers[1] * ScaleY;
345 Path.LineTo(LastX, LastY);
349 LastX = Numbers[0] * ScaleX + OffsetX;
350 Path.LineTo(LastX, LastY);
354 LastX += Numbers[0] * ScaleX;
355 Path.LineTo(LastX, LastY);
359 LastY = Numbers[0] * ScaleY + OffsetY;
360 Path.LineTo(LastX, LastY);
364 LastY += Numbers[0] * ScaleY;
365 Path.LineTo(LastX, LastY);
374 float x1 = Numbers[0] * ScaleX + OffsetX;
375 float y1 = Numbers[1] * ScaleY + OffsetY;
376 float x2 = Numbers[2] * ScaleX + OffsetX;
377 float y2 = Numbers[3] * ScaleY + OffsetY;
378 LastX = Numbers[4] * ScaleX + OffsetX;
379 LastY = Numbers[5] * ScaleY + OffsetY;
380 Path.CubicTo(x1, y1, x2, y2, LastX, LastY);
385 x1 = LastX + Numbers[0] * ScaleX;
386 y1 = LastY + Numbers[1] * ScaleY;
387 x2 = LastX + Numbers[2] * ScaleX;
388 y2 = LastY + Numbers[3] * ScaleY;
390 LastX += Numbers[4] * ScaleX;
391 LastY += Numbers[5] * ScaleY;
393 Path.CubicTo(x1, y1, x2, y2, LastX, LastY);
398 x1 = Numbers[0] * ScaleX + OffsetX;
399 y1 = Numbers[1] * ScaleY + OffsetY;
400 LastX = Numbers[2] * ScaleX + OffsetX;
401 LastY = Numbers[3] * ScaleY + OffsetY;
402 Path.QuadTo(x1, y1, LastX, LastY);
407 x1 = LastX + Numbers[0] * ScaleX;
408 y1 = LastY + Numbers[1] * ScaleY;
410 LastX += Numbers[2] * ScaleX;
411 LastY += Numbers[3] * ScaleY;
413 Path.QuadTo(x1, y1, LastX, LastY);
417 LastX = Numbers[5] * ScaleX + OffsetX;
418 LastY = Numbers[6] * ScaleY + OffsetY;
419 Path.ArcTo(Numbers[0] * ScaleX, Numbers[1] * ScaleY, Numbers[2],
420 Numbers[3] == 0 ? SKPathArcSize.Large : SKPathArcSize.Small,
421 Numbers[4] == 0 ? SKPathDirection.CounterClockwise : SKPathDirection.Clockwise,
426 LastX += Numbers[5] * ScaleX;
427 LastY += Numbers[6] * ScaleY;
428 Path.ArcTo(Numbers[0] * ScaleX, Numbers[1] * ScaleY, Numbers[2],
429 Numbers[3] == 0 ? SKPathArcSize.Small : SKPathArcSize.Large,
430 Numbers[4] == 0 ? SKPathDirection.CounterClockwise : SKPathDirection.Clockwise,
Helps with parsing of commong data types.
static bool TryParse(string s, out double Value)
Tries to decode a string encoded double.
static SKImage SvgPathToImage(string SvgPath, int Width, int Height, SKColor Foreground, SKColor Background)
Parses an SVG Path and generates an image from it.
static SKPath Parse(string Path)
Parses an SVG Path.
static SKPath Parse(string Path, float OffsetX, float OffsetY, float ScaleX, float ScaleY)
Parses an SVG Path.
static SKBitmap SvgPathToBitmap(string SvgPath, int Width, int Height, SKColor Foreground, SKColor Background, float OffsetX, float OffsetY, float ScaleX, float ScaleY)
Parses an SVG Path and generates a bitmap image from it.
static SKImage SvgPathToImage(string SvgPath, int Width, int Height, SKColor Foreground, SKColor Background, float OffsetX, float OffsetY, float ScaleX, float ScaleY)
Parses an SVG Path and generates an image from it.
static SKBitmap SvgPathToBitmap(string SvgPath, int Width, int Height, SKColor Foreground, SKColor Background)
Parses an SVG Path and generates a bitmap image from it.