1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_TRANSFORM_H 18 #define ANDROID_TRANSFORM_H 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 23 #include <ui/Point.h> 24 #include <ui/Rect.h> 25 #include <math/vec2.h> 26 #include <math/vec3.h> 27 28 #include <gui/ISurfaceComposer.h> 29 30 #include <hardware/hardware.h> 31 32 namespace android { 33 34 class Region; 35 36 // --------------------------------------------------------------------------- 37 38 class Transform 39 { 40 public: 41 Transform(); 42 Transform(const Transform& other); 43 explicit Transform(uint32_t orientation); 44 ~Transform(); 45 46 enum orientation_flags { 47 ROT_0 = 0x00000000, 48 FLIP_H = HAL_TRANSFORM_FLIP_H, 49 FLIP_V = HAL_TRANSFORM_FLIP_V, 50 ROT_90 = HAL_TRANSFORM_ROT_90, 51 ROT_180 = FLIP_H|FLIP_V, 52 ROT_270 = ROT_180|ROT_90, 53 ROT_INVALID = 0x80 54 }; 55 56 static orientation_flags fromRotation(ISurfaceComposer::Rotation rotation); 57 58 enum type_mask { 59 IDENTITY = 0, 60 TRANSLATE = 0x1, 61 ROTATE = 0x2, 62 SCALE = 0x4, 63 UNKNOWN = 0x8 64 }; 65 66 // query the transform 67 bool preserveRects() const; 68 uint32_t getType() const; 69 uint32_t getOrientation() const; 70 71 const vec3& operator [] (size_t i) const; // returns column i 72 float tx() const; 73 float ty() const; 74 75 // modify the transform 76 void reset(); 77 void set(float tx, float ty); 78 void set(float a, float b, float c, float d); 79 status_t set(uint32_t flags, float w, float h); 80 81 // transform data 82 Rect makeBounds(int w, int h) const; 83 vec2 transform(int x, int y) const; 84 Region transform(const Region& reg) const; 85 Rect transform(const Rect& bounds, 86 bool roundOutwards = false) const; 87 FloatRect transform(const FloatRect& bounds) const; 88 Transform operator * (const Transform& rhs) const; 89 // assumes the last row is < 0 , 0 , 1 > 90 vec2 transform(const vec2& v) const; 91 vec3 transform(const vec3& v) const; 92 93 Transform inverse() const; 94 95 // for debugging 96 void dump(const char* name) const; 97 98 private: 99 struct mat33 { 100 vec3 v[3]; 101 inline const vec3& operator [] (int i) const { return v[i]; } 102 inline vec3& operator [] (int i) { return v[i]; } 103 }; 104 105 enum { UNKNOWN_TYPE = 0x80000000 }; 106 107 uint32_t type() const; 108 static bool absIsOne(float f); 109 static bool isZero(float f); 110 111 mat33 mMatrix; 112 mutable uint32_t mType; 113 }; 114 115 // --------------------------------------------------------------------------- 116 }; // namespace android 117 118 #endif /* ANDROID_TRANSFORM_H */ 119