Matrix.h revision 710f46d9d6a5bf9ea1c1833384caf61e1934124f
1a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten/* 2a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * 4a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * you may not use this file except in compliance with the License. 6a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * You may obtain a copy of the License at 7a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * 8a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * 10a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * See the License for the specific language governing permissions and 14a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten * limitations under the License. 15a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten */ 16a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten 17a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten#ifndef ANDROID_HWUI_MATRIX_H 18a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten#define ANDROID_HWUI_MATRIX_H 19a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten 20a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten#include <SkMatrix.h> 21a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten 229f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten#include <cutils/compiler.h> 239f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 249f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten#include "Rect.h" 25a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten 26a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastennamespace android { 27a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastennamespace uirenderer { 28a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten 2974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten/////////////////////////////////////////////////////////////////////////////// 30d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten// Classes 31a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten/////////////////////////////////////////////////////////////////////////////// 329f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 33a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastenclass ANDROID_API Matrix4 { 34a8190fc518b6769257896605f3aee091aeb60b50Glenn Kastenpublic: 359f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten float data[16]; 369f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 379f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten enum Entry { 389f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kScaleX = 0, 399f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kSkewY = 1, 409f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kPerspective0 = 3, 417db7df0e8d9d7cee8ba374468cdbfa0108e3337cGlenn Kasten kSkewX = 4, 42a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten kScaleY = 5, 439f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kPerspective1 = 7, 44a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten kScaleZ = 10, 459f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kTranslateX = 12, 469f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kTranslateY = 13, 479f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kTranslateZ = 14, 489f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten kPerspective2 = 15 499f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten }; 509f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 519f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4() { 529f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten loadIdentity(); 539f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 549f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 559f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4(const float* v) { 569f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten load(v); 579f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 589f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 599f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4(const Matrix4& v) { 609f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten load(v); 619f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 629f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 639f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4(const SkMatrix& v) { 649f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten load(v); 659f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 669f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 677db7df0e8d9d7cee8ba374468cdbfa0108e3337cGlenn Kasten void loadIdentity(); 689f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 699f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void load(const float* v); 709f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void load(const Matrix4& v); 719f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void load(const SkMatrix& v); 72a8190fc518b6769257896605f3aee091aeb60b50Glenn Kasten 739f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void loadInverse(const Matrix4& v); 749f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 759f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void loadTranslate(float x, float y, float z); 769f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void loadScale(float sx, float sy, float sz); 779f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void loadSkew(float sx, float sy); 789f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void loadRotate(float angle, float x, float y, float z); 799f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void loadMultiply(const Matrix4& u, const Matrix4& v); 809f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 819f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void loadOrtho(float left, float right, float bottom, float top, float near, float far); 829f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 839f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void multiply(const Matrix4& v) { 849f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4 u; 859f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten u.loadMultiply(*this, v); 869f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten load(u); 879f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 889f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 899f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void multiply(float v); 909f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 919f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void translate(float x, float y, float z) { 929f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4 u; 939f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten u.loadTranslate(x, y, z); 949f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten multiply(u); 959f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 969f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 979f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void scale(float sx, float sy, float sz) { 989f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4 u; 999f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten u.loadScale(sx, sy, sz); 1009f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten multiply(u); 1019f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 10296f60d8f04432a1ed503b3e24d5736d28c63c9a2Glenn Kasten 1039f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void skew(float sx, float sy) { 1049f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4 u; 1059f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten u.loadSkew(sx, sy); 1069f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten multiply(u); 1079f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1089f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1099f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void rotate(float angle, float x, float y, float z) { 1109f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten Matrix4 u; 1119f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten u.loadRotate(angle, x, y, z); 1129f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten multiply(u); 1139f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1149f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1159f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten bool isPureTranslate() const; 1169f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten bool isSimple() const; 1179f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten bool isIdentity() const; 1189f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1199f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten bool changesBounds() const; 1209f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1219f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void copyTo(float* v) const; 1229f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void copyTo(SkMatrix& v) const; 1239f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1249f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void mapRect(Rect& r) const; 1259f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void mapPoint(float& x, float& y) const; 1269f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1279f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten float getTranslateX(); 1289f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten float getTranslateY(); 1299f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1309f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten void dump() const; 1319f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1329f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kastenprivate: 1339f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten bool mSimpleMatrix; 1349f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten bool mIsIdentity; 1359f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1369f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten inline float get(int i, int j) const { 1379f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten return data[i * 4 + j]; 1389f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1399f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1409f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten inline void set(int i, int j, float v) { 1419f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten data[i * 4 + j] = v; 1429f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1439f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten}; // class Matrix4 1449f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1459f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten/////////////////////////////////////////////////////////////////////////////// 1469f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten// Types 1479f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten/////////////////////////////////////////////////////////////////////////////// 1489f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1499f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kastentypedef Matrix4 mat4; 1509f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1519f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten}; // namespace uirenderer 1529f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten}; // namespace android 1539f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1549f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten#endif // ANDROID_HWUI_MATRIX_H 1559f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten