SvgFragment.cs 3.37 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
20
21
22
23
24
25
26
    public class SvgFragment : SvgElement, ISvgViewPort
    {
        private SvgUnit _width;
        private SvgUnit _height;
        private SvgViewBox _viewBox;

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

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

        /// <summary>
38
        /// Gets or sets the height of the fragment.
davescriven's avatar
davescriven committed
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
        /// </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; }
        }

        /// <summary>
60
        /// Applies the required transforms to <see cref="SvgRenderer"/>.
davescriven's avatar
davescriven committed
61
        /// </summary>
62
63
        /// <param name="renderer">The <see cref="SvgRenderer"/> to be transformed.</param>
        protected internal override void PushTransforms(SvgRenderer renderer)
davescriven's avatar
davescriven committed
64
        {
65
            base.PushTransforms(renderer);
davescriven's avatar
davescriven committed
66
67
68

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

71
                renderer.ScaleTransform(this.Width.ToDeviceValue() / this.ViewBox.Width, this.Height.ToDeviceValue() / this.ViewBox.Height, MatrixOrder.Append);
davescriven's avatar
davescriven committed
72
73
            }
        }
Tebjan Halm's avatar
Tebjan Halm committed
74
75
76
77
78
79
80
81
82
83
84
85
86
        
        /// <summary>
        /// Gets the <see cref="GraphicsPath"/> for this element.
        /// </summary>
        /// <value></value>
        public GraphicsPath Path
        {
            get 
            { 
            	var path = new GraphicsPath();

            	AddPaths(this, path);
  
87
            	return path;
Tebjan Halm's avatar
Tebjan Halm committed
88
89
            }
        }
90
91
92
93
94
95
96
97
98
99
100
101
102
        
        /// <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
103
104
105
106
107
108
109

        /// <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
110
            this._width = new SvgUnit(SvgUnitType.Percentage, 100.0f);
davescriven's avatar
davescriven committed
111
112
113
114
            this.ViewBox = SvgViewBox.Empty;
        }
    }
}