Matrix.h revision ddb80bebb0776e6d852aab6e8bba5d5591847a55
108ae317c21ec3086b5017672bba87420cc38a407Romain Guy/*
208ae317c21ec3086b5017672bba87420cc38a407Romain Guy * Copyright (C) 2010 The Android Open Source Project
308ae317c21ec3086b5017672bba87420cc38a407Romain Guy *
408ae317c21ec3086b5017672bba87420cc38a407Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
508ae317c21ec3086b5017672bba87420cc38a407Romain Guy * you may not use this file except in compliance with the License.
608ae317c21ec3086b5017672bba87420cc38a407Romain Guy * You may obtain a copy of the License at
708ae317c21ec3086b5017672bba87420cc38a407Romain Guy *
808ae317c21ec3086b5017672bba87420cc38a407Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
908ae317c21ec3086b5017672bba87420cc38a407Romain Guy *
1008ae317c21ec3086b5017672bba87420cc38a407Romain Guy * Unless required by applicable law or agreed to in writing, software
1108ae317c21ec3086b5017672bba87420cc38a407Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
1208ae317c21ec3086b5017672bba87420cc38a407Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1308ae317c21ec3086b5017672bba87420cc38a407Romain Guy * See the License for the specific language governing permissions and
1408ae317c21ec3086b5017672bba87420cc38a407Romain Guy * limitations under the License.
1508ae317c21ec3086b5017672bba87420cc38a407Romain Guy */
1608ae317c21ec3086b5017672bba87420cc38a407Romain Guy
179d5316e3f56d138504565ff311145ac01621dff4Romain Guy#ifndef ANDROID_UI_MATRIX_H
189d5316e3f56d138504565ff311145ac01621dff4Romain Guy#define ANDROID_UI_MATRIX_H
1908ae317c21ec3086b5017672bba87420cc38a407Romain Guy
20f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h>
21f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
229d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include "Rect.h"
239d5316e3f56d138504565ff311145ac01621dff4Romain Guy
2408ae317c21ec3086b5017672bba87420cc38a407Romain Guynamespace android {
259d5316e3f56d138504565ff311145ac01621dff4Romain Guynamespace uirenderer {
2608ae317c21ec3086b5017672bba87420cc38a407Romain Guy
2708ae317c21ec3086b5017672bba87420cc38a407Romain Guy///////////////////////////////////////////////////////////////////////////////
2808ae317c21ec3086b5017672bba87420cc38a407Romain Guy// Classes
2908ae317c21ec3086b5017672bba87420cc38a407Romain Guy///////////////////////////////////////////////////////////////////////////////
3008ae317c21ec3086b5017672bba87420cc38a407Romain Guy
3108ae317c21ec3086b5017672bba87420cc38a407Romain Guyclass Matrix4 {
3208ae317c21ec3086b5017672bba87420cc38a407Romain Guypublic:
337ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    float data[16];
34c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
35af28b514964861d81b48902f942f706050936d38Romain Guy    enum Entry {
36af28b514964861d81b48902f942f706050936d38Romain Guy        kScaleX = 0,
37af28b514964861d81b48902f942f706050936d38Romain Guy        kSkewY = 1,
38af28b514964861d81b48902f942f706050936d38Romain Guy        kPerspective0 = 3,
39af28b514964861d81b48902f942f706050936d38Romain Guy        kSkewX = 4,
40af28b514964861d81b48902f942f706050936d38Romain Guy        kScaleY = 5,
41af28b514964861d81b48902f942f706050936d38Romain Guy        kPerspective1 = 7,
42af28b514964861d81b48902f942f706050936d38Romain Guy        kScaleZ = 10,
43af28b514964861d81b48902f942f706050936d38Romain Guy        kTranslateX = 12,
44af28b514964861d81b48902f942f706050936d38Romain Guy        kTranslateY = 13,
45af28b514964861d81b48902f942f706050936d38Romain Guy        kTranslateZ = 14,
46af28b514964861d81b48902f942f706050936d38Romain Guy        kPerspective2 = 15
47af28b514964861d81b48902f942f706050936d38Romain Guy    };
48af28b514964861d81b48902f942f706050936d38Romain Guy
497ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Matrix4() {
507ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        loadIdentity();
517ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
5208ae317c21ec3086b5017672bba87420cc38a407Romain Guy
537ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Matrix4(const float* v) {
547ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        load(v);
557ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
5608ae317c21ec3086b5017672bba87420cc38a407Romain Guy
577ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Matrix4(const Matrix4& v) {
587ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        load(v);
597ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
6008ae317c21ec3086b5017672bba87420cc38a407Romain Guy
617ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    Matrix4(const SkMatrix& v) {
627ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        load(v);
637ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
64f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
657ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void loadIdentity();
6608ae317c21ec3086b5017672bba87420cc38a407Romain Guy
677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void load(const float* v);
687ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void load(const Matrix4& v);
697ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void load(const SkMatrix& v);
7008ae317c21ec3086b5017672bba87420cc38a407Romain Guy
71079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy    void loadInverse(const Matrix4& v);
72079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy
737ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void loadTranslate(float x, float y, float z);
747ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void loadScale(float sx, float sy, float sz);
757ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void loadRotate(float angle, float x, float y, float z);
767ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void loadMultiply(const Matrix4& u, const Matrix4& v);
7708ae317c21ec3086b5017672bba87420cc38a407Romain Guy
787ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void loadOrtho(float left, float right, float bottom, float top, float near, float far);
7908ae317c21ec3086b5017672bba87420cc38a407Romain Guy
807ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void multiply(const Matrix4& v) {
817ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        Matrix4 u;
827ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        u.loadMultiply(*this, v);
837ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        load(u);
847ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
8508ae317c21ec3086b5017672bba87420cc38a407Romain Guy
86ddb80bebb0776e6d852aab6e8bba5d5591847a55Romain Guy    void multiply(float v);
87ddb80bebb0776e6d852aab6e8bba5d5591847a55Romain Guy
887ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void translate(float x, float y, float z) {
897ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        Matrix4 u;
907ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        u.loadTranslate(x, y, z);
917ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        multiply(u);
927ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
9308ae317c21ec3086b5017672bba87420cc38a407Romain Guy
947ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void scale(float sx, float sy, float sz) {
957ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        Matrix4 u;
967ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        u.loadScale(sx, sy, sz);
977ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        multiply(u);
987ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
9908ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1007ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void rotate(float angle, float x, float y, float z) {
1017ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        Matrix4 u;
1027ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        u.loadRotate(angle, x, y, z);
1037ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        multiply(u);
1047ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    }
10508ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1067ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void copyTo(float* v) const;
1077ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void copyTo(SkMatrix& v) const;
10808ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1097ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void mapRect(Rect& r) const;
1100ba681bce12d522c5575dfccb5a6ca12f0fba746Romain Guy    void mapPoint(float& x, float& y) const;
1119d5316e3f56d138504565ff311145ac01621dff4Romain Guy
112bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    float getTranslateX();
113bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    float getTranslateY();
114bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
1157ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy    void dump() const;
11608ae317c21ec3086b5017672bba87420cc38a407Romain Guy
117f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guyprivate:
118af28b514964861d81b48902f942f706050936d38Romain Guy    bool mSimpleMatrix;
119af28b514964861d81b48902f942f706050936d38Romain Guy
12008ae317c21ec3086b5017672bba87420cc38a407Romain Guy    inline float get(int i, int j) const {
121c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        return data[i * 4 + j];
12208ae317c21ec3086b5017672bba87420cc38a407Romain Guy    }
12308ae317c21ec3086b5017672bba87420cc38a407Romain Guy
12408ae317c21ec3086b5017672bba87420cc38a407Romain Guy    inline void set(int i, int j, float v) {
1257ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy        data[i * 4 + j] = v;
12608ae317c21ec3086b5017672bba87420cc38a407Romain Guy    }
12708ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // class Matrix4
12808ae317c21ec3086b5017672bba87420cc38a407Romain Guy
12908ae317c21ec3086b5017672bba87420cc38a407Romain Guy///////////////////////////////////////////////////////////////////////////////
13008ae317c21ec3086b5017672bba87420cc38a407Romain Guy// Types
13108ae317c21ec3086b5017672bba87420cc38a407Romain Guy///////////////////////////////////////////////////////////////////////////////
13208ae317c21ec3086b5017672bba87420cc38a407Romain Guy
13308ae317c21ec3086b5017672bba87420cc38a407Romain Guytypedef Matrix4 mat4;
13408ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1359d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer
13608ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // namespace android
13708ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1389d5316e3f56d138504565ff311145ac01621dff4Romain Guy#endif // ANDROID_UI_MATRIX_H
139