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