public SvgTransform(Matrix m, SvgTransformType type) { _m = m; this._type = type; }
/// <summary> /// Parse a transformation according to the SVG standard. This is complex enough that it makes /// me wish it was worth using a real parser, but antlr is so unwieldy. /// </summary> public void FromString(string s) { _m = new Matrix(); string name, args; int idx = s.IndexOf("("); if (idx != -1) { name = s.Substring(0, idx).Trim(); int idx2 = s.IndexOf(")"); if (idx2 != -1) { args = s.Substring(idx+1, (idx2 - idx) -1); float[] points = SvgNumList.String2Floats(args); if (name.IndexOf("matrix")!=-1) { _type = SvgTransformType.SVG_TRANSFORM_MATRIX; if (points.Length == 6) { _m = new Matrix(points[0], points[1], points[2], points[3], points[4], points[5]); return; } } else if (name.IndexOf("translate")!=-1) { _type = SvgTransformType.SVG_TRANSFORM_TRANSLATE; if (points.Length == 1) { _m.Translate(points[0], 0); return; } if (points.Length == 2) { _m.Translate(points[0], points[1]); return; } } else if (name.IndexOf("scale")!=-1) { _type = SvgTransformType.SVG_TRANSFORM_SCALE; if (points.Length == 1) { _m.Scale(points[0], 0); return; } if (points.Length == 2) { _m.Scale(points[0], points[1]); return; } } else if (name.IndexOf("rotate")!=-1) { _type = SvgTransformType.SVG_TRANSFORM_ROTATE; if (points.Length == 1) { _m.Rotate(points[0]); _angle = points[0]; return; } else if (points.Length == 3) { _angle = points[0]; _m.Translate(points[1], points[2]); _m.Rotate(points[0]); _m.Translate(points[1]*-1, points[2]*-1); return; } } else if (name.IndexOf("skewX")!=-1) { _type = SvgTransformType.SVG_TRANSFORM_SKEWX; if (points.Length == 1) { _m.Shear(points[0], 0); return; } } else if (name.IndexOf("skewY")!=-1) { _type = SvgTransformType.SVG_TRANSFORM_SKEWY; if (points.Length == 1) { _m.Shear(0, points[0]); return; } } } } throw new SvgException("Invalid SvgTransformation", s); }
public SvgTransform() { _m = new Matrix(); _type = SvgTransformType.SVG_TRANSFORM_MATRIX; }
public SvgTransform(ISvgMatrix matrix) { _type = SvgTransformType.Matrix; _matrix = matrix; }
public SvgTransform(string str) { int start = str.IndexOf("(", StringComparison.OrdinalIgnoreCase); string type = str.Substring(0, start); string valuesList = (str.Substring(start + 1, str.Length - start - 2)).Trim(); //JR added trim Regex re = new Regex("[\\s\\,]+"); valuesList = re.Replace(valuesList, ","); string[] valuesStr = valuesList.Split(new char[] { ',' }); int len = valuesStr.GetLength(0); double[] values = new double[len]; try { for (int i = 0; i < len; i++) { values[i] = SvgNumber.Parse(valuesStr[i]); } } catch { values = SvgNumber.ParseDoubles(str); len = values.Length; } _values = values; switch (type.Trim()) { case "translate": switch (len) { case 1: SetTranslate(values[0], 0); break; case 2: SetTranslate(values[0], values[1]); break; default: throw new ApplicationException("Wrong number of arguments in translate transform"); } break; case "rotate": switch (len) { case 1: SetRotate(values[0]); break; case 3: SetRotate(values[0], values[1], values[2]); break; default: throw new ApplicationException("Wrong number of arguments in rotate transform"); } break; case "scale": switch (len) { case 1: SetScale(values[0], values[0]); break; case 2: SetScale(values[0], values[1]); break; default: throw new ApplicationException("Wrong number of arguments in scale transform"); } break; case "skewX": if (len != 1) { throw new ApplicationException("Wrong number of arguments in skewX transform"); } SetSkewX(values[0]); break; case "skewY": if (len != 1) { throw new ApplicationException("Wrong number of arguments in skewY transform"); } SetSkewY(values[0]); break; case "matrix": if (len != 6) { throw new ApplicationException("Wrong number of arguments in matrix transform"); } SetMatrix(new SvgMatrix(values[0], values[1], values[2], values[3], values[4], values[5])); break; default: _type = SvgTransformType.Unknown; break; } }
public void SetRotate(double angle, double cx, double cy) { _type = SvgTransformType.Rotate; _angle = angle; _matrix = new SvgMatrix().Translate(cx, cy).Rotate(angle).Translate(-cx, -cy); }
public void SetSkewY(double angle) { _type = SvgTransformType.SkewY; _angle = angle; _matrix = new SvgMatrix().SkewY(angle); }
public void SetScale(double sx, double sy) { _type = SvgTransformType.Scale; _matrix = new SvgMatrix().ScaleNonUniform(sx, sy); }
public void SetRotate(double angle) { _type = SvgTransformType.Rotate; _angle = angle; _matrix = new SvgMatrix().Rotate(angle); }
public void SetMatrix(ISvgMatrix matrix) { _type = SvgTransformType.Matrix; _matrix = matrix; }
public void SetTranslate(double tx, double ty) { _type = SvgTransformType.Translate; _matrix = new SvgMatrix().Translate(tx, ty); }
internal SvgTransform(SvgTransformType transformType, SvgMatrix matrix, float angle = 0) { Matrix = matrix ?? throw new ArgumentNullException(nameof(matrix)); TransformType = transformType; Angle = angle; }
internal SvgTransform(SvgTransformType type, SvgMatrix matrix) { this.Type = type; this.Matrix = matrix; }
internal SvgTransform(SvgTransformType type, SvgMatrix matrix, SvgAngle angle) { this.Type = type; this.Matrix = matrix; this.Angle = angle; }