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