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