internal override void Write(StringBuilder sb, SvgConverter conv)
 {
     sb.AppendFormat("matrix({0},{1},{2},{3},{4},{5}) ",
                     conv.ToSvgValue(_Values[0]), conv.ToSvgValue(_Values[1]),
                     conv.ToSvgValue(_Values[2]), conv.ToSvgValue(_Values[3]),
                     conv.ToSvgLength(_Values[4]), conv.ToSvgLength(-_Values[5]));
 }
 internal override void Write(StringBuilder sb, SvgConverter conv)
 {
     if (_Center.HasValue)
     {
         sb.AppendFormat("rotate({0},{1},{2}) ",
                         conv.ToSvgValue(-_Angle),
                         conv.ToSvgLength(_Center.Value.X),
                         conv.ToSvgLength(-_Center.Value.Y));
     }
     else
     {
         sb.AppendFormat("rotate({0}) ", conv.ToSvgValue(_Angle));
     }
 }
        //--------------------------------------------------------------------------------------------------

        public MemoryStream WriteToStream()
        {
            var conv = new SvgConverter()
            {
                DotsPerInch = DotsPerInch,
                Scale       = 25.4 / DotsPerInch
            };

            var xmlWriterSettings = new XmlWriterSettings
            {
                Encoding    = Encoding.UTF8,
                Indent      = true,
                IndentChars = "  ",
            };

            var stream = new MemoryStream();
            var writer = XmlWriter.Create(stream, xmlWriterSettings);

            writer.WriteStartDocument();
            writer.WriteDocType("svg", "-//W3C//DTD SVG 1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd", null);

            writer.WriteStartElement("svg", XmlnsSvg);

            writer.WriteAttributeString("width", $"{conv.ToSvgValue(Width)}mm"); // Use AngleToSvg to get unscaled values
            writer.WriteAttributeString("height", $"{conv.ToSvgValue(Height)}mm");
            writer.WriteAttributeString("viewBox", $"0, 0, {conv.ToSvgLength(Width)}, {conv.ToSvgLength(Height)}");
            writer.WriteAttributeString("version", "1.1");

            writer.WriteAttributeString("xmlns", "xlink", null, "http://www.w3.org/1999/xlink");
            writer.WriteAttributeString("xmlns", "xml", null, "http://www.w3.org/XML/1998/namespace");
            writer.WriteAttributeString("xmlns", "sodipodi", null, XmlnsSodipodi);
            writer.WriteAttributeString("xmlns", "inkscape", null, XmlnsInkscape);

            writer.WriteStartElement("namedview", XmlnsSodipodi);
            writer.WriteAttributeString("document-units", XmlnsInkscape, "mm");
            writer.WriteEndElement();

            base.Write(writer, conv);

            writer.WriteEndElement();
            writer.Close();
            return(stream);
        }
        internal override Pnt2d?Write(StringBuilder sb, Pnt2d?lastPnt, SvgConverter conv)
        {
            if (!(lastPnt.HasValue && conv.AreEqual(lastPnt.Value, Start)))
            {
                sb.AppendFormat("M{0},{1} ", conv.ToSvgLength(Start.X), conv.ToSvgLength(-Start.Y));
            }

            sb.AppendFormat("A{0},{1} {2} {3} {4} {5},{6} ",
                            conv.ToSvgLength(RadiusX), conv.ToSvgLength(RadiusY),
                            conv.ToSvgValue(Angle),
                            (uint)Size, (uint)Sweep,
                            conv.ToSvgLength(End.X), conv.ToSvgLength(-End.Y));
            return(End);
        }
 internal override void Write(StringBuilder sb, SvgConverter conv)
 {
     sb.AppendFormat("skewy({0}) ", conv.ToSvgValue(_Skew));
 }
 internal override void Write(StringBuilder sb, SvgConverter conv)
 {
     sb.AppendFormat("scale({0},{1}) ", conv.ToSvgValue(_Sx), conv.ToSvgValue(_Sy));
 }