• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef RENDER_SERVICE_CLIENT_CORE_COMMON_RS_MATRIX3_H
17 #define RENDER_SERVICE_CLIENT_CORE_COMMON_RS_MATRIX3_H
18 
19 #define USE_MATH_DEFINES
20 #include <cmath>
21 
22 #include "common/rs_macros.h"
23 #include "common/rs_vector2.h"
24 #include "common/rs_vector3.h"
25 
26 // column-major order
27 namespace OHOS {
28 namespace Rosen {
29 template<typename T>
30 class Matrix3 {
31 public:
32     static const Matrix3 ZERO;
33     static const Matrix3 IDENTITY;
34     Matrix3();
35     Matrix3(T m00, T m01, T m02, T m10, T m11, T m12, T m20, T m21, T m22);
36 
37     Matrix3(const Matrix3& matrix) noexcept = default;
38 
39     explicit Matrix3(const T* v);
40 
41     ~Matrix3();
42     T Trace() const;
43     static int Index(int row, int col);
44     void SetIdentity();
45     void SetZero();
46     bool IsIdentity() const;
47     Matrix3 Inverse() const;
48     Matrix3 Multiply(const Matrix3& other) const;
49 
50     Matrix3 operator+(const Matrix3& other) const;
51     Matrix3 operator-(const Matrix3& other) const;
52     Matrix3 operator-() const;
53     Matrix3 operator*(const Matrix3& other) const;
54     Vector3<T> operator*(const Vector3<T>& other) const;
55     Matrix3 operator*(T scale) const;
56     T* operator[](int col);
57     Matrix3& operator=(const Matrix3& other);
58     Matrix3& operator+=(const Matrix3& other);
59     Matrix3& operator-=(const Matrix3& other);
60     Matrix3& operator*=(const Matrix3& other);
61     Matrix3& operator*=(T scale);
62     bool operator==(const Matrix3& other) const;
63     bool operator!=(const Matrix3& other) const;
64     T* GetData();
65     const T* GetConstData() const;
66     T Determinant() const;
67     Matrix3 Transpose() const;
68     Matrix3 Translate(const Vector2<T>& vec) const;
69     Matrix3 Rotate(T angle) const;
70     Matrix3 Rotate(T angle, T pivotx, T pivoty) const;
71     Matrix3 Scale(const Vector2<T>& vec) const;
72     Matrix3 Scale(const Vector2<T>& vec, T pivotx, T pivoty) const;
73     Matrix3 ShearX(T y) const;
74     Matrix3 ShearY(T x) const;
75 
76 protected:
77     T data_[9] = { 0 };
78 };
79 
80 typedef Matrix3<float> Matrix3f;
81 typedef Matrix3<double> Matrix3d;
82 
83 template<typename T>
84 const Matrix3<T> Matrix3<T>::ZERO(0, 0, 0, 0, 0, 0, 0, 0, 0);
85 
86 template<typename T>
87 const Matrix3<T> Matrix3<T>::IDENTITY(1, 0, 0, 0, 1, 0, 0, 0, 1);
88 
89 template<typename T>
Matrix3()90 Matrix3<T>::Matrix3()
91 {}
92 
93 template<typename T>
Matrix3(T m00,T m01,T m02,T m10,T m11,T m12,T m20,T m21,T m22)94 Matrix3<T>::Matrix3(T m00, T m01, T m02, T m10, T m11, T m12, T m20, T m21, T m22)
95 {
96     data_[0] = m00;
97     data_[1] = m01;
98     data_[2] = m02;
99 
100     data_[3] = m10;
101     data_[4] = m11;
102     data_[5] = m12;
103 
104     data_[6] = m20;
105     data_[7] = m21;
106     data_[8] = m22;
107 }
108 
109 template<typename T>
Matrix3(const T * v)110 Matrix3<T>::Matrix3(const T* v)
111 {
112     std::copy_n(v, std::size(data_), data_);
113 }
114 
115 template<typename T>
~Matrix3()116 Matrix3<T>::~Matrix3()
117 {}
118 
119 template<typename T>
Trace()120 T Matrix3<T>::Trace() const
121 {
122     T rTrace = 0.0;
123     rTrace += data_[0];
124     rTrace += data_[4];
125     rTrace += data_[8];
126     return rTrace;
127 }
128 
129 template<typename T>
Index(int row,int col)130 int Matrix3<T>::Index(int row, int col)
131 {
132     return (col * 3) + row;
133 }
134 
135 template<typename T>
SetIdentity()136 void Matrix3<T>::SetIdentity()
137 {
138     *this = IDENTITY;
139 }
140 
141 template<typename T>
SetZero()142 void Matrix3<T>::SetZero()
143 {
144     *this = ZERO;
145 }
146 
147 template<typename T>
IsIdentity()148 bool Matrix3<T>::IsIdentity() const
149 {
150     return (ROSEN_EQ<T>(data_[0], 1.0)) && (ROSEN_EQ<T>(data_[1], 0.0)) && (ROSEN_EQ<T>(data_[2], 0.0)) &&
151            (ROSEN_EQ<T>(data_[3], 0.0)) && (ROSEN_EQ<T>(data_[4], 1.0)) && (ROSEN_EQ<T>(data_[5], 0.0)) &&
152            (ROSEN_EQ<T>(data_[6], 0.0)) && (ROSEN_EQ<T>(data_[7], 0.0)) && (ROSEN_EQ<T>(data_[8], 1.0));
153 }
154 
155 template<typename T>
Inverse()156 Matrix3<T> Matrix3<T>::Inverse() const
157 {
158     T det = Determinant();
159     if (ROSEN_EQ<T>(det, 0.0)) {
160         return Matrix3<T>(*this);
161     }
162 
163     const T invDet = 1.0f / det;
164     const T* data = data_;
165 
166     T iX = invDet * (data[4] * data[8] - data[5] * data[7]);
167     T iY = invDet * (data[2] * data[7] - data[1] * data[8]);
168     T iZ = invDet * (data[1] * data[5] - data[2] * data[4]);
169     T jX = invDet * (data[5] * data[6] - data[3] * data[8]);
170     T jY = invDet * (data[0] * data[8] - data[2] * data[6]);
171     T jZ = invDet * (data[2] * data[3] - data[0] * data[5]);
172     T kX = invDet * (data[3] * data[7] - data[4] * data[6]);
173     T kY = invDet * (data[1] * data[6] - data[0] * data[7]);
174     T kZ = invDet * (data[0] * data[4] - data[1] * data[3]);
175 
176     return Matrix3<T>(iX, iY, iZ, jX, jY, jZ, kX, kY, kZ);
177 }
178 
179 template<typename T>
Multiply(const Matrix3<T> & other)180 Matrix3<T> Matrix3<T>::Multiply(const Matrix3<T>& other) const
181 {
182     Matrix3<T> rMulti;
183     T* rData = rMulti.data_;
184     const T* oData = other.data_;
185 
186     rData[0] = data_[0] * oData[0] + data_[3] * oData[1] + data_[6] * oData[2];
187     rData[3] = data_[0] * oData[3] + data_[3] * oData[4] + data_[6] * oData[5];
188     rData[6] = data_[0] * oData[6] + data_[3] * oData[7] + data_[6] * oData[8];
189 
190     rData[1] = data_[1] * oData[0] + data_[4] * oData[1] + data_[7] * oData[2];
191     rData[4] = data_[1] * oData[3] + data_[4] * oData[4] + data_[7] * oData[5];
192     rData[7] = data_[1] * oData[6] + data_[4] * oData[7] + data_[7] * oData[8];
193 
194     rData[2] = data_[2] * oData[0] + data_[5] * oData[1] + data_[8] * oData[2];
195     rData[5] = data_[2] * oData[3] + data_[5] * oData[4] + data_[8] * oData[5];
196     rData[8] = data_[2] * oData[6] + data_[5] * oData[7] + data_[8] * oData[8];
197     return rMulti;
198 }
199 
200 template<typename T>
201 Matrix3<T> Matrix3<T>::operator+(const Matrix3<T>& other) const
202 {
203     Matrix3<T> rMat3Add;
204     T* rMat3Data = rMat3Add.data_;
205     const T* oData = other.data_;
206 
207     rMat3Data[0] = data_[0] + oData[0];
208     rMat3Data[1] = data_[1] + oData[1];
209     rMat3Data[2] = data_[2] + oData[2];
210     rMat3Data[3] = data_[3] + oData[3];
211     rMat3Data[4] = data_[4] + oData[4];
212     rMat3Data[5] = data_[5] + oData[5];
213     rMat3Data[6] = data_[6] + oData[6];
214     rMat3Data[7] = data_[7] + oData[7];
215     rMat3Data[8] = data_[8] + oData[8];
216 
217     return rMat3Add;
218 }
219 
220 template<typename T>
221 Matrix3<T> Matrix3<T>::operator-(const Matrix3<T>& other) const
222 {
223     return *this + (-other);
224 }
225 
226 template<typename T>
227 Matrix3<T> Matrix3<T>::operator-() const
228 {
229     Matrix3<T> rMat3Sub;
230     T* rMat3Data = rMat3Sub.data_;
231 
232     rMat3Data[0] = -data_[0];
233     rMat3Data[1] = -data_[1];
234     rMat3Data[2] = -data_[2];
235     rMat3Data[3] = -data_[3];
236     rMat3Data[4] = -data_[4];
237     rMat3Data[5] = -data_[5];
238     rMat3Data[6] = -data_[6];
239     rMat3Data[7] = -data_[7];
240     rMat3Data[8] = -data_[8];
241 
242     return rMat3Sub;
243 }
244 
245 template<typename T>
246 Matrix3<T> Matrix3<T>::operator*(const Matrix3<T>& other) const
247 {
248     return Multiply(other);
249 }
250 
251 template<typename T>
252 Vector3<T> Matrix3<T>::operator*(const Vector3<T>& other) const
253 {
254     Vector3<T> rMulti;
255     T* rData = rMulti.data_;
256     const T* oData = other.data_;
257     rData[0] = data_[0] * oData[0] + data_[3] * oData[1] + data_[6] * oData[2];
258 
259     rData[1] = data_[1] * oData[0] + data_[4] * oData[1] + data_[7] * oData[2];
260 
261     rData[2] = data_[2] * oData[0] + data_[5] * oData[1] + data_[8] * oData[2];
262     return rMulti;
263 }
264 
265 template<typename T>
266 Matrix3<T> Matrix3<T>::operator*(T scale) const
267 {
268     Matrix3<T> rMulti;
269     T* rData = rMulti.data_;
270     rData[0] = data_[0] * scale;
271     rData[1] = data_[1] * scale;
272     rData[2] = data_[2] * scale;
273     rData[3] = data_[3] * scale;
274     rData[4] = data_[4] * scale;
275     rData[5] = data_[5] * scale;
276     rData[6] = data_[6] * scale;
277     rData[7] = data_[7] * scale;
278     rData[8] = data_[8] * scale;
279 
280     return rMulti;
281 }
282 
283 template<typename T>
284 T* Matrix3<T>::operator[](int col)
285 {
286     return &data_[col * 3];
287 }
288 
289 template<typename T>
290 Matrix3<T>& Matrix3<T>::operator=(const Matrix3<T>& other)
291 {
292     const T* oMat3Data = other.data_;
293     data_[0] = oMat3Data[0];
294     data_[1] = oMat3Data[1];
295     data_[2] = oMat3Data[2];
296     data_[3] = oMat3Data[3];
297     data_[4] = oMat3Data[4];
298     data_[5] = oMat3Data[5];
299     data_[6] = oMat3Data[6];
300     data_[7] = oMat3Data[7];
301     data_[8] = oMat3Data[8];
302 
303     return *this;
304 }
305 
306 template<typename T>
307 Matrix3<T>& Matrix3<T>::operator+=(const Matrix3<T>& other)
308 {
309     const T* oData = other.data_;
310 
311     data_[0] += oData[0];
312     data_[1] += oData[1];
313     data_[2] += oData[2];
314     data_[3] += oData[3];
315     data_[4] += oData[4];
316     data_[5] += oData[5];
317     data_[6] += oData[6];
318     data_[7] += oData[7];
319     data_[8] += oData[8];
320 
321     return *this;
322 }
323 
324 template<typename T>
325 Matrix3<T>& Matrix3<T>::operator-=(const Matrix3<T>& other)
326 {
327     const T* oData = other.data_;
328 
329     data_[0] -= oData[0];
330     data_[1] -= oData[1];
331     data_[2] -= oData[2];
332     data_[3] -= oData[3];
333     data_[4] -= oData[4];
334     data_[5] -= oData[5];
335     data_[6] -= oData[6];
336     data_[7] -= oData[7];
337     data_[8] -= oData[8];
338 
339     return *this;
340 }
341 
342 template<typename T>
343 Matrix3<T>& Matrix3<T>::operator*=(const Matrix3<T>& other)
344 {
345     return (*this = *this * other);
346 }
347 
348 template<typename T>
349 Matrix3<T>& Matrix3<T>::operator*=(T scale)
350 {
351     data_[0] *= scale;
352     data_[1] *= scale;
353     data_[2] *= scale;
354     data_[3] *= scale;
355     data_[4] *= scale;
356     data_[5] *= scale;
357     data_[6] *= scale;
358     data_[7] *= scale;
359     data_[8] *= scale;
360     return *this;
361 }
362 
363 template<typename T>
364 bool Matrix3<T>::operator==(const Matrix3& other) const
365 {
366     const T* oData = other.data_;
367 
368     return (ROSEN_EQ<T>(data_[0], oData[0])) && (ROSEN_EQ<T>(data_[1], oData[1])) &&
369            (ROSEN_EQ<T>(data_[2], oData[2])) && (ROSEN_EQ<T>(data_[3], oData[3])) &&
370            (ROSEN_EQ<T>(data_[4], oData[4])) && (ROSEN_EQ<T>(data_[5], oData[5])) &&
371            (ROSEN_EQ<T>(data_[6], oData[6])) && (ROSEN_EQ<T>(data_[7], oData[7])) && (ROSEN_EQ<T>(data_[8], oData[8]));
372 }
373 
374 template<typename T>
375 bool Matrix3<T>::operator!=(const Matrix3& other) const
376 {
377     return !operator==(other);
378 }
379 
380 template<typename T>
GetData()381 inline T* Matrix3<T>::GetData()
382 {
383     return data_;
384 }
385 
386 template<typename T>
GetConstData()387 const T* Matrix3<T>::GetConstData() const
388 {
389     return data_;
390 }
391 
392 template<typename T>
Determinant()393 T Matrix3<T>::Determinant() const
394 {
395     T x = data_[0] * ((data_[4] * data_[8]) - (data_[5] * data_[7]));
396     T y = data_[1] * ((data_[3] * data_[8]) - (data_[5] * data_[6]));
397     T z = data_[2] * ((data_[3] * data_[7]) - (data_[4] * data_[6]));
398     return x - y + z;
399 }
400 
401 template<typename T>
Transpose()402 Matrix3<T> Matrix3<T>::Transpose() const
403 {
404     Matrix3<T> rTrans;
405     T* rData = rTrans.data_;
406     rData[0] = data_[0];
407     rData[1] = data_[3];
408     rData[2] = data_[6];
409     rData[3] = data_[1];
410     rData[4] = data_[4];
411     rData[5] = data_[7];
412     rData[6] = data_[2];
413     rData[7] = data_[5];
414     rData[8] = data_[8];
415     return rTrans;
416 }
417 
418 template<typename T>
Translate(const Vector2<T> & vec)419 Matrix3<T> Matrix3<T>::Translate(const Vector2<T>& vec) const
420 {
421     Matrix3<T> rTrans(*this);
422     T* rData = rTrans.data_;
423 
424     rData[6] = data_[0] * vec[0] + data_[3] * vec[1] + data_[6];
425     rData[7] = data_[1] * vec[0] + data_[4] * vec[1] + data_[7];
426     rData[8] = data_[2] * vec[0] + data_[5] * vec[1] + data_[8];
427     return rTrans;
428 }
429 
430 template<typename T>
Rotate(T angle)431 Matrix3<T> Matrix3<T>::Rotate(T angle) const
432 {
433     T a = angle;
434     T c = cos(a);
435     T s = sin(a);
436 
437     Matrix3<T> rRotate(*this);
438     T* rData = rRotate.data_;
439     rData[0] = data_[0] * c + data_[3] * s;
440     rData[1] = data_[1] * c + data_[4] * s;
441     rData[2] = data_[2] * c + data_[5] * s;
442 
443     rData[3] = data_[0] * -s + data_[3] * c;
444     rData[4] = data_[1] * -s + data_[4] * c;
445     rData[5] = data_[2] * -s + data_[5] * c;
446     return rRotate;
447 }
448 
449 template<typename T>
Rotate(T angle,T pivotx,T pivoty)450 Matrix3<T> Matrix3<T>::Rotate(T angle, T pivotx, T pivoty) const
451 {
452     T a = angle;
453     T c = cos(a);
454     T s = sin(a);
455     T dx = s * pivoty + (1 - c) * pivotx;
456     T dy = -s * pivotx + (1 - c) * pivoty;
457 
458     Matrix3<T> rRotate(*this);
459     T* rData = rRotate.data_;
460     rData[0] = data_[0] * c + data_[3] * s;
461     rData[1] = data_[1] * c + data_[4] * s;
462     rData[2] = data_[2] * c + data_[5] * s;
463 
464     rData[3] = data_[0] * -s + data_[3] * c;
465     rData[4] = data_[1] * -s + data_[4] * c;
466     rData[5] = data_[2] * -s + data_[5] * c;
467 
468     rData[6] = data_[0] * dx + data_[3] * dy + data_[6];
469     rData[7] = data_[1] * dx + data_[4] * dy + data_[7];
470     rData[8] = data_[2] * dx + data_[5] * dy + data_[8];
471     return rRotate;
472 }
473 
474 template<typename T>
Scale(const Vector2<T> & vec)475 Matrix3<T> Matrix3<T>::Scale(const Vector2<T>& vec) const
476 {
477     Matrix3<T> rScale(*this);
478     T* rData = rScale.data_;
479     rData[0] = data_[0] * vec[0];
480     rData[1] = data_[1] * vec[0];
481     rData[2] = data_[2] * vec[0];
482 
483     rData[3] = data_[3] * vec[1];
484     rData[4] = data_[4] * vec[1];
485     rData[5] = data_[5] * vec[1];
486     return rScale;
487 }
488 
489 template<typename T>
Scale(const Vector2<T> & vec,T pivotx,T pivoty)490 Matrix3<T> Matrix3<T>::Scale(const Vector2<T>& vec, T pivotx, T pivoty) const
491 {
492     T dx = pivotx - vec[0] * pivotx;
493     T dy = pivoty - vec[1] * pivoty;
494 
495     Matrix3<T> rScale(*this);
496     T* rData = rScale.data_;
497     rData[0] = data_[0] * vec[0];
498     rData[1] = data_[1] * vec[0];
499     rData[2] = data_[2] * vec[0];
500 
501     rData[3] = data_[3] * vec[1];
502     rData[4] = data_[4] * vec[1];
503     rData[5] = data_[5] * vec[1];
504 
505     rData[6] = data_[0] * dx + data_[3] * dy + data_[6];
506     rData[7] = data_[1] * dx + data_[4] * dy + data_[7];
507     rData[8] = data_[2] * dx + data_[5] * dy + data_[8];
508     return rScale;
509 }
510 
511 template<typename T>
ShearX(T y)512 Matrix3<T> Matrix3<T>::ShearX(T y) const
513 {
514     Matrix3<T> rShear(Matrix3<T>::IDENTITY);
515     rShear.data_[1] = y;
516     return (*this) * rShear;
517 }
518 
519 template<typename T>
ShearY(T x)520 Matrix3<T> Matrix3<T>::ShearY(T x) const
521 {
522     Matrix3<T> rShear(Matrix3<T>::IDENTITY);
523     rShear.data_[3] = x;
524     return (*this) * rShear;
525 }
526 } // namespace Rosen
527 } // namespace OHOS
528 #endif // RENDER_SERVICE_CLIENT_CORE_COMMON_RS_MATRIX3_H
529