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