SvgFragment.cs 3.82 KB
Newer Older
davescriven's avatar
davescriven committed
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Drawing.Drawing2D;
using System.Drawing;
using System.ComponentModel;

namespace Svg
{
    /// <summary>
    /// An <see cref="SvgFragment"/> represents an SVG fragment that can be the root element or an embedded fragment of an SVG document.
    /// </summary>
14
    [SvgElement("svg")]
davescriven's avatar
davescriven committed
15
16
17
18
19
    public class SvgFragment : SvgElement, ISvgViewPort
    {
        private SvgUnit _width;
        private SvgUnit _height;
        private SvgViewBox _viewBox;
20
        private SvgAspectRatio _aspect;
davescriven's avatar
davescriven committed
21
22
23
24
25
26
27

        /// <summary>
        /// Gets the SVG namespace string.
        /// </summary>
        public static readonly Uri Namespace = new Uri("http://www.w3.org/2000/svg");

        /// <summary>
28
        /// Gets or sets the width of the fragment.
davescriven's avatar
davescriven committed
29
30
31
32
33
34
35
36
37
38
        /// </summary>
        /// <value>The width.</value>
        [SvgAttribute("width")]
        public SvgUnit Width
        {
            get { return this._width; }
            set { this._width = value; }
        }

        /// <summary>
39
        /// Gets or sets the height of the fragment.
davescriven's avatar
davescriven committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
        /// </summary>
        /// <value>The height.</value>
        [SvgAttribute("height")]
        public SvgUnit Height
        {
            get { return this._height; }
            set { this._height = value; }
        }

        /// <summary>
        /// Gets or sets the viewport of the element.
        /// </summary>
        /// <value></value>
        [SvgAttribute("viewBox")]
        public SvgViewBox ViewBox
        {
            get { return this._viewBox; }
            set { this._viewBox = value; }
        }
59
60
61
62
63
64
65
66
67
68
69
        
        /// <summary>
        /// Gets or sets the aspect of the viewport.
        /// </summary>
        /// <value></value>
        [SvgAttribute("preserveAspectRatio")]
        public SvgAspectRatio AspectRatio
        {
            get { return this._aspect; }
            set { this._aspect = value; }
        }
davescriven's avatar
davescriven committed
70
71

        /// <summary>
72
        /// Applies the required transforms to <see cref="SvgRenderer"/>.
davescriven's avatar
davescriven committed
73
        /// </summary>
74
75
        /// <param name="renderer">The <see cref="SvgRenderer"/> to be transformed.</param>
        protected internal override void PushTransforms(SvgRenderer renderer)
davescriven's avatar
davescriven committed
76
        {
77
            base.PushTransforms(renderer);
davescriven's avatar
davescriven committed
78
79
80

            if (!this.ViewBox.Equals(SvgViewBox.Empty))
            {
Tebjan Halm's avatar
Tebjan Halm committed
81
                renderer.TranslateTransform(-this.ViewBox.MinX, -this.ViewBox.MinY, MatrixOrder.Append);
davescriven's avatar
davescriven committed
82

83
                renderer.ScaleTransform(this.Width.ToDeviceValue() / this.ViewBox.Width, this.Height.ToDeviceValue() / this.ViewBox.Height, MatrixOrder.Append);
davescriven's avatar
davescriven committed
84
85
            }
        }
Tebjan Halm's avatar
Tebjan Halm committed
86
87
88
89
90
91
92
93
94
95
96
97
98
        
        /// <summary>
        /// Gets the <see cref="GraphicsPath"/> for this element.
        /// </summary>
        /// <value></value>
        public GraphicsPath Path
        {
            get 
            { 
            	var path = new GraphicsPath();

            	AddPaths(this, path);
  
99
            	return path;
Tebjan Halm's avatar
Tebjan Halm committed
100
101
            }
        }
102
103
104
105
106
107
108
109
110
111
112
113
114
        
        /// <summary>
        /// Gets the bounds of the svg element.
        /// </summary>
        /// <value>The bounds.</value>
        public RectangleF Bounds 
        { 
        	get
        	{
        		return this.Path.GetBounds();
        	}
        		
        }
davescriven's avatar
davescriven committed
115
116
117
118
119
120
121

        /// <summary>
        /// Initializes a new instance of the <see cref="SvgFragment"/> class.
        /// </summary>
        public SvgFragment()
        {
            this._height = new SvgUnit(SvgUnitType.Percentage, 100.0f);
Tebjan Halm's avatar
Tebjan Halm committed
122
            this._width = new SvgUnit(SvgUnitType.Percentage, 100.0f);
davescriven's avatar
davescriven committed
123
            this.ViewBox = SvgViewBox.Empty;
124
            this.AspectRatio = new SvgAspectRatio(SvgPreserveAspectRatio.None);
davescriven's avatar
davescriven committed
125
126
127
        }
    }
}