Matrix.h revision 710f46d9d6a5bf9ea1c1833384caf61e1934124f
1a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten/*
2a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten *
4a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * you may not use this file except in compliance with the License.
6a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * You may obtain a copy of the License at
7a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten *
8a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten *
10a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * See the License for the specific language governing permissions and
14a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * limitations under the License.
15a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten */
16a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten
17a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten#ifndef ANDROID_HWUI_MATRIX_H
18a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten#define ANDROID_HWUI_MATRIX_H
19a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten
20a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten#include <SkMatrix.h>
21a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten
229f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten#include <cutils/compiler.h>
239f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
249f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten#include "Rect.h"
25a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten
26a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastennamespace android {
27a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastennamespace uirenderer {
28a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten
2974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten///////////////////////////////////////////////////////////////////////////////
30d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten// Classes
31a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten///////////////////////////////////////////////////////////////////////////////
329f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
33a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastenclass ANDROID_API Matrix4 {
34a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastenpublic:
359f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    float data[16];
369f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
379f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    enum Entry {
389f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kScaleX = 0,
399f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kSkewY = 1,
409f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kPerspective0 = 3,
417db7df0e8d9d7cee8ba374468cdbfa0108e3337cGlenn Kasten        kSkewX = 4,
42a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten        kScaleY = 5,
439f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kPerspective1 = 7,
44a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten        kScaleZ = 10,
459f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kTranslateX = 12,
469f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kTranslateY = 13,
479f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kTranslateZ = 14,
489f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        kPerspective2 = 15
499f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    };
509f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
519f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    Matrix4() {
529f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        loadIdentity();
539f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
549f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
559f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    Matrix4(const float* v) {
569f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        load(v);
579f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
589f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
599f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    Matrix4(const Matrix4& v) {
609f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        load(v);
619f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
629f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
639f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    Matrix4(const SkMatrix& v) {
649f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        load(v);
659f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
669f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
677db7df0e8d9d7cee8ba374468cdbfa0108e3337cGlenn Kasten    void loadIdentity();
689f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
699f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void load(const float* v);
709f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void load(const Matrix4& v);
719f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void load(const SkMatrix& v);
72a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten
739f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void loadInverse(const Matrix4& v);
749f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
759f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void loadTranslate(float x, float y, float z);
769f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void loadScale(float sx, float sy, float sz);
779f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void loadSkew(float sx, float sy);
789f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void loadRotate(float angle, float x, float y, float z);
799f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void loadMultiply(const Matrix4& u, const Matrix4& v);
809f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
819f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void loadOrtho(float left, float right, float bottom, float top, float near, float far);
829f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
839f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void multiply(const Matrix4& v) {
849f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        Matrix4 u;
859f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        u.loadMultiply(*this, v);
869f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        load(u);
879f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
889f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
899f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void multiply(float v);
909f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
919f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void translate(float x, float y, float z) {
929f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        Matrix4 u;
939f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        u.loadTranslate(x, y, z);
949f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        multiply(u);
959f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
969f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
979f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void scale(float sx, float sy, float sz) {
989f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        Matrix4 u;
999f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        u.loadScale(sx, sy, sz);
1009f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        multiply(u);
1019f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
10296f60d8f04432a1ed503b3e24d5736d28c63c9a2Glenn Kasten
1039f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void skew(float sx, float sy) {
1049f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        Matrix4 u;
1059f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        u.loadSkew(sx, sy);
1069f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        multiply(u);
1079f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
1089f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1099f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void rotate(float angle, float x, float y, float z) {
1109f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        Matrix4 u;
1119f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        u.loadRotate(angle, x, y, z);
1129f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        multiply(u);
1139f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
1149f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1159f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    bool isPureTranslate() const;
1169f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    bool isSimple() const;
1179f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    bool isIdentity() const;
1189f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1199f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    bool changesBounds() const;
1209f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1219f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void copyTo(float* v) const;
1229f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void copyTo(SkMatrix& v) const;
1239f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1249f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void mapRect(Rect& r) const;
1259f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void mapPoint(float& x, float& y) const;
1269f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1279f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    float getTranslateX();
1289f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    float getTranslateY();
1299f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1309f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    void dump() const;
1319f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1329f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kastenprivate:
1339f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    bool mSimpleMatrix;
1349f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    bool mIsIdentity;
1359f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1369f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    inline float get(int i, int j) const {
1379f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        return data[i * 4 + j];
1389f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
1399f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1409f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    inline void set(int i, int j, float v) {
1419f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten        data[i * 4 + j] = v;
1429f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    }
1439f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten}; // class Matrix4
1449f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1459f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten///////////////////////////////////////////////////////////////////////////////
1469f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten// Types
1479f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten///////////////////////////////////////////////////////////////////////////////
1489f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1499f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kastentypedef Matrix4 mat4;
1509f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1519f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten}; // namespace uirenderer
1529f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten}; // namespace android
1539f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
1549f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten#endif // ANDROID_HWUI_MATRIX_H
1559f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten