OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // MSVC++ requires this to be set before any other includes to get M_PI. | 5 // MSVC++ requires this to be set before any other includes to get M_PI. |
6 #define _USE_MATH_DEFINES | 6 #define _USE_MATH_DEFINES |
7 | 7 |
8 #include "ui/gfx/transform.h" | 8 #include "ui/gfx/transform.h" |
9 | 9 |
10 #include <cmath> | 10 #include <cmath> |
(...skipping 27 matching lines...) Expand all Loading... |
38 Transform::~Transform() {} | 38 Transform::~Transform() {} |
39 | 39 |
40 bool Transform::operator==(const Transform& rhs) const { | 40 bool Transform::operator==(const Transform& rhs) const { |
41 return matrix_ == rhs.matrix_; | 41 return matrix_ == rhs.matrix_; |
42 } | 42 } |
43 | 43 |
44 bool Transform::operator!=(const Transform& rhs) const { | 44 bool Transform::operator!=(const Transform& rhs) const { |
45 return !(*this == rhs); | 45 return !(*this == rhs); |
46 } | 46 } |
47 | 47 |
48 void Transform::SetRotate(double degree) { | 48 void Transform::MakeIdentity() { |
49 matrix_.setRotateDegreesAbout(SkDoubleToMScalar(0), | 49 matrix_.setIdentity(); |
50 SkDoubleToMScalar(0), | |
51 SkDoubleToMScalar(1), | |
52 SkDoubleToMScalar(degree)); | |
53 } | 50 } |
54 | 51 |
55 void Transform::SetRotateAbout(const Point3F& axis, double degree) { | 52 void Transform::Rotate(double degree) { |
56 matrix_.setRotateDegreesAbout(SkDoubleToMScalar(axis.x()), | 53 if (matrix_.isIdentity()) { |
57 SkDoubleToMScalar(axis.y()), | 54 matrix_.setRotateDegreesAbout(SkDoubleToMScalar(0), |
58 SkDoubleToMScalar(axis.z()), | 55 SkDoubleToMScalar(0), |
59 SkDoubleToMScalar(degree)); | 56 SkDoubleToMScalar(1), |
| 57 SkDoubleToMScalar(degree)); |
| 58 } else { |
| 59 SkMatrix44 rot; |
| 60 rot.setRotateDegreesAbout(SkDoubleToMScalar(0), |
| 61 SkDoubleToMScalar(0), |
| 62 SkDoubleToMScalar(1), |
| 63 SkDoubleToMScalar(degree)); |
| 64 matrix_.preConcat(rot); |
| 65 } |
60 } | 66 } |
61 | 67 |
62 void Transform::SetScaleX(double x) { | 68 void Transform::RotateAbout(const Vector3dF& axis, double degree) { |
63 matrix_.setDouble(0, 0, x); | 69 if (matrix_.isIdentity()) { |
| 70 matrix_.setRotateDegreesAbout(SkDoubleToMScalar(axis.x()), |
| 71 SkDoubleToMScalar(axis.y()), |
| 72 SkDoubleToMScalar(axis.z()), |
| 73 SkDoubleToMScalar(degree)); |
| 74 } else { |
| 75 SkMatrix44 rot; |
| 76 rot.setRotateDegreesAbout(SkDoubleToMScalar(axis.x()), |
| 77 SkDoubleToMScalar(axis.y()), |
| 78 SkDoubleToMScalar(axis.z()), |
| 79 SkDoubleToMScalar(degree)); |
| 80 matrix_.preConcat(rot); |
| 81 } |
64 } | 82 } |
65 | 83 |
66 void Transform::SetScaleY(double y) { | 84 void Transform::Scale(double x, double y) { |
67 matrix_.setDouble(1, 1, y); | 85 if (matrix_.isIdentity()) { |
| 86 matrix_.setScale(SkDoubleToMScalar(x), |
| 87 SkDoubleToMScalar(y), |
| 88 SkDoubleToMScalar(1)); |
| 89 } else { |
| 90 SkMatrix44 scale; |
| 91 scale.setScale(SkDoubleToMScalar(x), |
| 92 SkDoubleToMScalar(y), |
| 93 SkDoubleToMScalar(1)); |
| 94 matrix_.preConcat(scale); |
| 95 } |
68 } | 96 } |
69 | 97 |
70 void Transform::SetScaleZ(double z) { | 98 void Transform::Scale3d(double x, double y, double z) { |
71 matrix_.setDouble(2, 2, z); | 99 if (matrix_.isIdentity()) { |
| 100 matrix_.setScale(SkDoubleToMScalar(x), |
| 101 SkDoubleToMScalar(y), |
| 102 SkDoubleToMScalar(z)); |
| 103 } else { |
| 104 SkMatrix44 scale; |
| 105 scale.setScale(SkDoubleToMScalar(x), |
| 106 SkDoubleToMScalar(y), |
| 107 SkDoubleToMScalar(z)); |
| 108 matrix_.preConcat(scale); |
| 109 } |
72 } | 110 } |
73 | 111 |
74 void Transform::SetScale(double x, double y) { | 112 void Transform::Translate(double x, double y) { |
75 matrix_.setScale(SkDoubleToMScalar(x), | 113 if (matrix_.isIdentity()) { |
76 SkDoubleToMScalar(y), | 114 matrix_.setTranslate(SkDoubleToMScalar(x), |
77 matrix_.get(2, 2)); | 115 SkDoubleToMScalar(y), |
| 116 SkDoubleToMScalar(0)); |
| 117 } else { |
| 118 SkMatrix44 translate; |
| 119 translate.setTranslate(SkDoubleToMScalar(x), |
| 120 SkDoubleToMScalar(y), |
| 121 SkDoubleToMScalar(0)); |
| 122 matrix_.preConcat(translate); |
| 123 } |
78 } | 124 } |
79 | 125 |
80 void Transform::SetScale3d(double x, double y, double z) { | 126 void Transform::Translate3d(double x, double y, double z) { |
81 matrix_.setScale(SkDoubleToMScalar(x), | 127 if (matrix_.isIdentity()) { |
82 SkDoubleToMScalar(y), | 128 matrix_.setTranslate(SkDoubleToMScalar(x), |
83 SkDoubleToMScalar(z)); | 129 SkDoubleToMScalar(y), |
| 130 SkDoubleToMScalar(z)); |
| 131 } else { |
| 132 SkMatrix44 translate; |
| 133 translate.setTranslate(SkDoubleToMScalar(x), |
| 134 SkDoubleToMScalar(y), |
| 135 SkDoubleToMScalar(z)); |
| 136 matrix_.preConcat(translate); |
| 137 } |
84 } | 138 } |
85 | 139 |
86 void Transform::SetTranslateX(double x) { | 140 void Transform::SkewX(double angle_x) { |
87 matrix_.setDouble(0, 3, x); | 141 if (matrix_.isIdentity()) |
| 142 matrix_.setDouble(0, 1, TanDegrees(angle_x)); |
| 143 else { |
| 144 SkMatrix44 skew; |
| 145 skew.setDouble(0, 1, TanDegrees(angle_x)); |
| 146 matrix_.preConcat(skew); |
| 147 } |
88 } | 148 } |
89 | 149 |
90 void Transform::SetTranslateY(double y) { | 150 void Transform::SkewY(double angle_y) { |
91 matrix_.setDouble(1, 3, y); | 151 if (matrix_.isIdentity()) |
| 152 matrix_.setDouble(1, 0, TanDegrees(angle_y)); |
| 153 else { |
| 154 SkMatrix44 skew; |
| 155 skew.setDouble(1, 0, TanDegrees(angle_y)); |
| 156 matrix_.preConcat(skew); |
| 157 } |
92 } | 158 } |
93 | 159 |
94 void Transform::SetTranslateZ(double z) { | 160 void Transform::ApplyPerspectiveDepth(double depth) { |
95 matrix_.setDouble(2, 3, z); | |
96 } | |
97 | |
98 void Transform::SetTranslate(double x, double y) { | |
99 matrix_.setTranslate(SkDoubleToMScalar(x), | |
100 SkDoubleToMScalar(y), | |
101 matrix_.get(2, 3)); | |
102 } | |
103 | |
104 void Transform::SetTranslate3d(double x, double y, double z) { | |
105 matrix_.setTranslate(SkDoubleToMScalar(x), | |
106 SkDoubleToMScalar(y), | |
107 SkDoubleToMScalar(z)); | |
108 } | |
109 | |
110 void Transform::SetSkewX(double angle) { | |
111 matrix_.setDouble(0, 1, TanDegrees(angle)); | |
112 } | |
113 | |
114 void Transform::SetSkewY(double angle) { | |
115 matrix_.setDouble(1, 0, TanDegrees(angle)); | |
116 } | |
117 | |
118 void Transform::SetPerspectiveDepth(double depth) { | |
119 if (depth == 0) | 161 if (depth == 0) |
120 return; | 162 return; |
121 | 163 if (matrix_.isIdentity()) |
122 SkMatrix44 m; | 164 matrix_.setDouble(3, 2, -1.0 / depth); |
123 m.setDouble(3, 2, -1.0 / depth); | 165 else { |
124 matrix_ = m; | 166 SkMatrix44 m; |
125 } | 167 m.setDouble(3, 2, -1.0 / depth); |
126 | 168 matrix_.preConcat(m); |
127 void Transform::ConcatRotate(double degree) { | 169 } |
128 SkMatrix44 rot; | |
129 rot.setRotateDegreesAbout(SkDoubleToMScalar(0), | |
130 SkDoubleToMScalar(0), | |
131 SkDoubleToMScalar(1), | |
132 SkDoubleToMScalar(degree)); | |
133 matrix_.postConcat(rot); | |
134 } | |
135 | |
136 void Transform::ConcatRotateAbout(const Point3F& axis, double degree) { | |
137 SkMatrix44 rot; | |
138 rot.setRotateDegreesAbout(SkDoubleToMScalar(axis.x()), | |
139 SkDoubleToMScalar(axis.y()), | |
140 SkDoubleToMScalar(axis.z()), | |
141 SkDoubleToMScalar(degree)); | |
142 matrix_.postConcat(rot); | |
143 } | |
144 | |
145 void Transform::ConcatScale(double x, double y) { | |
146 SkMatrix44 scale; | |
147 scale.setScale(SkDoubleToMScalar(x), | |
148 SkDoubleToMScalar(y), | |
149 SkDoubleToMScalar(1)); | |
150 matrix_.postConcat(scale); | |
151 } | |
152 | |
153 void Transform::ConcatScale3d(double x, double y, double z) { | |
154 SkMatrix44 scale; | |
155 scale.setScale(SkDoubleToMScalar(x), | |
156 SkDoubleToMScalar(y), | |
157 SkDoubleToMScalar(z)); | |
158 matrix_.postConcat(scale); | |
159 } | |
160 | |
161 void Transform::ConcatTranslate(double x, double y) { | |
162 SkMatrix44 translate; | |
163 translate.setTranslate(SkDoubleToMScalar(x), | |
164 SkDoubleToMScalar(y), | |
165 SkDoubleToMScalar(0)); | |
166 matrix_.postConcat(translate); | |
167 } | |
168 | |
169 void Transform::ConcatTranslate3d(double x, double y, double z) { | |
170 SkMatrix44 translate; | |
171 translate.setTranslate(SkDoubleToMScalar(x), | |
172 SkDoubleToMScalar(y), | |
173 SkDoubleToMScalar(z)); | |
174 matrix_.postConcat(translate); | |
175 } | |
176 | |
177 void Transform::ConcatSkewX(double angle_x) { | |
178 Transform t; | |
179 t.SetSkewX(angle_x); | |
180 matrix_.postConcat(t.matrix_); | |
181 } | |
182 | |
183 void Transform::ConcatSkewY(double angle_y) { | |
184 Transform t; | |
185 t.SetSkewY(angle_y); | |
186 matrix_.postConcat(t.matrix_); | |
187 } | |
188 | |
189 void Transform::ConcatPerspectiveDepth(double depth) { | |
190 if (depth == 0) | |
191 return; | |
192 | |
193 SkMatrix44 m; | |
194 m.setDouble(3, 2, -1.0 / depth); | |
195 matrix_.postConcat(m); | |
196 } | |
197 | |
198 void Transform::PreconcatRotate(double degree) { | |
199 SkMatrix44 rot; | |
200 rot.setRotateDegreesAbout(SkDoubleToMScalar(0), | |
201 SkDoubleToMScalar(0), | |
202 SkDoubleToMScalar(1), | |
203 SkDoubleToMScalar(degree)); | |
204 matrix_.preConcat(rot); | |
205 } | |
206 | |
207 void Transform::PreconcatRotateAbout(const Point3F& axis, double degree) { | |
208 SkMatrix44 rot; | |
209 rot.setRotateDegreesAbout(SkDoubleToMScalar(axis.x()), | |
210 SkDoubleToMScalar(axis.y()), | |
211 SkDoubleToMScalar(axis.z()), | |
212 SkDoubleToMScalar(degree)); | |
213 matrix_.preConcat(rot); | |
214 } | |
215 | |
216 void Transform::PreconcatScale(double x, double y) { | |
217 SkMatrix44 scale; | |
218 scale.setScale(SkDoubleToMScalar(x), | |
219 SkDoubleToMScalar(y), | |
220 SkDoubleToMScalar(1)); | |
221 matrix_.preConcat(scale); | |
222 } | |
223 | |
224 void Transform::PreconcatScale3d(double x, double y, double z) { | |
225 SkMatrix44 scale; | |
226 scale.setScale(SkDoubleToMScalar(x), | |
227 SkDoubleToMScalar(y), | |
228 SkDoubleToMScalar(z)); | |
229 matrix_.preConcat(scale); | |
230 } | |
231 | |
232 void Transform::PreconcatTranslate(double x, double y) { | |
233 SkMatrix44 translate; | |
234 translate.setTranslate(SkDoubleToMScalar(x), | |
235 SkDoubleToMScalar(y), | |
236 SkDoubleToMScalar(0)); | |
237 matrix_.preConcat(translate); | |
238 } | |
239 | |
240 void Transform::PreconcatTranslate3d(double x, double y, double z) { | |
241 SkMatrix44 translate; | |
242 translate.setTranslate(SkDoubleToMScalar(x), | |
243 SkDoubleToMScalar(y), | |
244 SkDoubleToMScalar(z)); | |
245 matrix_.preConcat(translate); | |
246 } | |
247 | |
248 void Transform::PreconcatSkewX(double angle_x) { | |
249 Transform t; | |
250 t.SetSkewX(angle_x); | |
251 matrix_.preConcat(t.matrix_); | |
252 } | |
253 | |
254 void Transform::PreconcatSkewY(double angle_y) { | |
255 Transform t; | |
256 t.SetSkewY(angle_y); | |
257 matrix_.preConcat(t.matrix_); | |
258 } | |
259 | |
260 void Transform::PreconcatPerspectiveDepth(double depth) { | |
261 if (depth == 0) | |
262 return; | |
263 | |
264 SkMatrix44 m; | |
265 m.setDouble(3, 2, -1.0 / depth); | |
266 matrix_.preConcat(m); | |
267 } | 170 } |
268 | 171 |
269 void Transform::PreconcatTransform(const Transform& transform) { | 172 void Transform::PreconcatTransform(const Transform& transform) { |
270 if (!transform.matrix_.isIdentity()) { | 173 if (!transform.matrix_.isIdentity()) { |
271 matrix_.preConcat(transform.matrix_); | 174 matrix_.preConcat(transform.matrix_); |
272 } | 175 } |
273 } | 176 } |
274 | 177 |
275 void Transform::ConcatTransform(const Transform& transform) { | 178 void Transform::ConcatTransform(const Transform& transform) { |
276 if (!transform.matrix_.isIdentity()) { | 179 if (!transform.matrix_.isIdentity()) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 !DecomposeTransform(&from_decomp, from)) | 258 !DecomposeTransform(&from_decomp, from)) |
356 return false; | 259 return false; |
357 | 260 |
358 if (!BlendDecomposedTransforms(&to_decomp, to_decomp, from_decomp, progress)) | 261 if (!BlendDecomposedTransforms(&to_decomp, to_decomp, from_decomp, progress)) |
359 return false; | 262 return false; |
360 | 263 |
361 matrix_ = ComposeTransform(to_decomp).matrix(); | 264 matrix_ = ComposeTransform(to_decomp).matrix(); |
362 return true; | 265 return true; |
363 } | 266 } |
364 | 267 |
| 268 Transform Transform::operator*(const Transform& other) const { |
| 269 Transform to_return; |
| 270 to_return.matrix_.setConcat(matrix_, other.matrix_); |
| 271 return to_return; |
| 272 } |
| 273 |
| 274 Transform& Transform::operator*=(const Transform& other) { |
| 275 matrix_.preConcat(other.matrix_); |
| 276 return *this; |
| 277 } |
| 278 |
365 void Transform::TransformPointInternal(const SkMatrix44& xform, | 279 void Transform::TransformPointInternal(const SkMatrix44& xform, |
366 Point3F& point) const { | 280 Point3F& point) const { |
367 SkMScalar p[4] = { | 281 SkMScalar p[4] = { |
368 SkDoubleToMScalar(point.x()), | 282 SkDoubleToMScalar(point.x()), |
369 SkDoubleToMScalar(point.y()), | 283 SkDoubleToMScalar(point.y()), |
370 SkDoubleToMScalar(point.z()), | 284 SkDoubleToMScalar(point.z()), |
371 SkDoubleToMScalar(1) | 285 SkDoubleToMScalar(1) |
372 }; | 286 }; |
373 | 287 |
374 xform.mapMScalars(p); | 288 xform.mapMScalars(p); |
(...skipping 13 matching lines...) Expand all Loading... |
388 SkDoubleToMScalar(0), | 302 SkDoubleToMScalar(0), |
389 SkDoubleToMScalar(1) | 303 SkDoubleToMScalar(1) |
390 }; | 304 }; |
391 | 305 |
392 xform.mapMScalars(p); | 306 xform.mapMScalars(p); |
393 | 307 |
394 point.SetPoint(ToRoundedInt(p[0]), ToRoundedInt(p[1])); | 308 point.SetPoint(ToRoundedInt(p[0]), ToRoundedInt(p[1])); |
395 } | 309 } |
396 | 310 |
397 } // namespace gfx | 311 } // namespace gfx |
OLD | NEW |