private void button3_Click(object sender, System.EventArgs e) { SvgNumList a = "3, 5.6 901 -7 "; Assert.Equals(a[3], -7f); SvgTransformList b = "rotate ( 45 ), translate (11, 10)skewX(3)"; Assert.Equals(b[1].Matrix.OffsetX, 11f); SvgColor c = "rgb( 100%, 100%, 50%)"; Assert.Equals(c.Color.B, 0x7f); SvgColor d = "#abc"; Assert.Equals(d.Color.G, 0xbb); SvgPath f = "M 5,5 L 1.1 -6 , Q 1,3 9,10 z"; Assert.Equals(f.Count, 4f); Assert.Equals(f[1].Abs, true); Assert.Equals(f[2].Data[3], 10f); MessageBox.Show("Tests completed Ok"); }
private void PopTransformsMatrix(SvgTransformList transforms) { if (transforms.Count > 0) { PopMatrix(); } }
private void PushTransformsMatrix(SvgTransformList transforms) { if (transforms.Count == 0) { return; } var matrix = transforms.Aggregate(SvgMatrix.Identity, (current, transform) => current * transform.Matrix); PushMatrix(matrix); }
private void TransformAndVisitElements(SvgTransformList transforms, IEnumerable <SvgElement> elements) { PushTransformsMatrix(transforms); { foreach (var child in elements) { child.Accept(this); } } PopTransformsMatrix(transforms); }
protected void SetTransform(GdiGraphics gr) { if (_svgElement is ISvgTransformable) { if (_transformMatrix == null) { ISvgTransformable transElm = (ISvgTransformable)_svgElement; SvgTransformList svgTList = (SvgTransformList)transElm.Transform.AnimVal; SvgMatrix svgMatrix = ((SvgTransformList)transElm.Transform.AnimVal).TotalMatrix; _transformMatrix = new Matrix((float)svgMatrix.A, (float)svgMatrix.B, (float)svgMatrix.C, (float)svgMatrix.D, (float)svgMatrix.E, (float)svgMatrix.F); } gr.Transform = _transformMatrix; } }
public static Matrix GetTransformMatrix(SvgElement element) { ISvgTransformable transElm = element as ISvgTransformable; if (transElm == null) { return(Matrix.Identity); } SvgTransformList svgTList = (SvgTransformList)transElm.Transform.AnimVal; SvgTransform svgTransform = (SvgTransform)svgTList.Consolidate(); SvgMatrix svgMatrix = ((SvgTransformList)transElm.Transform.AnimVal).TotalMatrix; return(new Matrix(svgMatrix.A, svgMatrix.B, svgMatrix.C, svgMatrix.D, svgMatrix.E, svgMatrix.F)); }
/// <summary> /// Given a document and a current node, read this element from the node. /// </summary> /// <param name="doc"></param> /// <param name="el"></param> public override void ReadXmlElement(XmlDocument doc, XmlElement el) { foreach (XmlAttribute att in el.Attributes) { if (att.Name == "style") { Style = new SvgStyle(att.Value); } else if (att.Name == "transform") { Transform = new SvgTransformList(att.Value); } else { this[att.Name] = att.Value; } } }
public override void ReadXmlElement(XmlDocument doc, XmlElement el) { foreach (XmlAttribute xmlAttribute in el.Attributes) { if (xmlAttribute.Name == "style") { this.Style = new SvgStyle(xmlAttribute.Value); } else if (xmlAttribute.Name == "transform") { this.Transform = new SvgTransformList(xmlAttribute.Value); } else { base[xmlAttribute.Name] = xmlAttribute.Value; } } }
private PageElement TransformAndVisitElements(SvgTransformList transforms, IEnumerable <SvgElement> elements) { var result = new Group(); PushTransformsMatrix(transforms); { foreach (var child in elements) { var transformed = child.Accept(this); if (transformed != null) { result.Add(transformed); } } } PopTransformsMatrix(transforms); return(result); }
protected void Transform(GraphicsWrapper gr) { if (element is ISvgTransformable) { if (TransformMatrix == null) { ISvgTransformable transElm = (ISvgTransformable)element; SvgTransformList svgTList = (SvgTransformList)transElm.Transform.AnimVal; //SvgTransform svgTransform = (SvgTransform)svgTList.Consolidate(); SvgMatrix svgMatrix = ((SvgTransformList)transElm.Transform.AnimVal).TotalMatrix; TransformMatrix = new Matrix( (float)svgMatrix.A, (float)svgMatrix.B, (float)svgMatrix.C, (float)svgMatrix.D, (float)svgMatrix.E, (float)svgMatrix.F); } gr.Transform = TransformMatrix; } }
public static Matrix GetTransformMatrix(SvgElement element, TransformGroup transform) { ISvgTransformable transElm = element as ISvgTransformable; if (transElm == null) { return(Matrix.Identity); } SvgTransformList svgTList = (SvgTransformList)transElm.Transform.AnimVal; SvgTransform svgTransform = (SvgTransform)svgTList.Consolidate(); SvgMatrix svgMatrix = ((SvgTransformList)transElm.Transform.AnimVal).TotalMatrix; var matrix = new Matrix(svgMatrix.A, svgMatrix.B, svgMatrix.C, svgMatrix.D, svgMatrix.E, svgMatrix.F); if (!matrix.IsIdentity) { transform.Children.Add(new MatrixTransform(matrix)); } return(matrix); }
protected void SetTransform(WpfDrawingContext context) { _transformMatrix = null; ISvgTransformable transElm = _svgElement as ISvgTransformable; if (transElm != null) { SvgTransformList transformList = (SvgTransformList)transElm.Transform.AnimVal; if (transformList.NumberOfItems > 1 && _combineTransforms == false) { TransformGroup transformGroup = new TransformGroup(); List <Transform> transforms = new List <Transform>(); for (uint i = 0; i < transformList.NumberOfItems; i++) { ISvgTransform transform = transformList.GetItem(i); double[] values = transform.InputValues; switch (transform.TransformType) { case SvgTransformType.Translate: if (values.Length == 1) { // SetTranslate(values[0], 0); //transformGroup.Children.Add(new TranslateTransform(values[0], 0)); transforms.Add(new TranslateTransform(values[0], 0)); } else if (values.Length == 2) { // SetTranslate(values[0], values[1]); //transformGroup.Children.Add(new TranslateTransform(values[0], values[1])); transforms.Add(new TranslateTransform(values[0], values[1])); } break; case SvgTransformType.Rotate: if (values.Length == 1) { // SetRotate(values[0]); //transformGroup.Children.Add(new RotateTransform(values[0])); transforms.Add(new RotateTransform(values[0])); } else if (values.Length == 3) { // SetRotate(values[0], values[1], values[2]); //transformGroup.Children.Add(new RotateTransform(values[0], values[1], values[2])); transforms.Add(new RotateTransform(values[0], values[1], values[2])); } break; case SvgTransformType.Scale: if (values.Length == 1) { //SetScale(values[0], values[0]); transformGroup.Children.Add(new ScaleTransform(values[0], values[0])); } else if (values.Length == 2) { //SetScale(values[0], values[1]); //transformGroup.Children.Add(new ScaleTransform(values[0], values[1])); transforms.Add(new ScaleTransform(values[0], values[1])); } break; case SvgTransformType.SkewX: if (values.Length == 1) { //SetSkewX(values[0]); //transformGroup.Children.Add(new SkewTransform(values[0], 0)); transforms.Add(new SkewTransform(values[0], 0)); } break; case SvgTransformType.SkewY: if (values.Length == 1) { //SetSkewY(values[0]); //transformGroup.Children.Add(new SkewTransform(0, values[0])); transforms.Add(new SkewTransform(0, values[0])); } break; case SvgTransformType.Matrix: if (values.Length == 6) { //SetMatrix(new SvgMatrix(values[0], values[1], values[2], values[3], values[4], values[5])); //transformGroup.Children.Add(new MatrixTransform(values[0], values[1], values[2], values[3], values[4], values[5])); transforms.Add(new MatrixTransform(values[0], values[1], values[2], values[3], values[4], values[5])); } break; } } transforms.Reverse(); transformGroup.Children = new TransformCollection(transforms); _transformMatrix = transformGroup; //_transformMatrix = new MatrixTransform(transformGroup.Value); return; } SvgMatrix svgMatrix = transformList.TotalMatrix; if (svgMatrix.IsIdentity) { return; } _transformMatrix = new MatrixTransform(Math.Round(svgMatrix.A, 4), Math.Round(svgMatrix.B, 4), Math.Round(svgMatrix.C, 4), Math.Round(svgMatrix.D, 4), Math.Round(svgMatrix.E, 4), Math.Round(svgMatrix.F, 4)); } }
private void RenderTextPath(SvgTextPathElement textPath, ref Point ctp, double rotate, WpfTextPlacement placement) { if (textPath.ChildNodes == null || textPath.ChildNodes.Count == 0) { return; } SvgElement targetPath = textPath.ReferencedElement as SvgElement; if (targetPath == null) { return; } Geometry textGeometry = CreateGeometry(targetPath, true); if (textGeometry == null) { return; } PathGeometry pathGeometry = textGeometry as PathGeometry; if (pathGeometry == null) { pathGeometry = textGeometry.GetFlattenedPathGeometry(); } // If the path has a transform, apply it to get a transformed path... if (targetPath.HasAttribute("transform")) { var svgTransform = new SvgTransformList(targetPath.GetAttribute("transform")); var svgMatrix = svgTransform.TotalMatrix; if (!svgMatrix.IsIdentity) { pathGeometry.Transform = new MatrixTransform(svgMatrix.A, svgMatrix.B, svgMatrix.C, svgMatrix.D, svgMatrix.E, svgMatrix.F); var transformPath = new PathGeometry(); transformPath.AddGeometry(pathGeometry); pathGeometry = transformPath; } } WpfPathTextBuilder pathBuilder = new WpfPathTextBuilder(_textElement); pathBuilder.BeginTextPath(textPath); var comparer = StringComparison.OrdinalIgnoreCase; XmlNodeType nodeType = XmlNodeType.None; int nodeCount = textPath.ChildNodes.Count; for (int i = 0; i < nodeCount; i++) { XmlNode child = textPath.ChildNodes[i]; nodeType = child.NodeType; if (nodeType == XmlNodeType.Text) { var nodeText = GetText(textPath, child); if (i == (nodeCount - 1)) { // No need to render the last white space... if (nodeCount == 1) { if (nodeText.StartsWith(NonBreaking, StringComparison.OrdinalIgnoreCase)) { if (!nodeText.EndsWith(NonBreaking, StringComparison.OrdinalIgnoreCase)) { nodeText = nodeText.TrimEnd(); } } else if (nodeText.EndsWith(NonBreaking, StringComparison.OrdinalIgnoreCase)) { nodeText = nodeText.TrimStart(); } else { nodeText = nodeText.Trim(); } } else { if (!nodeText.EndsWith(NonBreaking, StringComparison.OrdinalIgnoreCase)) { nodeText = nodeText.TrimEnd(); } } } else if (i == 0) { nodeText = nodeText.Trim(); } RenderTextPath(textPath, pathBuilder, nodeText, new Point(ctp.X, ctp.Y), rotate, placement); } else if (nodeType == XmlNodeType.Element) { string nodeName = child.Name; if (string.Equals(nodeName, "tref", comparer)) { RenderTRefPath((SvgTRefElement)child, pathBuilder, ref ctp); } else if (string.Equals(nodeName, "tspan", comparer)) { RenderTSpanPath((SvgTSpanElement)child, pathBuilder, ref ctp); } } } WpfTextStringFormat stringFormat = GetTextStringFormat(textPath); //ISvgAnimatedLength pathOffset = textPath.StartOffset; //SvgTextPathMethod pathMethod = (SvgTextPathMethod)textPath.Method.BaseVal; //SvgTextPathSpacing pathSpacing = (SvgTextPathSpacing)textPath.Spacing.BaseVal; pathBuilder.RenderTextPath(_drawContext, pathGeometry, stringFormat.Alignment); pathBuilder.EndTextPath(); }
public SvgTransformListEnumerator(SvgTransformList list) : base(list) { }