1 /*
2  * Copyright (c) 2020-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 #include "gfx_utils/trans_affine.h"
16 
17 namespace OHOS {
RectToParl(float x1,float y1,float x2,float y2,const float * parl)18 const TransAffine& TransAffine::RectToParl(float x1, float y1,
19                                            float x2, float y2,
20                                            const float* parl)
21 {
22     data_[0] = x2 - x1;
23     data_[3] = 0; // y1 - y1
24     data_[1] = x2 - x1;
25     data_[4] = y2 - y1;
26     data_[2] = x1;
27     data_[5] = y1;
28     Invert();
29     Multiply(TransAffine(parl[2] - parl[0], parl[3] - parl[1],
30                          parl[4] - parl[0], parl[5] - parl[1],
31                          parl[0], parl[1]));
32     return *this;
33 }
34 
Multiply(const TransAffine & metrix)35 const TransAffine& TransAffine::Multiply(const TransAffine& metrix)
36 {
37     float t0 = data_[0] * metrix.data_[0] + data_[3] * metrix.data_[1];
38     float t2 = data_[1] * metrix.data_[0] + data_[4] * metrix.data_[1];
39     float t4 = data_[2] * metrix.data_[0] + data_[5] * metrix.data_[1] + metrix.data_[2];
40     data_[3] = data_[0] * metrix.data_[3] + data_[3] * metrix.data_[4];
41     data_[4] = data_[1] * metrix.data_[3] + data_[4] * metrix.data_[4];
42     data_[5] = data_[2] * metrix.data_[3] + data_[5] * metrix.data_[4] + metrix.data_[5];
43     data_[0] = t0;
44     data_[1] = t2;
45     data_[2] = t4;
46     return *this;
47 }
48 
Invert()49 const TransAffine& TransAffine::Invert()
50 {
51     float d = DeterminantReciprocal();
52 
53     float t0 = data_[4] * d;
54     data_[4] = data_[0] * d;
55     data_[3] = -data_[3] * d;
56     data_[1] = -data_[1] * d;
57 
58     float t4 = -data_[2] * t0 - data_[5] * data_[1];
59     data_[5] = -data_[2] * data_[3] - data_[5] * data_[4];
60 
61     data_[0] = t0;
62     data_[2] = t4;
63     return *this;
64 }
65 
Reset()66 const TransAffine& TransAffine::Reset()
67 {
68     data_[1] = 0;
69     data_[2] = 0;
70     data_[3] = 0;
71     data_[5] = 0;
72     data_[6] = 0;
73     data_[7] = 0;
74     data_[0] = 1;
75     data_[4] = 1;
76     data_[8] = 1;
77     return *this;
78 }
79 
IsIdentity() const80 bool TransAffine::IsIdentity() const
81 {
82     return MATH_FLT_EQUAL(data_[0], 1.0f) &&
83            MATH_FLT_EQUAL(data_[3], 0.0f) &&
84            MATH_FLT_EQUAL(data_[1], 0.0f) &&
85            MATH_FLT_EQUAL(data_[4], 1.0f) &&
86            MATH_FLT_EQUAL(data_[2], 0.0f) &&
87            MATH_FLT_EQUAL(data_[5], 0.0f);
88 }
89 
IsValid(float epsilon) const90 bool TransAffine::IsValid(float epsilon) const
91 {
92     return (MATH_ABS(data_[0]) > epsilon) && (MATH_ABS(data_[4]) > epsilon);
93 }
94 } // namespace OHOS
95