Transform.cpp revision 20f68782a4ea71c6a977d7f87d8288d3daa265ec
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <private/pixelflinger/ggl_fixed.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h"
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTransform::Transform()
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mType(0)
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.reset();
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTransform::Transform(const Transform&  other)
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mTransform(other.mTransform), mType(other.mType)
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTransform::~Transform() {
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTransform Transform::operator * (const Transform& rhs) const
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (LIKELY(mType == 0))
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return rhs;
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Transform r(*this);
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.mTransform.preConcat(rhs.mTransform);
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.mType |= rhs.mType;
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat Transform::operator [] (int i) const
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float r = 0;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(i) {
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 0: r = SkScalarToFloat( mTransform[SkMatrix::kMScaleX] );  break;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 1: r = SkScalarToFloat( mTransform[SkMatrix::kMSkewX] );   break;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 2: r = SkScalarToFloat( mTransform[SkMatrix::kMSkewY] );   break;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 3: r = SkScalarToFloat( mTransform[SkMatrix::kMScaleY] );  break;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint8_t Transform::type() const
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(mType & 0x80000000)) {
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mType = mTransform.getType();
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return uint8_t(mType & 0xFF);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Transform::transformed() const {
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return type() > SkMatrix::kTranslate_Mask;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint Transform::tx() const {
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return SkScalarRound( mTransform[SkMatrix::kMTransX] );
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint Transform::ty() const {
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return SkScalarRound( mTransform[SkMatrix::kMTransY] );
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::reset() {
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.reset();
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mType = 0;
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::set( float xx, float xy,
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                     float yx, float yy)
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMScaleX, SkFloatToScalar(xx));
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMSkewX, SkFloatToScalar(xy));
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMSkewY, SkFloatToScalar(yx));
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMScaleY, SkFloatToScalar(yy));
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mType |= 0x80000000;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1060d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopianvoid Transform::set(float radian, float x, float y)
1070d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian{
1080d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    float r00 = cosf(radian);    float r01 = -sinf(radian);
1090d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    float r10 = sinf(radian);    float r11 =  cosf(radian);
1100d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMScaleX, SkFloatToScalar(r00));
1110d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMSkewX, SkFloatToScalar(r01));
1120d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMSkewY, SkFloatToScalar(r10));
1130d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMScaleY, SkFloatToScalar(r11));
1140d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMTransX, SkIntToScalar(x - r00*x - r01*y));
1150d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMTransY, SkIntToScalar(y - r10*x - r11*y));
1160d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mType |= 0x80000000 | SkMatrix::kTranslate_Mask;
1170d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian}
1180d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian
1190d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopianvoid Transform::scale(float s, float x, float y)
1200d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian{
1210d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.postScale(s, s, x, y);
1220d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mType |= 0x80000000;
1230d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian}
1240d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::set(int tx, int ty)
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (tx | ty) {
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransX, SkIntToScalar(tx));
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransY, SkIntToScalar(ty));
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mType |= SkMatrix::kTranslate_Mask;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransX, 0);
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransY, 0);
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mType &= ~SkMatrix::kTranslate_Mask;
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::transform(GLfixed* point, int x, int y) const
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkPoint s;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.mapXY(SkIntToScalar(x), SkIntToScalar(y), &s);
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    point[0] = SkScalarToFixed(s.fX);
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    point[1] = SkScalarToFixed(s.fY);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect Transform::makeBounds(int w, int h) const
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect r;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRect d, s;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.mapRect(&d, s);
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.left   = SkScalarRound( d.fLeft );
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.top    = SkScalarRound( d.fTop );
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.right  = SkScalarRound( d.fRight );
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.bottom = SkScalarRound( d.fBottom );
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect Transform::transform(const Rect& bounds) const
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect r;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRect d, s;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s.set(  SkIntToScalar( bounds.left ),
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            SkIntToScalar( bounds.top ),
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            SkIntToScalar( bounds.right ),
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            SkIntToScalar( bounds.bottom ));
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.mapRect(&d, s);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.left   = SkScalarRound( d.fLeft );
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.top    = SkScalarRound( d.fTop );
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.right  = SkScalarRound( d.fRight );
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.bottom = SkScalarRound( d.fBottom );
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Transform::transform(const Region& reg) const
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region out;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed())) {
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (LIKELY(preserveRects())) {
18020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            Region::const_iterator it = reg.begin();
18120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            Region::const_iterator const end = reg.end();
18220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            while (it != end) {
18320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian                out.orSelf(transform(*it++));
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.set(transform(reg.bounds()));
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out = reg.translate(tx(), ty());
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return out;
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint32_t Transform::getOrientation() const
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t flags = 0;
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed())) {
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar a = mTransform[SkMatrix::kMScaleX];
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar b = mTransform[SkMatrix::kMSkewX];
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar c = mTransform[SkMatrix::kMSkewY];
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar d = mTransform[SkMatrix::kMScaleY];
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (b==0 && c==0 && a && d) {
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (a<0)    flags |= FLIP_H;
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d<0)    flags |= FLIP_V;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (b && c && a==0 && d==0) {
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            flags |= ROT_90;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (b>0)    flags |= FLIP_H;
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c<0)    flags |= FLIP_V;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            flags = 0x80000000;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Transform::preserveRects() const
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransform.rectStaysRect();
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
224