19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_TRANSFORM_H 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_TRANSFORM_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Point.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Rect.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26546c21dbfa26939081e903ea346fcb581bddbeb4Mathias Agopian#include <hardware/hardware.h> 27546c21dbfa26939081e903ea346fcb581bddbeb4Mathias Agopian 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Region; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Transform 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transform(); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transform(const Transform& other); 398c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian explicit Transform(uint32_t orientation); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~Transform(); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum orientation_flags { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ROT_0 = 0x00000000, 44546c21dbfa26939081e903ea346fcb581bddbeb4Mathias Agopian FLIP_H = HAL_TRANSFORM_FLIP_H, 45546c21dbfa26939081e903ea346fcb581bddbeb4Mathias Agopian FLIP_V = HAL_TRANSFORM_FLIP_V, 46546c21dbfa26939081e903ea346fcb581bddbeb4Mathias Agopian ROT_90 = HAL_TRANSFORM_ROT_90, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ROT_180 = FLIP_H|FLIP_V, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ROT_270 = ROT_180|ROT_90, 498c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian ROT_INVALID = 0x80 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5244cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian enum type_mask { 5344cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian IDENTITY = 0, 5444cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian TRANSLATE = 0x1, 558c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian ROTATE = 0x2, 568c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian SCALE = 0x4, 578c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian UNKNOWN = 0x8 5844cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian }; 5944cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian 608c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian // query the transform 618c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian bool transformed() const; 628c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian bool preserveRects() const; 638c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian uint32_t getType() const; 648c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian uint32_t getOrientation() const; 658c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian 668c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian float const* operator [] (int i) const; // returns column i 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tx() const; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ty() const; 698c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian 708c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian // modify the transform 71015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian void reset(); 72015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian void set(float tx, float ty); 73015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian void set(float a, float b, float c, float d); 74015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian status_t set(uint32_t flags, float w, float h); 758c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian 768c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian // transform data 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect makeBounds(int w, int h) const; 78e5c0a7b7810092a593ff386843927238c175bdbdMathias Agopian void transform(float* point, int x, int y) const; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region transform(const Region& reg) const; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transform operator * (const Transform& rhs) const; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian // for debugging 83015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian void dump(const char* name) const; 84015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 868c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian struct vec3 { 878c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian float v[3]; 888c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline vec3() { } 898c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline vec3(float a, float b, float c) { 908c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian v[0] = a; v[1] = b; v[2] = c; 918c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian } 928c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline float operator [] (int i) const { return v[i]; } 938c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline float& operator [] (int i) { return v[i]; } 948c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian }; 958c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian struct vec2 { 968c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian float v[2]; 978c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline vec2() { } 988c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline vec2(float a, float b) { 998c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian v[0] = a; v[1] = b; 1008c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian } 1018c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline float operator [] (int i) const { return v[i]; } 1028c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline float& operator [] (int i) { return v[i]; } 1038c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian }; 1048c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian struct mat33 { 1058c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian vec3 v[3]; 1068c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline const vec3& operator [] (int i) const { return v[i]; } 1078c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian inline vec3& operator [] (int i) { return v[i]; } 1088c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian }; 1098c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian 1108c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian enum { UNKNOWN_TYPE = 0x80000000 }; 1118c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian 1128c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian // assumes the last row is < 0 , 0 , 1 > 1138c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian vec2 transform(const vec2& v) const; 1148c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian vec3 transform(const vec3& v) const; 1158c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian Rect transform(const Rect& bounds) const; 1168c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian uint32_t type() const; 1178c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian static bool absIsOne(float f); 1188c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian static bool isZero(float f); 1198c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian 1208c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian mat33 mMatrix; 1218c20ca39c1248bc876ab164b37ae36261c86ad98Mathias Agopian mutable uint32_t mType; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* ANDROID_TRANSFORM_H */ 128