public override Element TransformGeometry (Transform transform) { var p = new Path (); base.SetCloneData (p); p.Transform = Transform.Identity; p.MoveTo (frame.TopLeft); p.LineTo (frame.BottomLeft); p.LineTo (frame.BottomRight); p.LineTo (frame.TopRight); p.Close (); var tp = p.TransformGeometry (transform * Transform); return tp; }
void ReadPath(Path p, string pathDescriptor) { Match m = pathRegex.Match(pathDescriptor); while (m.Success) { var match = m.Value.TrimStart(); var op = match[0]; if (op == 'z' || op == 'Z') { p.Close(); } else { // make sure negative numbers are split properly match = negativeNumberRe.Replace(match.Substring(1), " -"); var args = match.Split(WSC, StringSplitOptions.RemoveEmptyEntries); Point previousPoint = new Point(); int index = 0; while (index < args.Length) { if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath)) { previousPoint = p.Operations.Last().EndPoint; } if ((op == 'M' || op == 'm') && args.Length >= index + 2) { var point = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1])); if (op == 'm') { point += previousPoint; } p.MoveTo(point); index += 2; } else if ((op == 'L' || op == 'l') && args.Length >= index + 2) { var point = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1])); if (op == 'l') { point += previousPoint; } p.LineTo(point); index += 2; } else if ((op == 'C' || op == 'c') && args.Length >= index + 6) { var c1 = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1])); var c2 = new Point(ReadNumber(args [index + 2]), ReadNumber(args [index + 3])); var pt = new Point(ReadNumber(args [index + 4]), ReadNumber(args [index + 5])); if (op == 'c') { c1 += previousPoint; c2 += previousPoint; pt += previousPoint; } p.CurveTo(c1, c2, pt); index += 6; } else if ((op == 'S' || op == 's') && args.Length >= index + 4) { var c = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1])); var pt = new Point(ReadNumber(args [index + 2]), ReadNumber(args [index + 3])); if (op == 's') { c += previousPoint; pt += previousPoint; } p.ContinueCurveTo(c, pt); index += 4; } else if ((op == 'A' || op == 'a') && args.Length >= index + 7) { var r = new Size(ReadNumber(args [index]), ReadNumber(args [index + 1])); // var xr = ReadNumber (args [i + 2]); var laf = ReadNumber(args [index + 3]) != 0; var swf = ReadNumber(args [index + 4]) != 0; var pt = new Point(ReadNumber(args [index + 5]), ReadNumber(args [index + 6])); if (op == 'a') { pt += previousPoint; } p.ArcTo(r, laf, swf, pt); index += 7; } else if ((op == 'V' || op == 'v') && args.Length >= index + 1 && p.Operations.Count > 0) { var previousX = previousPoint.X; var y = ReadNumber(args[index]); if (op == 'v') { y += previousPoint.Y; } var point = new Point(previousX, y); p.LineTo(point); index += 1; } else if ((op == 'H' || op == 'h') && args.Length >= index + 1 && p.Operations.Count > 0) { var previousY = previousPoint.Y; var x = ReadNumber(args[index]); if (op == 'h') { x += previousPoint.X; } var point = new Point(x, previousY); p.LineTo(point); index += 1; } else { throw new NotSupportedException("Path Operation " + op); } } } m = m.NextMatch(); } }
void ReadPoints (Path p, string pathDescriptor, bool closePath) { var args = pathDescriptor.Split (new[]{' '}, StringSplitOptions.RemoveEmptyEntries); var i = 0; var n = args.Length; if (n == 0) throw new Exception ("No points specified"); while (i < n) { var xy = args[i].Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries); var x = 0.0; var y = 0.0; var di = 1; if (xy.Length == 1) { x = ReadNumber (args [i]); y = ReadNumber (args [i + 1]); di = 2; } else { x = ReadNumber (xy[0]); y = ReadNumber (xy[1]); } if (i == 0) { p.MoveTo (x, y); } else { p.LineTo (x, y); } i += di; } if (closePath) p.Close (); }
void ReadPath (Path p, string pathDescriptor) { Match m = pathRegex.Match(pathDescriptor); while(m.Success) { var match = m.Value.TrimStart (); var op = match[0]; if (op == 'z' || op == 'Z') { p.Close (); } else { // make sure negative numbers are split properly match = negativeNumberRe.Replace(match.Substring(1), " -"); var args = match.Split(WSC, StringSplitOptions.RemoveEmptyEntries); Point previousPoint = new Point (); int index = 0; while(index < args.Length) { if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath)) previousPoint = p.Operations.Last().EndPoint; if ((op == 'M' || op == 'm') && args.Length >= index+2) { var point = new Point (ReadNumber (args [index]), ReadNumber (args [index+1])); if (op == 'm') point += previousPoint; p.MoveTo (point); index += 2; } else if ((op == 'L' || op == 'l') && args.Length >= index+2) { var point = new Point (ReadNumber (args [index]), ReadNumber (args [index+1])); if (op == 'l') point += previousPoint; p.LineTo (point); index += 2; } else if ((op == 'C' || op == 'c') && args.Length >= index+6) { var c1 = new Point (ReadNumber (args [index]), ReadNumber (args [index+1])); var c2 = new Point (ReadNumber (args [index+2]), ReadNumber (args [index+3])); var pt = new Point (ReadNumber (args [index+4]), ReadNumber (args [index+5])); if (op == 'c') { c1 += previousPoint; c2 += previousPoint; pt += previousPoint; } p.CurveTo (c1, c2, pt); index += 6; } else if ((op == 'S' || op == 's') && args.Length >= index+4) { var c = new Point (ReadNumber (args [index]), ReadNumber (args [index+1])); var pt = new Point (ReadNumber (args [index+2]), ReadNumber (args [index+3])); if (op == 's') { c += previousPoint; pt += previousPoint; } p.ContinueCurveTo (c, pt); index += 4; } else if ((op == 'A' || op == 'a') && args.Length >= index+7) { var r = new Size (ReadNumber (args [index]), ReadNumber (args [index+1])); // var xr = ReadNumber (args [i + 2]); var laf = ReadNumber (args [index+3]) != 0; var swf = ReadNumber (args [index+4]) != 0; var pt = new Point (ReadNumber (args [index+5]), ReadNumber (args [index+6])); if (op == 'a') pt += previousPoint; p.ArcTo (r, laf, swf, pt); index += 7; } else if ((op == 'V' || op == 'v') && args.Length >= index+1 && p.Operations.Count > 0) { var previousX = previousPoint.X; var y = ReadNumber(args[index]); if (op == 'v') y += previousPoint.Y; var point = new Point(previousX, y); p.LineTo(point); index += 1; } else if ((op == 'H' || op == 'h') && args.Length >= index+1 && p.Operations.Count > 0) { var previousY = previousPoint.Y; var x = ReadNumber(args[index]); if (op == 'h') x += previousPoint.X; var point = new Point(x, previousY); p.LineTo(point); index += 1; } else { throw new NotSupportedException ("Path Operation " + op); } } } m = m.NextMatch(); } }
void ReadPoints(Path p, string pathDescriptor, bool closePath) { var args = pathDescriptor.Split (new[]{' '}, StringSplitOptions.RemoveEmptyEntries); var i = 0; var n = args.Length; if (n == 0) throw new Exception ("Not supported point"); while (i < n) { var xy = args[i].Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries); var x = ReadNumber (xy[0]); var y = ReadNumber (xy[1]); if (i == 0) { p.MoveTo (x, y); } else p.LineTo (x, y); i++; } if (closePath) p.Close (); }
void ReadPath(Path p, string pathDescriptor) { Match m = pathRegex.Match(pathDescriptor); while(m.Success) { var match = m.Value.Trim(); var op = match.Substring(0, 1); // make sure negative numbers are split properly match = match.Replace("-", " -"); var args = match.Substring(1).Split(WSC, StringSplitOptions.RemoveEmptyEntries); Point previousPoint = new Point (); if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath)) previousPoint = p.Operations.Last().EndPoint; if ((op == "M" || op == "m") && args.Length >= 2) { var point = new Point (ReadNumber (args [0]), ReadNumber (args [1])); if (op == "m") point += previousPoint; p.MoveTo (point); } else if ((op == "L" || op == "l") && args.Length >= 2) { var point = new Point (ReadNumber (args [0]), ReadNumber (args [1])); if (op == "l") point += previousPoint; p.LineTo (point); } else if ((op == "C" || op == "c") && args.Length >= 6) { var c1 = new Point (ReadNumber (args [0]), ReadNumber (args [1])); var c2 = new Point (ReadNumber (args [2]), ReadNumber (args [3])); var pt = new Point (ReadNumber (args [4]), ReadNumber (args [5])); if (op == "c") { c1 += previousPoint; c2 += previousPoint; pt += previousPoint; } p.CurveTo (c1, c2, pt); } else if ((op == "S" || op == "s") && args.Length >= 4) { var c = new Point (ReadNumber (args [0]), ReadNumber (args [1])); var pt = new Point (ReadNumber (args [2]), ReadNumber (args [3])); if (op == "s") { c += previousPoint; pt += previousPoint; } p.ContinueCurveTo (c, pt); } else if ((op == "A" || op == "a") && args.Length >= 7) { var r = new Size (ReadNumber (args [0]), ReadNumber (args [1])); // var xr = ReadNumber (args [i + 2]); var laf = ReadNumber (args [3]) != 0; var swf = ReadNumber (args [4]) != 0; var pt = new Point (ReadNumber (args [5]), ReadNumber (args [6])); if (op == "a") pt += previousPoint; p.ArcTo (r, laf, swf, pt); } else if ((op == "V" || op == "v") && args.Length >= 1 && p.Operations.Count > 0) { var previousX = previousPoint.X; var y = ReadNumber(args[0]); if (op == "v") y += previousPoint.Y; var point = new Point(previousX, y); p.LineTo(point); } else if ((op == "H" || op == "h") && args.Length >= 1 && p.Operations.Count > 0) { var previousY = previousPoint.Y; var x = ReadNumber(args[0]); if (op == "h") x += previousPoint.X; var point = new Point(x, previousY); p.LineTo(point); } else if (op == "z" || op == "Z") { p.Close (); } else { throw new NotSupportedException ("Path Operation " + op); } m = m.NextMatch(); } }
void ReadPolygon(Path p, string pathDescriptor) { var args = pathDescriptor.Split (new[]{' '}, StringSplitOptions.RemoveEmptyEntries); var i = 0; var n = args.Length; if (n == 0) throw new Exception ("Not supported polygon"); while (i < n) { var x = ReadNumber (args [i]); var y = ReadNumber (args [i + 1]); if (i == 0) { p.MoveTo (x, y); } else p.LineTo (x, y); i += 2; } p.Close (); }
void ReadPath(Path p, string pathDescriptor) { var args = pathDescriptor.Split (WSC, StringSplitOptions.RemoveEmptyEntries); var i = 0; var n = args.Length; while (i < n) { var a = args[i]; // // Get the operation // var op = ""; if (a.Length == 1) { op = a; i++; } else { op = a.Substring (0, 1); args [i] = a.Substring (1); } // // Execute // if (op == "M" && i + 1 < n) { p.MoveTo (new Point (ReadNumber (args [i]), ReadNumber (args [i + 1]))); i += 2; } else if (op == "L" && i + 1 < n) { p.LineTo (new Point (ReadNumber (args [i]), ReadNumber (args [i + 1]))); i += 2; } else if (op == "C" && i + 5 < n) { var c1 = new Point (ReadNumber (args [i]), ReadNumber (args [i + 1])); var c2 = new Point (ReadNumber (args [i + 2]), ReadNumber (args [i + 3])); var pt = new Point (ReadNumber (args [i + 4]), ReadNumber (args [i + 5])); p.CurveTo (c1, c2, pt); i += 6; } else if (op == "S" && i + 3 < n) { var c = new Point (ReadNumber (args [i]), ReadNumber (args [i + 1])); var pt = new Point (ReadNumber (args [i + 2]), ReadNumber (args [i + 3])); p.ContinueCurveTo (c, pt); i += 4; } else if (op == "A" && i + 6 < n) { var r = new Size (ReadNumber (args [i]), ReadNumber (args [i + 1])); // var xr = ReadNumber (args [i + 2]); var laf = ReadNumber (args [i + 3]) != 0; var swf = ReadNumber (args [i + 4]) != 0; var pt = new Point (ReadNumber (args [i + 5]), ReadNumber (args [i + 6])); p.ArcTo (r, laf, swf, pt); i += 7; } else if (op == "z" || op == "Z") { p.Close (); } else { throw new NotSupportedException ("Path Operation " + op); } } }
void ReadPath(Path p, string pathDescriptor) { var args = pathDescriptor.Split(WSC, StringSplitOptions.RemoveEmptyEntries); var i = 0; var n = args.Length; while (i < n) { var a = args[i]; // // Get the operation // var op = ""; if (a.Length == 1) { op = a; i++; } else { op = a.Substring(0, 1); args [i] = a.Substring(1); } // // Execute // if (op == "M" && i + 1 < n) { p.MoveTo(new Point(ReadNumber(args [i]), ReadNumber(args [i + 1]))); i += 2; } else if (op == "L" && i + 1 < n) { p.LineTo(new Point(ReadNumber(args [i]), ReadNumber(args [i + 1]))); i += 2; } else if (op == "C" && i + 5 < n) { var c1 = new Point(ReadNumber(args [i]), ReadNumber(args [i + 1])); var c2 = new Point(ReadNumber(args [i + 2]), ReadNumber(args [i + 3])); var pt = new Point(ReadNumber(args [i + 4]), ReadNumber(args [i + 5])); p.CurveTo(c1, c2, pt); i += 6; } else if (op == "S" && i + 3 < n) { var c = new Point(ReadNumber(args [i]), ReadNumber(args [i + 1])); var pt = new Point(ReadNumber(args [i + 2]), ReadNumber(args [i + 3])); p.ContinueCurveTo(c, pt); i += 4; } else if (op == "A" && i + 6 < n) { var r = new Size(ReadNumber(args [i]), ReadNumber(args [i + 1])); // var xr = ReadNumber (args [i + 2]); var laf = ReadNumber(args [i + 3]) != 0; var swf = ReadNumber(args [i + 4]) != 0; var pt = new Point(ReadNumber(args [i + 5]), ReadNumber(args [i + 6])); p.ArcTo(r, laf, swf, pt); i += 7; } else if (op == "z" || op == "Z") { p.Close(); } else { throw new NotSupportedException("Path Operation " + op); } } }
void ReadPath(Path p, string pathDescriptor) { Match m = pathRegex.Match(pathDescriptor); while (m.Success) { var match = m.Value.TrimStart(); var op = match[0]; var args = match.Substring(1).Split(WSC, StringSplitOptions.RemoveEmptyEntries); Point previousPoint = new Point(); if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath)) { previousPoint = p.Operations.Last().EndPoint; } if ((op == 'M' || op == 'm') && args.Length >= 2) { int pos = 0; while (pos + 1 < args.Length) { var point = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1])); if (op == 'm') { point += previousPoint; } p.MoveTo(point); pos += 2; } } else if ((op == 'L' || op == 'l') && args.Length >= 2) { int pos = 0; while (pos + 1 < args.Length) { var point = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1])); if (op == 'l') { point += previousPoint; } p.LineTo(point); pos += 2; } } else if ((op == 'C' || op == 'c') && args.Length >= 6) { int pos = 0; while (pos + 5 < args.Length) { var c1 = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1])); var c2 = new Point(ReadNumber(args[pos + 2]), ReadNumber(args[pos + 3])); var pt = new Point(ReadNumber(args[pos + 4]), ReadNumber(args[pos + 5])); if (op == 'c') { c1 += previousPoint; c2 += previousPoint; pt += previousPoint; } p.CurveTo(c1, c2, pt); pos += 6; } } else if ((op == 'S' || op == 's') && args.Length >= 4) { int pos = 0; while (pos + 3 < args.Length) { var c = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1])); var pt = new Point(ReadNumber(args[pos + 2]), ReadNumber(args[pos + 3])); if (op == 's') { c += previousPoint; pt += previousPoint; } p.ContinueCurveTo(c, pt); pos += 4; } } else if ((op == 'Q' || op == 'q') && args.Length >= 4) { int pos = 0; while (pos + 3 < args.Length) { var c1 = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1])); var pt = new Point(ReadNumber(args[pos + 2]), ReadNumber(args[pos + 3])); if (op == 'q') { c1 += previousPoint; pt += previousPoint; } p.CurveTo(new Point(double.NaN, double.NaN), c1, pt); pos += 4; } } else if ((op == 'A' || op == 'a') && args.Length >= 7) { int pos = 0; while (pos + 6 < args.Length) { var r = new Size(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1])); var xr = ReadNumber(args[pos + 2]); var laf = ReadNumber(args[pos + 3]) != 0; var swf = ReadNumber(args[pos + 4]) != 0; var pt = new Point(ReadNumber(args[pos + 5]), ReadNumber(args[pos + 6])); if (op == 'a') { pt += previousPoint; } p.ArcTo(r, laf, swf, pt, xr); pos += 7; } } else if ((op == 'V' || op == 'v') && args.Length >= 1 && p.Operations.Count > 0) { int pos = 0; while (pos < args.Length) { var previousX = previousPoint.X; var y = ReadNumber(args[pos + 0]); if (op == 'v') { y += previousPoint.Y; } var point = new Point(previousX, y); p.LineTo(point); pos += 1; } } else if ((op == 'H' || op == 'h') && args.Length >= 1 && p.Operations.Count > 0) { int pos = 0; while (pos < args.Length) { var previousY = previousPoint.Y; var x = ReadNumber(args[pos + 0]); if (op == 'h') { x += previousPoint.X; } var point = new Point(x, previousY); p.LineTo(point); pos += 1; } } else if (op == 'z' || op == 'Z') { p.Close(); } else { throw new NotSupportedException("Path Operation " + op); } m = m.NextMatch(); } }
void ReadPath(Path p, string pathDescriptor) { Point previousPoint = new Point(); var tokens = LexPath(pathDescriptor); var ntokens = tokens.Count; var it = 0; var argsLength = 0; var argsStartIndex = 0; double Arg(int index) => tokens[argsStartIndex + index].Value; while (it < ntokens) { while (it < ntokens && tokens[it].IsNumber) { it++; } if (it >= ntokens) { break; } var op = tokens[it].Operator; var itEnd = it + 1; while (itEnd < ntokens && tokens[itEnd].IsNumber) { itEnd++; } argsStartIndex = it + 1; argsLength = itEnd - argsStartIndex; if (op == 'z' || op == 'Z') { p.Close(); } else if (op == 'M' || op == 'm') { var i = 0; while (i + 1 < argsLength) { var point = new Point(Arg(i), Arg(i + 1)); if (op == 'm') { point += previousPoint; } if (i == 0) { p.MoveTo(point); } else { p.LineTo(point); } previousPoint = point; i += 2; } } else if (op == 'L' || op == 'l') { var i = 0; while (i + 1 < argsLength) { var point = new Point(Arg(i), Arg(i + 1)); if (op == 'l') { point += previousPoint; } p.LineTo(point); previousPoint = point; i += 2; } } else if (op == 'C' || op == 'c') { var i = 0; while (i + 5 < argsLength) { var c1 = new Point(Arg(i + 0), Arg(i + 1)); var c2 = new Point(Arg(i + 2), Arg(i + 3)); var pt = new Point(Arg(i + 4), Arg(i + 5)); if (op == 'c') { c1 += previousPoint; c2 += previousPoint; pt += previousPoint; } p.CurveTo(c1, c2, pt); previousPoint = pt; i += 6; } } else if (op == 'S' || op == 's') { var i = 0; while (i + 3 < argsLength) { var c = new Point(Arg(i + 0), Arg(i + 1)); var pt = new Point(Arg(i + 2), Arg(i + 3)); if (op == 's') { c += previousPoint; pt += previousPoint; } p.ContinueCurveTo(c, pt); previousPoint = pt; i += 4; } } else if (op == 'A' || op == 'a') { var i = 0; while (i + 6 < argsLength) { var r = new Size(Arg(i + 0), Arg(i + 1)); //var xr = Arg (i + 2); var laf = Arg(i + 3) != 0; var swf = Arg(i + 4) != 0; var pt = new Point(Arg(i + 5), Arg(i + 6)); if (op == 'a') { pt += previousPoint; } p.ArcTo(r, laf, swf, pt); previousPoint = pt; i += 7; } } else if (op == 'V' || op == 'v') { var i = 0; while (i < argsLength) { var previousX = previousPoint.X; var y = Arg(i); if (op == 'v') { y += previousPoint.Y; } var pt = new Point(previousX, y); p.LineTo(pt); previousPoint = pt; i += 1; } } else if (op == 'H' || op == 'h') { var i = 0; while (i < argsLength) { var previousY = previousPoint.Y; var x = Arg(i); if (op == 'h') { x += previousPoint.X; } var pt = new Point(x, previousY); p.LineTo(pt); previousPoint = pt; i += 1; } } else { throw new NotSupportedException("Path Operation " + op); } it = itEnd; } }
public async Task TriWithRadGrad () { var canvas = Platform.CreateImageCanvas (new Size (100), transparency: true); var size = new Size (100); var b = new RadialGradientBrush ( new Point (0.5, 1), new Size (1), Colors.Yellow, Colors.Blue); var p = new Path (); p.MoveTo (0, 0); p.LineTo (size.Width, 0); p.LineTo (size.Width / 2, size.Height); p.Close (); p.Brush = b; p.Draw (canvas); await SaveImage (canvas, "ImageCanvas.TriWithRadGrad"); }