OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 11 matching lines...) Expand all Loading... |
22 #include "core/svg/SVGTransform.h" | 22 #include "core/svg/SVGTransform.h" |
23 | 23 |
24 #include "platform/FloatConversion.h" | 24 #include "platform/FloatConversion.h" |
25 #include "platform/geometry/FloatSize.h" | 25 #include "platform/geometry/FloatSize.h" |
26 #include "wtf/MathExtras.h" | 26 #include "wtf/MathExtras.h" |
27 #include "wtf/text/StringBuilder.h" | 27 #include "wtf/text/StringBuilder.h" |
28 | 28 |
29 namespace WebCore { | 29 namespace WebCore { |
30 | 30 |
31 SVGTransform::SVGTransform() | 31 SVGTransform::SVGTransform() |
32 : m_type(SVG_TRANSFORM_UNKNOWN) | 32 : NewSVGPropertyBase(classType()) |
| 33 , m_transformType(SVG_TRANSFORM_UNKNOWN) |
33 , m_angle(0) | 34 , m_angle(0) |
34 { | 35 { |
35 } | 36 } |
36 | 37 |
37 SVGTransform::SVGTransform(SVGTransformType type, ConstructionMode mode) | 38 SVGTransform::SVGTransform(SVGTransformType transformType, ConstructionMode mode
) |
38 : m_type(type) | 39 : NewSVGPropertyBase(classType()) |
| 40 , m_transformType(transformType) |
39 , m_angle(0) | 41 , m_angle(0) |
40 { | 42 { |
41 if (mode == ConstructZeroTransform) | 43 if (mode == ConstructZeroTransform) |
42 m_matrix = AffineTransform(0, 0, 0, 0, 0, 0); | 44 m_matrix = AffineTransform(0, 0, 0, 0, 0, 0); |
43 } | 45 } |
44 | 46 |
45 SVGTransform::SVGTransform(const AffineTransform& matrix) | 47 SVGTransform::SVGTransform(const AffineTransform& matrix) |
46 : m_type(SVG_TRANSFORM_MATRIX) | 48 : NewSVGPropertyBase(classType()) |
| 49 , m_transformType(SVG_TRANSFORM_MATRIX) |
47 , m_angle(0) | 50 , m_angle(0) |
48 , m_matrix(matrix) | 51 , m_matrix(matrix) |
49 { | 52 { |
50 } | 53 } |
51 | 54 |
| 55 SVGTransform::SVGTransform(SVGTransformType transformType, float angle, const Fl
oatPoint& center, const AffineTransform& matrix) |
| 56 : NewSVGPropertyBase(classType()) |
| 57 , m_transformType(transformType) |
| 58 , m_angle(angle) |
| 59 , m_center(center) |
| 60 , m_matrix(matrix) |
| 61 { |
| 62 } |
| 63 |
| 64 SVGTransform::~SVGTransform() |
| 65 { |
| 66 } |
| 67 |
| 68 PassRefPtr<SVGTransform> SVGTransform::clone() const |
| 69 { |
| 70 return adoptRef(new SVGTransform(m_transformType, m_angle, m_center, m_matri
x)); |
| 71 } |
| 72 |
| 73 PassRefPtr<NewSVGPropertyBase> SVGTransform::cloneForAnimation(const String&) co
nst |
| 74 { |
| 75 // SVGTransform is never animated. |
| 76 ASSERT_NOT_REACHED(); |
| 77 } |
| 78 |
52 void SVGTransform::setMatrix(const AffineTransform& matrix) | 79 void SVGTransform::setMatrix(const AffineTransform& matrix) |
53 { | 80 { |
54 m_type = SVG_TRANSFORM_MATRIX; | 81 onMatrixChange(); |
55 m_angle = 0; | |
56 m_matrix = matrix; | 82 m_matrix = matrix; |
57 } | 83 } |
58 | 84 |
59 void SVGTransform::updateSVGMatrix() | 85 void SVGTransform::onMatrixChange() |
60 { | 86 { |
61 // The underlying matrix has been changed, alter the transformation type. | 87 m_transformType = SVG_TRANSFORM_MATRIX; |
62 // Spec: In case the matrix object is changed directly (i.e., without using
the methods on the SVGTransform interface itself) | |
63 // then the type of the SVGTransform changes to SVG_TRANSFORM_MATRIX. | |
64 m_type = SVG_TRANSFORM_MATRIX; | |
65 m_angle = 0; | 88 m_angle = 0; |
66 } | 89 } |
67 | 90 |
68 void SVGTransform::setTranslate(float tx, float ty) | 91 void SVGTransform::setTranslate(float tx, float ty) |
69 { | 92 { |
70 m_type = SVG_TRANSFORM_TRANSLATE; | 93 m_transformType = SVG_TRANSFORM_TRANSLATE; |
71 m_angle = 0; | 94 m_angle = 0; |
72 | 95 |
73 m_matrix.makeIdentity(); | 96 m_matrix.makeIdentity(); |
74 m_matrix.translate(tx, ty); | 97 m_matrix.translate(tx, ty); |
75 } | 98 } |
76 | 99 |
77 FloatPoint SVGTransform::translate() const | 100 FloatPoint SVGTransform::translate() const |
78 { | 101 { |
79 return FloatPoint::narrowPrecision(m_matrix.e(), m_matrix.f()); | 102 return FloatPoint::narrowPrecision(m_matrix.e(), m_matrix.f()); |
80 } | 103 } |
81 | 104 |
82 void SVGTransform::setScale(float sx, float sy) | 105 void SVGTransform::setScale(float sx, float sy) |
83 { | 106 { |
84 m_type = SVG_TRANSFORM_SCALE; | 107 m_transformType = SVG_TRANSFORM_SCALE; |
85 m_angle = 0; | 108 m_angle = 0; |
86 m_center = FloatPoint(); | 109 m_center = FloatPoint(); |
87 | 110 |
88 m_matrix.makeIdentity(); | 111 m_matrix.makeIdentity(); |
89 m_matrix.scaleNonUniform(sx, sy); | 112 m_matrix.scaleNonUniform(sx, sy); |
90 } | 113 } |
91 | 114 |
92 FloatSize SVGTransform::scale() const | 115 FloatSize SVGTransform::scale() const |
93 { | 116 { |
94 return FloatSize::narrowPrecision(m_matrix.a(), m_matrix.d()); | 117 return FloatSize::narrowPrecision(m_matrix.a(), m_matrix.d()); |
95 } | 118 } |
96 | 119 |
97 void SVGTransform::setRotate(float angle, float cx, float cy) | 120 void SVGTransform::setRotate(float angle, float cx, float cy) |
98 { | 121 { |
99 m_type = SVG_TRANSFORM_ROTATE; | 122 m_transformType = SVG_TRANSFORM_ROTATE; |
100 m_angle = angle; | 123 m_angle = angle; |
101 m_center = FloatPoint(cx, cy); | 124 m_center = FloatPoint(cx, cy); |
102 | 125 |
103 // TODO: toString() implementation, which can show cx, cy (need to be stored
?) | 126 // TODO: toString() implementation, which can show cx, cy (need to be stored
?) |
104 m_matrix.makeIdentity(); | 127 m_matrix.makeIdentity(); |
105 m_matrix.translate(cx, cy); | 128 m_matrix.translate(cx, cy); |
106 m_matrix.rotate(angle); | 129 m_matrix.rotate(angle); |
107 m_matrix.translate(-cx, -cy); | 130 m_matrix.translate(-cx, -cy); |
108 } | 131 } |
109 | 132 |
110 void SVGTransform::setSkewX(float angle) | 133 void SVGTransform::setSkewX(float angle) |
111 { | 134 { |
112 m_type = SVG_TRANSFORM_SKEWX; | 135 m_transformType = SVG_TRANSFORM_SKEWX; |
113 m_angle = angle; | 136 m_angle = angle; |
114 | 137 |
115 m_matrix.makeIdentity(); | 138 m_matrix.makeIdentity(); |
116 m_matrix.skewX(angle); | 139 m_matrix.skewX(angle); |
117 } | 140 } |
118 | 141 |
119 void SVGTransform::setSkewY(float angle) | 142 void SVGTransform::setSkewY(float angle) |
120 { | 143 { |
121 m_type = SVG_TRANSFORM_SKEWY; | 144 m_transformType = SVG_TRANSFORM_SKEWY; |
122 m_angle = angle; | 145 m_angle = angle; |
123 | 146 |
124 m_matrix.makeIdentity(); | 147 m_matrix.makeIdentity(); |
125 m_matrix.skewY(angle); | 148 m_matrix.skewY(angle); |
126 } | 149 } |
127 | 150 |
128 const String& SVGTransform::transformTypePrefixForParsing(SVGTransformType type) | 151 namespace { |
| 152 |
| 153 const String& transformTypePrefixForParsing(SVGTransformType type) |
129 { | 154 { |
130 switch (type) { | 155 switch (type) { |
131 case SVG_TRANSFORM_UNKNOWN: | 156 case SVG_TRANSFORM_UNKNOWN: |
132 return emptyString(); | 157 return emptyString(); |
133 case SVG_TRANSFORM_MATRIX: { | 158 case SVG_TRANSFORM_MATRIX: { |
134 DEFINE_STATIC_LOCAL(String, matrixString, ("matrix(")); | 159 DEFINE_STATIC_LOCAL(String, matrixString, ("matrix(")); |
135 return matrixString; | 160 return matrixString; |
136 } | 161 } |
137 case SVG_TRANSFORM_TRANSLATE: { | 162 case SVG_TRANSFORM_TRANSLATE: { |
138 DEFINE_STATIC_LOCAL(String, translateString, ("translate(")); | 163 DEFINE_STATIC_LOCAL(String, translateString, ("translate(")); |
(...skipping 14 matching lines...) Expand all Loading... |
153 case SVG_TRANSFORM_SKEWY: { | 178 case SVG_TRANSFORM_SKEWY: { |
154 DEFINE_STATIC_LOCAL(String, skewYString, ("skewY(")); | 179 DEFINE_STATIC_LOCAL(String, skewYString, ("skewY(")); |
155 return skewYString; | 180 return skewYString; |
156 } | 181 } |
157 } | 182 } |
158 | 183 |
159 ASSERT_NOT_REACHED(); | 184 ASSERT_NOT_REACHED(); |
160 return emptyString(); | 185 return emptyString(); |
161 } | 186 } |
162 | 187 |
| 188 } |
| 189 |
163 String SVGTransform::valueAsString() const | 190 String SVGTransform::valueAsString() const |
164 { | 191 { |
165 const String& prefix = transformTypePrefixForParsing(m_type); | 192 const String& prefix = transformTypePrefixForParsing(m_transformType); |
166 switch (m_type) { | 193 switch (m_transformType) { |
167 case SVG_TRANSFORM_UNKNOWN: | 194 case SVG_TRANSFORM_UNKNOWN: |
168 return prefix; | 195 return prefix; |
169 case SVG_TRANSFORM_MATRIX: { | 196 case SVG_TRANSFORM_MATRIX: { |
170 StringBuilder builder; | 197 StringBuilder builder; |
171 builder.append(prefix + String::number(m_matrix.a()) + ' ' + String::num
ber(m_matrix.b()) + ' ' + String::number(m_matrix.c()) + ' ' + | 198 builder.append(prefix + String::number(m_matrix.a()) + ' ' + String::num
ber(m_matrix.b()) + ' ' + String::number(m_matrix.c()) + ' ' + |
172 String::number(m_matrix.d()) + ' ' + String::number(m_mat
rix.e()) + ' ' + String::number(m_matrix.f()) + ')'); | 199 String::number(m_matrix.d()) + ' ' + String::number(m_mat
rix.e()) + ' ' + String::number(m_matrix.f()) + ')'); |
173 return builder.toString(); | 200 return builder.toString(); |
174 } | 201 } |
175 case SVG_TRANSFORM_TRANSLATE: | 202 case SVG_TRANSFORM_TRANSLATE: |
176 return prefix + String::number(m_matrix.e()) + ' ' + String::number(m_ma
trix.f()) + ')'; | 203 return prefix + String::number(m_matrix.e()) + ' ' + String::number(m_ma
trix.f()) + ')'; |
(...skipping 12 matching lines...) Expand all Loading... |
189 case SVG_TRANSFORM_SKEWX: | 216 case SVG_TRANSFORM_SKEWX: |
190 return prefix + String::number(m_angle) + ')'; | 217 return prefix + String::number(m_angle) + ')'; |
191 case SVG_TRANSFORM_SKEWY: | 218 case SVG_TRANSFORM_SKEWY: |
192 return prefix + String::number(m_angle) + ')'; | 219 return prefix + String::number(m_angle) + ')'; |
193 } | 220 } |
194 | 221 |
195 ASSERT_NOT_REACHED(); | 222 ASSERT_NOT_REACHED(); |
196 return emptyString(); | 223 return emptyString(); |
197 } | 224 } |
198 | 225 |
| 226 void SVGTransform::add(PassRefPtr<NewSVGPropertyBase>, SVGElement*) |
| 227 { |
| 228 // SVGTransform is not animated by itself. |
| 229 ASSERT_NOT_REACHED(); |
| 230 } |
| 231 |
| 232 void SVGTransform::calculateAnimatedValue(SVGAnimationElement*, float, unsigned,
PassRefPtr<NewSVGPropertyBase>, PassRefPtr<NewSVGPropertyBase>, PassRefPtr<NewS
VGPropertyBase>, SVGElement*) |
| 233 { |
| 234 // SVGTransform is not animated by itself. |
| 235 ASSERT_NOT_REACHED(); |
| 236 } |
| 237 |
| 238 float SVGTransform::calculateDistance(PassRefPtr<NewSVGPropertyBase>, SVGElement
*) |
| 239 { |
| 240 // SVGTransform is not animated by itself. |
| 241 ASSERT_NOT_REACHED(); |
| 242 |
| 243 return -1; |
| 244 } |
| 245 |
199 } // namespace WebCore | 246 } // namespace WebCore |
OLD | NEW |