Matrix.h revision 624234f69b2a4781d24f3e4c6ae6450729e38397
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_HWUI_MATRIX_H
18#define ANDROID_HWUI_MATRIX_H
19
20#include <SkMatrix.h>
21
22#include <cutils/compiler.h>
23
24#include "Rect.h"
25
26namespace android {
27namespace uirenderer {
28
29///////////////////////////////////////////////////////////////////////////////
30// Classes
31///////////////////////////////////////////////////////////////////////////////
32
33class ANDROID_API Matrix4 {
34public:
35    float data[16];
36
37    enum Entry {
38        kScaleX = 0,
39        kSkewY = 1,
40        kPerspective0 = 3,
41        kSkewX = 4,
42        kScaleY = 5,
43        kPerspective1 = 7,
44        kScaleZ = 10,
45        kTranslateX = 12,
46        kTranslateY = 13,
47        kTranslateZ = 14,
48        kPerspective2 = 15
49    };
50
51    // NOTE: The flags from kTypeIdentity to kTypePerspective
52    //       must be kept in sync with the type flags found
53    //       in SkMatrix
54    enum Type {
55        kTypeIdentity = 0,
56        kTypeTranslate = 0x1,
57        kTypeScale = 0x2,
58        kTypeAffine = 0x4,
59        kTypePerspective = 0x8,
60        kTypeRectToRect = 0x10,
61        kTypeUnknown = 0x20,
62    };
63
64    static const int sGeometryMask = 0xf;
65
66    Matrix4() {
67        loadIdentity();
68    }
69
70    Matrix4(const float* v) {
71        load(v);
72    }
73
74    Matrix4(const Matrix4& v) {
75        load(v);
76    }
77
78    Matrix4(const SkMatrix& v) {
79        load(v);
80    }
81
82    float operator[](int index) const {
83        return data[index];
84    }
85
86    float& operator[](int index) {
87        mType = kTypeUnknown;
88        return data[index];
89    }
90
91    Matrix4& operator=(const SkMatrix& v) {
92        load(v);
93        return *this;
94    }
95
96    void loadIdentity();
97
98    void load(const float* v);
99    void load(const Matrix4& v);
100    void load(const SkMatrix& v);
101
102    void loadInverse(const Matrix4& v);
103
104    void loadTranslate(float x, float y, float z);
105    void loadScale(float sx, float sy, float sz);
106    void loadSkew(float sx, float sy);
107    void loadRotate(float angle);
108    void loadRotate(float angle, float x, float y, float z);
109    void loadMultiply(const Matrix4& u, const Matrix4& v);
110
111    void loadOrtho(float left, float right, float bottom, float top, float near, float far);
112
113    uint32_t getType() const;
114
115    void multiply(const Matrix4& v) {
116        Matrix4 u;
117        u.loadMultiply(*this, v);
118        load(u);
119    }
120
121    void multiply(float v);
122
123    void translate(float x, float y, float z) {
124        Matrix4 u;
125        u.loadTranslate(x, y, z);
126        multiply(u);
127    }
128
129    void scale(float sx, float sy, float sz) {
130        Matrix4 u;
131        u.loadScale(sx, sy, sz);
132        multiply(u);
133    }
134
135    void skew(float sx, float sy) {
136        Matrix4 u;
137        u.loadSkew(sx, sy);
138        multiply(u);
139    }
140
141    void rotate(float angle, float x, float y, float z) {
142        Matrix4 u;
143        u.loadRotate(angle, x, y, z);
144        multiply(u);
145    }
146
147    /**
148     * If the matrix is identity or translate and/or scale.
149     */
150    bool isSimple() const;
151    bool isPureTranslate() const;
152    bool isIdentity() const;
153    bool isPerspective() const;
154    bool rectToRect() const;
155
156    bool changesBounds() const;
157
158    void copyTo(float* v) const;
159    void copyTo(SkMatrix& v) const;
160
161    void mapRect(Rect& r) const;
162    void mapPoint(float& x, float& y) const;
163
164    float getTranslateX() const;
165    float getTranslateY() const;
166
167    void decomposeScale(float& sx, float& sy) const;
168
169    void dump() const;
170
171    static const Matrix4& identity();
172
173private:
174    mutable uint32_t mType;
175
176    inline float get(int i, int j) const {
177        return data[i * 4 + j];
178    }
179
180    inline void set(int i, int j, float v) {
181        data[i * 4 + j] = v;
182    }
183
184    uint32_t getGeometryType() const;
185
186}; // class Matrix4
187
188///////////////////////////////////////////////////////////////////////////////
189// Types
190///////////////////////////////////////////////////////////////////////////////
191
192typedef Matrix4 mat4;
193
194}; // namespace uirenderer
195}; // namespace android
196
197#endif // ANDROID_HWUI_MATRIX_H
198