Matrix.h revision 8ce00301a023eecaeb8891ce906f67b513ebb42a
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 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_MATRIX_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_MATRIX_H 1908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 20f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h> 21f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 2271e36aa7db69449e210d0791284cb810a7471c07Romain Guy#include <cutils/compiler.h> 2371e36aa7db69449e210d0791284cb810a7471c07Romain Guy 249d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include "Rect.h" 259d5316e3f56d138504565ff311145ac01621dff4Romain Guy 2608ae317c21ec3086b5017672bba87420cc38a407Romain Guynamespace android { 279d5316e3f56d138504565ff311145ac01621dff4Romain Guynamespace uirenderer { 2808ae317c21ec3086b5017672bba87420cc38a407Romain Guy 2908ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 3008ae317c21ec3086b5017672bba87420cc38a407Romain Guy// Classes 3108ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 3208ae317c21ec3086b5017672bba87420cc38a407Romain Guy 3371e36aa7db69449e210d0791284cb810a7471c07Romain Guyclass ANDROID_API Matrix4 { 3408ae317c21ec3086b5017672bba87420cc38a407Romain Guypublic: 357ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy float data[16]; 36c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 37af28b514964861d81b48902f942f706050936d38Romain Guy enum Entry { 38af28b514964861d81b48902f942f706050936d38Romain Guy kScaleX = 0, 39af28b514964861d81b48902f942f706050936d38Romain Guy kSkewY = 1, 40af28b514964861d81b48902f942f706050936d38Romain Guy kPerspective0 = 3, 41af28b514964861d81b48902f942f706050936d38Romain Guy kSkewX = 4, 42af28b514964861d81b48902f942f706050936d38Romain Guy kScaleY = 5, 43af28b514964861d81b48902f942f706050936d38Romain Guy kPerspective1 = 7, 44af28b514964861d81b48902f942f706050936d38Romain Guy kScaleZ = 10, 45af28b514964861d81b48902f942f706050936d38Romain Guy kTranslateX = 12, 46af28b514964861d81b48902f942f706050936d38Romain Guy kTranslateY = 13, 47af28b514964861d81b48902f942f706050936d38Romain Guy kTranslateZ = 14, 48af28b514964861d81b48902f942f706050936d38Romain Guy kPerspective2 = 15 49af28b514964861d81b48902f942f706050936d38Romain Guy }; 50af28b514964861d81b48902f942f706050936d38Romain Guy 518ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy // NOTE: The flags from kTypeIdentity to kTypePerspective 528ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy // must be kept in sync with the type flags found 538ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy // in SkMatrix 548ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy enum Type { 558ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy kTypeIdentity = 0, 568ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy kTypeTranslate = 0x1, 578ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy kTypeScale = 0x2, 588ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy kTypeAffine = 0x4, 598ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy kTypePerspective = 0x8, 608ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy kTypeRectToRect = 0x10, 618ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy kTypeUnknown = 0x20, 628ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy }; 638ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 648ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy static const int sGeometryMask = 0xf; 658ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 667ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4() { 677ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy loadIdentity(); 687ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 6908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 707ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4(const float* v) { 717ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy load(v); 727ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 7308ae317c21ec3086b5017672bba87420cc38a407Romain Guy 747ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4(const Matrix4& v) { 757ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy load(v); 767ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 7708ae317c21ec3086b5017672bba87420cc38a407Romain Guy 787ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4(const SkMatrix& v) { 797ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy load(v); 807ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 81f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 827ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void loadIdentity(); 8308ae317c21ec3086b5017672bba87420cc38a407Romain Guy 847ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void load(const float* v); 857ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void load(const Matrix4& v); 867ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void load(const SkMatrix& v); 8708ae317c21ec3086b5017672bba87420cc38a407Romain Guy 88079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy void loadInverse(const Matrix4& v); 89079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 907ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void loadTranslate(float x, float y, float z); 917ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void loadScale(float sx, float sy, float sz); 92807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy void loadSkew(float sx, float sy); 938ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void loadRotate(float angle); 947ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void loadRotate(float angle, float x, float y, float z); 957ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void loadMultiply(const Matrix4& u, const Matrix4& v); 9608ae317c21ec3086b5017672bba87420cc38a407Romain Guy 977ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void loadOrtho(float left, float right, float bottom, float top, float near, float far); 9808ae317c21ec3086b5017672bba87420cc38a407Romain Guy 998ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy uint32_t getType() const; 1008ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 1017ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void multiply(const Matrix4& v) { 1027ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4 u; 1037ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy u.loadMultiply(*this, v); 1047ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy load(u); 1057ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 10608ae317c21ec3086b5017672bba87420cc38a407Romain Guy 107ddb80bebb0776e6d852aab6e8bba5d5591847a55Romain Guy void multiply(float v); 108ddb80bebb0776e6d852aab6e8bba5d5591847a55Romain Guy 1097ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void translate(float x, float y, float z) { 1107ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4 u; 1117ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy u.loadTranslate(x, y, z); 1127ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy multiply(u); 1137ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 11408ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1157ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void scale(float sx, float sy, float sz) { 1167ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4 u; 1177ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy u.loadScale(sx, sy, sz); 1187ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy multiply(u); 1197ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 12008ae317c21ec3086b5017672bba87420cc38a407Romain Guy 121807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy void skew(float sx, float sy) { 122807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy Matrix4 u; 123807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy u.loadSkew(sx, sy); 124807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy multiply(u); 125807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy } 126807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 1277ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void rotate(float angle, float x, float y, float z) { 1287ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy Matrix4 u; 1297ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy u.loadRotate(angle, x, y, z); 1307ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy multiply(u); 1317ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 13208ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1338ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 1348ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * If the matrix is identity or translate and/or scale. 1358ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 136710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik bool isSimple() const; 1378ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy bool isPureTranslate() const; 138710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik bool isIdentity() const; 139a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy bool isPerspective() const; 1408ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy bool rectToRect() const; 1416620c6d413f972819fada92b574f0fa9e96d36c1Romain Guy 142710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik bool changesBounds() const; 143e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy 1447ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void copyTo(float* v) const; 1457ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void copyTo(SkMatrix& v) const; 14608ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1477ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void mapRect(Rect& r) const; 1480ba681bce12d522c5575dfccb5a6ca12f0fba746Romain Guy void mapPoint(float& x, float& y) const; 1499d5316e3f56d138504565ff311145ac01621dff4Romain Guy 150bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy float getTranslateX(); 151bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy float getTranslateY(); 152bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 1537ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy void dump() const; 15408ae317c21ec3086b5017672bba87420cc38a407Romain Guy 155f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guyprivate: 1568ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy mutable uint32_t mType; 157af28b514964861d81b48902f942f706050936d38Romain Guy 15808ae317c21ec3086b5017672bba87420cc38a407Romain Guy inline float get(int i, int j) const { 159c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy return data[i * 4 + j]; 16008ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 16108ae317c21ec3086b5017672bba87420cc38a407Romain Guy 16208ae317c21ec3086b5017672bba87420cc38a407Romain Guy inline void set(int i, int j, float v) { 1637ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy data[i * 4 + j] = v; 16408ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 1658ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 1668ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy uint32_t getGeometryType() const; 1678ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 16808ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // class Matrix4 16908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 17008ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 17108ae317c21ec3086b5017672bba87420cc38a407Romain Guy// Types 17208ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 17308ae317c21ec3086b5017672bba87420cc38a407Romain Guy 17408ae317c21ec3086b5017672bba87420cc38a407Romain Guytypedef Matrix4 mat4; 17508ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1769d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer 17708ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // namespace android 17808ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_MATRIX_H 180