Matrix.h revision c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6c
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:
33c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy	float data[16];
34c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
3508ae317c21ec3086b5017672bba87420cc38a407Romain Guy	Matrix4() {
3608ae317c21ec3086b5017672bba87420cc38a407Romain Guy		loadIdentity();
3708ae317c21ec3086b5017672bba87420cc38a407Romain Guy	}
3808ae317c21ec3086b5017672bba87420cc38a407Romain Guy
3908ae317c21ec3086b5017672bba87420cc38a407Romain Guy	Matrix4(const float* v) {
4008ae317c21ec3086b5017672bba87420cc38a407Romain Guy		load(v);
4108ae317c21ec3086b5017672bba87420cc38a407Romain Guy	}
4208ae317c21ec3086b5017672bba87420cc38a407Romain Guy
4308ae317c21ec3086b5017672bba87420cc38a407Romain Guy	Matrix4(const Matrix4& v) {
4408ae317c21ec3086b5017672bba87420cc38a407Romain Guy		load(v);
4508ae317c21ec3086b5017672bba87420cc38a407Romain Guy	}
4608ae317c21ec3086b5017672bba87420cc38a407Romain Guy
47f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy	Matrix4(const SkMatrix& v) {
48f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy		load(v);
49f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy	}
50f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
5108ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void loadIdentity();
5208ae317c21ec3086b5017672bba87420cc38a407Romain Guy
5308ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void load(const float* v);
5408ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void load(const Matrix4& v);
55f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy	void load(const SkMatrix& v);
5608ae317c21ec3086b5017672bba87420cc38a407Romain Guy
5708ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void loadTranslate(float x, float y, float z);
5808ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void loadScale(float sx, float sy, float sz);
5908ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void loadRotate(float angle, float x, float y, float z);
6008ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void loadMultiply(const Matrix4& u, const Matrix4& v);
6108ae317c21ec3086b5017672bba87420cc38a407Romain Guy
6208ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void loadOrtho(float left, float right, float bottom, float top, float near, float far);
6308ae317c21ec3086b5017672bba87420cc38a407Romain Guy
6408ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void multiply(const Matrix4& v) {
6508ae317c21ec3086b5017672bba87420cc38a407Romain Guy		Matrix4 u;
6608ae317c21ec3086b5017672bba87420cc38a407Romain Guy		u.loadMultiply(*this, v);
6708ae317c21ec3086b5017672bba87420cc38a407Romain Guy		load(u);
6808ae317c21ec3086b5017672bba87420cc38a407Romain Guy	}
6908ae317c21ec3086b5017672bba87420cc38a407Romain Guy
7008ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void translate(float x, float y, float z) {
7108ae317c21ec3086b5017672bba87420cc38a407Romain Guy		Matrix4 u;
7208ae317c21ec3086b5017672bba87420cc38a407Romain Guy		u.loadTranslate(x, y, z);
7308ae317c21ec3086b5017672bba87420cc38a407Romain Guy		multiply(u);
7408ae317c21ec3086b5017672bba87420cc38a407Romain Guy	}
7508ae317c21ec3086b5017672bba87420cc38a407Romain Guy
7608ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void scale(float sx, float sy, float sz) {
7708ae317c21ec3086b5017672bba87420cc38a407Romain Guy		Matrix4 u;
7808ae317c21ec3086b5017672bba87420cc38a407Romain Guy		u.loadScale(sx, sy, sz);
7908ae317c21ec3086b5017672bba87420cc38a407Romain Guy		multiply(u);
8008ae317c21ec3086b5017672bba87420cc38a407Romain Guy	}
8108ae317c21ec3086b5017672bba87420cc38a407Romain Guy
8208ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void rotate(float angle, float x, float y, float z) {
8308ae317c21ec3086b5017672bba87420cc38a407Romain Guy		Matrix4 u;
8408ae317c21ec3086b5017672bba87420cc38a407Romain Guy		u.loadRotate(angle, x, y, z);
8508ae317c21ec3086b5017672bba87420cc38a407Romain Guy		multiply(u);
8608ae317c21ec3086b5017672bba87420cc38a407Romain Guy	}
8708ae317c21ec3086b5017672bba87420cc38a407Romain Guy
8808ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void copyTo(float* v) const;
89f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy	void copyTo(SkMatrix& v) const;
9008ae317c21ec3086b5017672bba87420cc38a407Romain Guy
919d5316e3f56d138504565ff311145ac01621dff4Romain Guy	void mapRect(Rect& r) const;
929d5316e3f56d138504565ff311145ac01621dff4Romain Guy
9308ae317c21ec3086b5017672bba87420cc38a407Romain Guy	void dump() const;
9408ae317c21ec3086b5017672bba87420cc38a407Romain Guy
95f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guyprivate:
9608ae317c21ec3086b5017672bba87420cc38a407Romain Guy    inline float get(int i, int j) const {
97c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        return data[i * 4 + j];
9808ae317c21ec3086b5017672bba87420cc38a407Romain Guy    }
9908ae317c21ec3086b5017672bba87420cc38a407Romain Guy
10008ae317c21ec3086b5017672bba87420cc38a407Romain Guy    inline void set(int i, int j, float v) {
101c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    	data[i * 4 + j] = v;
10208ae317c21ec3086b5017672bba87420cc38a407Romain Guy    }
10308ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // class Matrix4
10408ae317c21ec3086b5017672bba87420cc38a407Romain Guy
10508ae317c21ec3086b5017672bba87420cc38a407Romain Guy///////////////////////////////////////////////////////////////////////////////
10608ae317c21ec3086b5017672bba87420cc38a407Romain Guy// Types
10708ae317c21ec3086b5017672bba87420cc38a407Romain Guy///////////////////////////////////////////////////////////////////////////////
10808ae317c21ec3086b5017672bba87420cc38a407Romain Guy
10908ae317c21ec3086b5017672bba87420cc38a407Romain Guytypedef Matrix4 mat4;
11008ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1119d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer
11208ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // namespace android
11308ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1149d5316e3f56d138504565ff311145ac01621dff4Romain Guy#endif // ANDROID_UI_MATRIX_H
115