xref: /trunk/main/basegfx/inc/basegfx/matrix/b2dhommatrix.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _BGFX_MATRIX_B2DHOMMATRIX_HXX
25 #define _BGFX_MATRIX_B2DHOMMATRIX_HXX
26 
27 #include <sal/types.h>
28 #include <o3tl/cow_wrapper.hxx>
29 #include <basegfx/basegfxdllapi.h>
30 
31 namespace basegfx
32 {
33     class B2DTuple;
34     class Impl2DHomMatrix;
35 
36     class BASEGFX_DLLPUBLIC B2DHomMatrix
37     {
38     public:
39         typedef o3tl::cow_wrapper< Impl2DHomMatrix > ImplType;
40 
41     private:
42         ImplType                                     mpImpl;
43 
44     public:
45         B2DHomMatrix();
46         B2DHomMatrix(const B2DHomMatrix& rMat);
47         ~B2DHomMatrix();
48 
49         /** constructor to allow setting all needed values for a 3x2 matrix at once. The
50             parameter f_0x1 e.g. is the same as using set(0, 1, f)
51          */
52         B2DHomMatrix(double f_0x0, double f_0x1, double f_0x2, double f_1x0, double f_1x1, double f_1x2);
53 
54         /// unshare this matrix with all internally shared instances
55         void makeUnique();
56 
57         double get(sal_uInt16 nRow, sal_uInt16 nColumn) const;
58         void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue);
59 
60         /** allow setting all needed values for a 3x2 matrix in one call. The
61             parameter f_0x1 e.g. is the same as using set(0, 1, f)
62          */
63         void set3x2(double f_0x0, double f_0x1, double f_0x2, double f_1x0, double f_1x1, double f_1x2);
64 
65         // test if last line is default to see if last line needs to be
66         // involved in calculations
67         bool isLastLineDefault() const;
68 
69         // Auf Einheitsmatrix zuruecksetzen
70         bool isIdentity() const;
71         void identity();
72 
73         // Invertierung
74         bool isInvertible() const;
75         bool invert();
76 
77         // Normalisierung
78         bool isNormalized() const;
79         void normalize();
80 
81         // Determinante
82         double determinant() const;
83 
84         // Trace
85         double trace() const;
86 
87         // Transpose
88         void transpose();
89 
90         // Rotation
91         void rotate(double fRadiant);
92 
93         // Translation
94         void translate(double fX, double fY);
95 
96         // Skalierung
97         void scale(double fX, double fY);
98 
99         // Shearing-Matrices
100         void shearX(double fSx);
101         void shearY(double fSy);
102 
103         // Addition, Subtraktion
104         B2DHomMatrix& operator+=(const B2DHomMatrix& rMat);
105         B2DHomMatrix& operator-=(const B2DHomMatrix& rMat);
106 
107         // Vergleichsoperatoren
108         bool operator==(const B2DHomMatrix& rMat) const;
109         bool operator!=(const B2DHomMatrix& rMat) const;
110 
111         // Multiplikation, Division mit Konstante
112         B2DHomMatrix& operator*=(double fValue);
113         B2DHomMatrix& operator/=(double fValue);
114 
115         // Matritzenmultiplikation von links auf die lokale
116         B2DHomMatrix& operator*=(const B2DHomMatrix& rMat);
117 
118         // assignment operator
119         B2DHomMatrix& operator=(const B2DHomMatrix& rMat);
120 
121         // Help routine to decompose given homogen 3x3 matrix to components. A correction of
122         // the components is done to avoid inaccuracies.
123         // Zerlegung
124         bool decompose(B2DTuple& rScale, B2DTuple& rTranslate, double& rRotate, double& rShearX) const;
125     };
126 
127     // Addition, Subtraktion
operator +(const B2DHomMatrix & rMatA,const B2DHomMatrix & rMatB)128     inline B2DHomMatrix operator+(const B2DHomMatrix& rMatA, const B2DHomMatrix& rMatB)
129     {
130         B2DHomMatrix aSum(rMatA);
131         aSum += rMatB;
132         return aSum;
133     }
134 
operator -(const B2DHomMatrix & rMatA,const B2DHomMatrix & rMatB)135     inline B2DHomMatrix operator-(const B2DHomMatrix& rMatA, const B2DHomMatrix& rMatB)
136     {
137         B2DHomMatrix aDiv(rMatA);
138         aDiv -= rMatB;
139         return aDiv;
140     }
141 
142     // Multiplikation, Division mit Konstante
operator *(const B2DHomMatrix & rMat,double fValue)143     inline B2DHomMatrix operator*(const B2DHomMatrix& rMat, double fValue)
144     {
145         B2DHomMatrix aNew(rMat);
146         aNew *= fValue;
147         return aNew;
148     }
149 
operator /(const B2DHomMatrix & rMat,double fValue)150     inline B2DHomMatrix operator/(const B2DHomMatrix& rMat, double fValue)
151     {
152         B2DHomMatrix aNew(rMat);
153         aNew *= 1.0 / fValue;
154         return aNew;
155     }
156 
operator *(const B2DHomMatrix & rMatA,const B2DHomMatrix & rMatB)157     inline B2DHomMatrix operator*(const B2DHomMatrix& rMatA, const B2DHomMatrix& rMatB)
158     {
159         B2DHomMatrix aMul(rMatB);
160         aMul *= rMatA;
161         return aMul;
162     }
163 } // end of namespace basegfx
164 
165 #endif /* _BGFX_MATRIX_B2DHOMMATRIX_HXX */
166