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 #ifndef UI_GFX_TRANSFORM_H_ | 5 #ifndef UI_GFX_TRANSFORM_H_ |
6 #define UI_GFX_TRANSFORM_H_ | 6 #define UI_GFX_TRANSFORM_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 22 matching lines...) Expand all Loading... | |
33 // Skips initializing this matrix to avoid overhead, when we know it will be | 33 // Skips initializing this matrix to avoid overhead, when we know it will be |
34 // initialized before use. | 34 // initialized before use. |
35 Transform(SkipInitialization) | 35 Transform(SkipInitialization) |
36 : matrix_(SkMatrix44::kUninitialized_Constructor) {} | 36 : matrix_(SkMatrix44::kUninitialized_Constructor) {} |
37 Transform(const Transform& rhs) : matrix_(rhs.matrix_) {} | 37 Transform(const Transform& rhs) : matrix_(rhs.matrix_) {} |
38 // Initialize with the concatenation of lhs * rhs. | 38 // Initialize with the concatenation of lhs * rhs. |
39 Transform(const Transform& lhs, const Transform& rhs) | 39 Transform(const Transform& lhs, const Transform& rhs) |
40 : matrix_(lhs.matrix_, rhs.matrix_) {} | 40 : matrix_(lhs.matrix_, rhs.matrix_) {} |
41 // Constructs a transform from explicit 16 matrix elements. Elements | 41 // Constructs a transform from explicit 16 matrix elements. Elements |
42 // should be given in row-major order. | 42 // should be given in row-major order. |
43 Transform(double col1row1, double col2row1, double col3row1, double col4row1, | 43 Transform(SkMScalar col1row1, |
44 double col1row2, double col2row2, double col3row2, double col4row2, | 44 SkMScalar col2row1, |
45 double col1row3, double col2row3, double col3row3, double col4row3, | 45 SkMScalar col3row1, |
46 double col1row4, double col2row4, double col3row4, double col4row4); | 46 SkMScalar col4row1, |
47 SkMScalar col1row2, | |
48 SkMScalar col2row2, | |
49 SkMScalar col3row2, | |
50 SkMScalar col4row2, | |
51 SkMScalar col1row3, | |
52 SkMScalar col2row3, | |
53 SkMScalar col3row3, | |
54 SkMScalar col4row3, | |
55 SkMScalar col1row4, | |
56 SkMScalar col2row4, | |
57 SkMScalar col3row4, | |
58 SkMScalar col4row4); | |
47 // Constructs a transform from explicit 2d elements. All other matrix | 59 // Constructs a transform from explicit 2d elements. All other matrix |
48 // elements remain the same as the corresponding elements of an identity | 60 // elements remain the same as the corresponding elements of an identity |
49 // matrix. | 61 // matrix. |
50 Transform(double col1row1, double col2row1, | 62 Transform(SkMScalar col1row1, |
51 double col1row2, double col2row2, | 63 SkMScalar col2row1, |
52 double x_translation, double y_translation); | 64 SkMScalar col1row2, |
65 SkMScalar col2row2, | |
66 SkMScalar x_translation, | |
67 SkMScalar y_translation); | |
53 ~Transform() {} | 68 ~Transform() {} |
54 | 69 |
55 bool operator==(const Transform& rhs) const { return matrix_ == rhs.matrix_; } | 70 bool operator==(const Transform& rhs) const { return matrix_ == rhs.matrix_; } |
56 bool operator!=(const Transform& rhs) const { return matrix_ != rhs.matrix_; } | 71 bool operator!=(const Transform& rhs) const { return matrix_ != rhs.matrix_; } |
57 | 72 |
58 // Resets this transform to the identity transform. | 73 // Resets this transform to the identity transform. |
59 void MakeIdentity() { matrix_.setIdentity(); } | 74 void MakeIdentity() { matrix_.setIdentity(); } |
60 | 75 |
61 // Applies the current transformation on a 2d rotation and assigns the result | 76 // Applies the current transformation on a 2d rotation and assigns the result |
62 // to |this|. | 77 // to |this|. |
63 void Rotate(double degrees) { RotateAboutZAxis(degrees); } | 78 void Rotate(double degrees) { RotateAboutZAxis(degrees); } |
64 | 79 |
65 // Applies the current transformation on an axis-angle rotation and assigns | 80 // Applies the current transformation on an axis-angle rotation and assigns |
66 // the result to |this|. | 81 // the result to |this|. |
67 void RotateAboutXAxis(double degrees); | 82 void RotateAboutXAxis(double degrees); |
68 void RotateAboutYAxis(double degrees); | 83 void RotateAboutYAxis(double degrees); |
69 void RotateAboutZAxis(double degrees); | 84 void RotateAboutZAxis(double degrees); |
70 void RotateAbout(const Vector3dF& axis, double degrees); | 85 void RotateAbout(const Vector3dF& axis, double degrees); |
71 | 86 |
72 // Applies the current transformation on a scaling and assigns the result | 87 // Applies the current transformation on a scaling and assigns the result |
73 // to |this|. | 88 // to |this|. |
74 void Scale(double x, double y); | 89 void Scale(SkMScalar x, SkMScalar y); |
75 void Scale3d(double x, double y, double z); | 90 void Scale3d(SkMScalar x, SkMScalar y, SkMScalar z); |
76 | 91 |
77 // Applies the current transformation on a translation and assigns the result | 92 // Applies the current transformation on a translation and assigns the result |
78 // to |this|. | 93 // to |this|. |
79 void Translate(double x, double y); | 94 void Translate(SkMScalar x, SkMScalar y); |
80 void Translate3d(double x, double y, double z); | 95 void Translate3d(SkMScalar x, SkMScalar y, SkMScalar z); |
81 | 96 |
82 // Applies the current transformation on a skew and assigns the result | 97 // Applies the current transformation on a skew and assigns the result |
83 // to |this|. | 98 // to |this|. |
84 void SkewX(double angle_x); | 99 void SkewX(SkMScalar angle_x); |
85 void SkewY(double angle_y); | 100 void SkewY(SkMScalar angle_y); |
86 | 101 |
87 // Applies the current transformation on a perspective transform and assigns | 102 // Applies the current transformation on a perspective transform and assigns |
88 // the result to |this|. | 103 // the result to |this|. |
89 void ApplyPerspectiveDepth(double depth); | 104 void ApplyPerspectiveDepth(SkMScalar depth); |
90 | 105 |
91 // Applies a transformation on the current transformation | 106 // Applies a transformation on the current transformation |
92 // (i.e. 'this = this * transform;'). | 107 // (i.e. 'this = this * transform;'). |
93 void PreconcatTransform(const Transform& transform); | 108 void PreconcatTransform(const Transform& transform); |
94 | 109 |
95 // Applies a transformation on the current transformation | 110 // Applies a transformation on the current transformation |
96 // (i.e. 'this = transform * this;'). | 111 // (i.e. 'this = transform * this;'). |
97 void ConcatTransform(const Transform& transform); | 112 void ConcatTransform(const Transform& transform); |
98 | 113 |
99 // Returns true if this is the identity matrix. | 114 // Returns true if this is the identity matrix. |
100 bool IsIdentity() const { return matrix_.isIdentity(); } | 115 bool IsIdentity() const { return matrix_.isIdentity(); } |
101 | 116 |
102 // Returns true if the matrix is either identity or pure translation. | 117 // Returns true if the matrix is either identity or pure translation. |
103 bool IsIdentityOrTranslation() const { | 118 bool IsIdentityOrTranslation() const { |
104 return !(matrix_.getType() & ~SkMatrix44::kTranslate_Mask); | 119 return !(matrix_.getType() & ~SkMatrix44::kTranslate_Mask); |
105 } | 120 } |
106 | 121 |
107 // Returns true if the matrix is either a positive scale and/or a translation. | 122 // Returns true if the matrix is either a positive scale and/or a translation. |
108 bool IsPositiveScaleOrTranslation() const { | 123 bool IsPositiveScaleOrTranslation() const { |
109 if (!IsScaleOrTranslation()) | 124 if (!IsScaleOrTranslation()) |
110 return false; | 125 return false; |
111 return matrix_.getDouble(0, 0) > 0.0 && | 126 return matrix_.get(0, 0) > 0.0 && matrix_.get(1, 1) > 0.0 && |
112 matrix_.getDouble(1, 1) > 0.0 && | 127 matrix_.get(2, 2) > 0.0; |
113 matrix_.getDouble(2, 2) > 0.0; | |
114 } | 128 } |
115 | 129 |
116 // Returns true if the matrix is either identity or pure, non-fractional | 130 // Returns true if the matrix is either identity or pure, non-fractional |
117 // translation. | 131 // translation. |
118 bool IsIdentityOrIntegerTranslation() const; | 132 bool IsIdentityOrIntegerTranslation() const; |
119 | 133 |
120 // Returns true if the matrix is has only scaling and translation components. | 134 // Returns true if the matrix is has only scaling and translation components. |
121 bool IsScaleOrTranslation() const { | 135 bool IsScaleOrTranslation() const { |
122 int mask = SkMatrix44::kScale_Mask | SkMatrix44::kTranslate_Mask; | 136 int mask = SkMatrix44::kScale_Mask | SkMatrix44::kTranslate_Mask; |
123 return (matrix_.getType() & ~mask) == 0; | 137 return (matrix_.getType() & ~mask) == 0; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
195 | 209 |
196 // Decomposes |this| and |from|, interpolates the decomposed values, and | 210 // Decomposes |this| and |from|, interpolates the decomposed values, and |
197 // sets |this| to the reconstituted result. Returns false if either matrix | 211 // sets |this| to the reconstituted result. Returns false if either matrix |
198 // can't be decomposed. Uses routines described in this spec: | 212 // can't be decomposed. Uses routines described in this spec: |
199 // http://www.w3.org/TR/css3-3d-transforms/. | 213 // http://www.w3.org/TR/css3-3d-transforms/. |
200 // | 214 // |
201 // Note: this call is expensive since we need to decompose the transform. If | 215 // Note: this call is expensive since we need to decompose the transform. If |
202 // you're going to be calling this rapidly (e.g., in an animation) you should | 216 // you're going to be calling this rapidly (e.g., in an animation) you should |
203 // decompose once using gfx::DecomposeTransforms and reuse your | 217 // decompose once using gfx::DecomposeTransforms and reuse your |
204 // DecomposedTransform. | 218 // DecomposedTransform. |
205 bool Blend(const Transform& from, double progress); | 219 bool Blend(const Transform& from, SkMScalar progress); |
danakj
2013/09/09 17:57:45
progress isn't a transform element, should stay as
| |
206 | 220 |
207 // Returns |this| * |other|. | 221 // Returns |this| * |other|. |
208 Transform operator*(const Transform& other) const { | 222 Transform operator*(const Transform& other) const { |
209 return Transform(*this, other); | 223 return Transform(*this, other); |
210 } | 224 } |
211 | 225 |
212 // Sets |this| = |this| * |other| | 226 // Sets |this| = |this| * |other| |
213 Transform& operator*=(const Transform& other) { | 227 Transform& operator*=(const Transform& other) { |
214 PreconcatTransform(other); | 228 PreconcatTransform(other); |
215 return *this; | 229 return *this; |
(...skipping 13 matching lines...) Expand all Loading... | |
229 Point3F& point) const; | 243 Point3F& point) const; |
230 | 244 |
231 SkMatrix44 matrix_; | 245 SkMatrix44 matrix_; |
232 | 246 |
233 // copy/assign are allowed. | 247 // copy/assign are allowed. |
234 }; | 248 }; |
235 | 249 |
236 } // namespace gfx | 250 } // namespace gfx |
237 | 251 |
238 #endif // UI_GFX_TRANSFORM_H_ | 252 #endif // UI_GFX_TRANSFORM_H_ |
OLD | NEW |