Reviewed by Oliver & parts by Eric.
[WebKit-https.git] / WebCore / svg / SVGTransform.cpp
1 /*
2     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
3                   2004, 2005 Rob Buis <buis@kde.org>
4
5     This file is part of the KDE project
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20     Boston, MA 02110-1301, USA.
21 */
22
23 #include "config.h"
24 #if ENABLE(SVG)
25
26 #include "FloatPoint.h"
27 #include "FloatSize.h"
28 #include "SVGAngle.h"
29 #include "SVGSVGElement.h"
30 #include "SVGTransform.h"
31
32 #include <math.h>
33
34 using namespace WebCore;
35
36 SVGTransform::SVGTransform()
37     : m_type(SVG_TRANSFORM_UNKNOWN)
38     , m_angle(0)
39 {
40 }
41
42 SVGTransform::SVGTransform(SVGTransformType type)
43     : m_type(type)
44     , m_angle(0)
45     , m_center(FloatPoint())
46     , m_matrix(AffineTransform())
47 {
48 }
49
50 SVGTransform::SVGTransform(const AffineTransform& matrix)
51     : m_type(SVG_TRANSFORM_MATRIX)
52     , m_angle(0)
53     , m_matrix(matrix)
54 {
55 }
56
57 SVGTransform::~SVGTransform()
58 {
59 }
60
61 bool SVGTransform::isValid()
62 {
63     return (m_type != SVG_TRANSFORM_UNKNOWN);
64 }
65
66 SVGTransform::SVGTransformType SVGTransform::type() const
67 {
68     return m_type;
69 }
70
71 AffineTransform SVGTransform::matrix() const
72 {
73     return m_matrix;
74 }
75
76 float SVGTransform::angle() const
77 {
78     return m_angle;
79 }
80
81 FloatPoint SVGTransform::rotationCenter() const
82 {
83     return m_center;
84 }
85
86 void SVGTransform::setMatrix(AffineTransform matrix) //const AffineTransform& matrix)
87 {
88     m_type = SVG_TRANSFORM_MATRIX;
89     m_angle = 0;
90
91     m_matrix = matrix;
92 }
93
94 void SVGTransform::setTranslate(float tx, float ty)
95 {
96     m_type = SVG_TRANSFORM_TRANSLATE;
97     m_angle = 0;
98
99     m_matrix.reset();
100     m_matrix.translate(tx, ty);
101 }
102
103 FloatPoint SVGTransform::translate() const
104 {
105     return FloatPoint::narrowPrecision(m_matrix.e(), m_matrix.f());
106 }
107
108 void SVGTransform::setScale(float sx, float sy)
109 {
110     m_type = SVG_TRANSFORM_SCALE;
111     m_angle = 0;
112     m_center = FloatPoint();
113
114     m_matrix.reset();
115     m_matrix.scale(sx, sy);
116 }
117
118 FloatSize SVGTransform::scale() const
119 {
120     return FloatSize::narrowPrecision(m_matrix.a(), m_matrix.d());
121 }
122
123 void SVGTransform::setRotate(float angle, float cx, float cy)
124 {
125     m_type = SVG_TRANSFORM_ROTATE;
126     m_angle = angle;
127     m_center = FloatPoint(cx, cy);
128
129     // TODO: toString() implementation, which can show cx, cy (need to be stored?)
130     m_matrix.reset();
131     m_matrix.translate(cx, cy);
132     m_matrix.rotate(angle);
133     m_matrix.translate(-cx, -cy);
134 }
135
136 void SVGTransform::setSkewX(float angle)
137 {
138     m_type = SVG_TRANSFORM_SKEWX;
139     m_angle = angle;
140
141     m_matrix.reset();
142     m_matrix.skewX(angle);
143 }
144
145 void SVGTransform::setSkewY(float angle)
146 {
147     m_type = SVG_TRANSFORM_SKEWY;
148     m_angle = angle;
149
150     m_matrix.reset();
151     m_matrix.skewY(angle);
152 }
153
154 // vim:ts=4:noet
155 #endif // ENABLE(SVG)
156