Transform.h revision 81bac09fa6b01dd1495644d9c825c3666762fced
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 26namespace android { 27 28class Region; 29 30// --------------------------------------------------------------------------- 31 32class Transform 33{ 34public: 35 Transform(); 36 Transform(const Transform& other); 37 explicit Transform(uint32_t orientation); 38 ~Transform(); 39 40 // FIXME: must match OVERLAY_TRANSFORM_*, pull from hardware.h 41 enum orientation_flags { 42 ROT_0 = 0x00000000, 43 FLIP_H = 0x00000001, 44 FLIP_V = 0x00000002, 45 ROT_90 = 0x00000004, 46 ROT_180 = FLIP_H|FLIP_V, 47 ROT_270 = ROT_180|ROT_90, 48 ROT_INVALID = 0x80 49 }; 50 51 enum type_mask { 52 IDENTITY = 0, 53 TRANSLATE = 0x1, 54 ROTATE = 0x2, 55 SCALE = 0x4, 56 UNKNOWN = 0x8 57 }; 58 59 // query the transform 60 bool transformed() const; 61 bool preserveRects() const; 62 uint32_t getType() const; 63 uint32_t getOrientation() const; 64 65 float const* operator [] (int i) const; // returns column i 66 int tx() const; 67 int ty() const; 68 69 // modify the transform 70 void reset(); 71 void set(float tx, float ty); 72 void set(float a, float b, float c, float d); 73 status_t set(uint32_t flags, float w, float h); 74 75 // transform data 76 Rect makeBounds(int w, int h) const; 77 void transform(float* point, int x, int y) const; 78 Region transform(const Region& reg) const; 79 Transform operator * (const Transform& rhs) const; 80 81 // for debugging 82 void dump(const char* name) const; 83 84private: 85 struct vec3 { 86 float v[3]; 87 inline vec3() { } 88 inline vec3(float a, float b, float c) { 89 v[0] = a; v[1] = b; v[2] = c; 90 } 91 inline float operator [] (int i) const { return v[i]; } 92 inline float& operator [] (int i) { return v[i]; } 93 }; 94 struct vec2 { 95 float v[2]; 96 inline vec2() { } 97 inline vec2(float a, float b) { 98 v[0] = a; v[1] = b; 99 } 100 inline float operator [] (int i) const { return v[i]; } 101 inline float& operator [] (int i) { return v[i]; } 102 }; 103 struct mat33 { 104 vec3 v[3]; 105 inline const vec3& operator [] (int i) const { return v[i]; } 106 inline vec3& operator [] (int i) { return v[i]; } 107 }; 108 109 enum { UNKNOWN_TYPE = 0x80000000 }; 110 111 // assumes the last row is < 0 , 0 , 1 > 112 vec2 transform(const vec2& v) const; 113 vec3 transform(const vec3& v) const; 114 Rect transform(const Rect& bounds) const; 115 uint32_t type() const; 116 static bool absIsOne(float f); 117 static bool isZero(float f); 118 119 mat33 mMatrix; 120 mutable uint32_t mType; 121}; 122 123// --------------------------------------------------------------------------- 124}; // namespace android 125 126#endif /* ANDROID_TRANSFORM_H */ 127