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
32namespace android {
33
34class Region;
35
36// ---------------------------------------------------------------------------
37
38class Transform
39{
40public:
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
98private:
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