Transform.cpp revision 52e7200b6e020bba978c36e3a928493a3f2c8a92
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
4552e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung ChangTransform::Transform(int32_t flags) {
4652e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang    mTransform.reset();
4752e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang    int sx = (flags & FLIP_H) ? -1 : 1;
4852e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang    int sy = (flags & FLIP_V) ? -1 : 1;
4952e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang    if (flags & ROT_90) {
5052e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang        this->set(0, -sy, sx, 0);
5152e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang    } else {
5252e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang        this->set(sx, 0, 0, sy);
5352e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang    }
5452e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang}
5552e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTransform::~Transform() {
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTransform Transform::operator * (const Transform& rhs) const
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (LIKELY(mType == 0))
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return rhs;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Transform r(*this);
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.mTransform.preConcat(rhs.mTransform);
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.mType |= rhs.mType;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat Transform::operator [] (int i) const
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float r = 0;
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(i) {
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 0: r = SkScalarToFloat( mTransform[SkMatrix::kMScaleX] );  break;
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 1: r = SkScalarToFloat( mTransform[SkMatrix::kMSkewX] );   break;
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 2: r = SkScalarToFloat( mTransform[SkMatrix::kMSkewY] );   break;
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case 3: r = SkScalarToFloat( mTransform[SkMatrix::kMScaleY] );  break;
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint8_t Transform::type() const
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(mType & 0x80000000)) {
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mType = mTransform.getType();
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return uint8_t(mType & 0xFF);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Transform::transformed() const {
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return type() > SkMatrix::kTranslate_Mask;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint Transform::tx() const {
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return SkScalarRound( mTransform[SkMatrix::kMTransX] );
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint Transform::ty() const {
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return SkScalarRound( mTransform[SkMatrix::kMTransY] );
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::reset() {
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.reset();
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mType = 0;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::set( float xx, float xy,
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                     float yx, float yy)
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMScaleX, SkFloatToScalar(xx));
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMSkewX, SkFloatToScalar(xy));
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMSkewY, SkFloatToScalar(yx));
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.set(SkMatrix::kMScaleY, SkFloatToScalar(yy));
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mType |= 0x80000000;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1170d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopianvoid Transform::set(float radian, float x, float y)
1180d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian{
1190d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    float r00 = cosf(radian);    float r01 = -sinf(radian);
1200d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    float r10 = sinf(radian);    float r11 =  cosf(radian);
1210d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMScaleX, SkFloatToScalar(r00));
1220d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMSkewX, SkFloatToScalar(r01));
1230d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMSkewY, SkFloatToScalar(r10));
1240d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMScaleY, SkFloatToScalar(r11));
1250d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMTransX, SkIntToScalar(x - r00*x - r01*y));
1260d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.set(SkMatrix::kMTransY, SkIntToScalar(y - r10*x - r11*y));
1270d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mType |= 0x80000000 | SkMatrix::kTranslate_Mask;
1280d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian}
1290d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian
1300d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopianvoid Transform::scale(float s, float x, float y)
1310d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian{
1320d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mTransform.postScale(s, s, x, y);
1330d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian    mType |= 0x80000000;
1340d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian}
1350d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::set(int tx, int ty)
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (tx | ty) {
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransX, SkIntToScalar(tx));
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransY, SkIntToScalar(ty));
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mType |= SkMatrix::kTranslate_Mask;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransX, 0);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mTransform.set(SkMatrix::kMTransY, 0);
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mType &= ~SkMatrix::kTranslate_Mask;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Transform::transform(GLfixed* point, int x, int y) const
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkPoint s;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.mapXY(SkIntToScalar(x), SkIntToScalar(y), &s);
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    point[0] = SkScalarToFixed(s.fX);
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    point[1] = SkScalarToFixed(s.fY);
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect Transform::makeBounds(int w, int h) const
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect r;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRect d, s;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.mapRect(&d, s);
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.left   = SkScalarRound( d.fLeft );
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.top    = SkScalarRound( d.fTop );
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.right  = SkScalarRound( d.fRight );
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.bottom = SkScalarRound( d.fBottom );
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect Transform::transform(const Rect& bounds) const
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Rect r;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRect d, s;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    s.set(  SkIntToScalar( bounds.left ),
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            SkIntToScalar( bounds.top ),
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            SkIntToScalar( bounds.right ),
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            SkIntToScalar( bounds.bottom ));
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransform.mapRect(&d, s);
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.left   = SkScalarRound( d.fLeft );
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.top    = SkScalarRound( d.fTop );
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.right  = SkScalarRound( d.fRight );
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.bottom = SkScalarRound( d.fBottom );
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return r;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Transform::transform(const Region& reg) const
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region out;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed())) {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (LIKELY(preserveRects())) {
19120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            Region::const_iterator it = reg.begin();
19220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            Region::const_iterator const end = reg.end();
19320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            while (it != end) {
19420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian                out.orSelf(transform(*it++));
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.set(transform(reg.bounds()));
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out = reg.translate(tx(), ty());
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return out;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint32_t Transform::getOrientation() const
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t flags = 0;
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed())) {
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar a = mTransform[SkMatrix::kMScaleX];
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar b = mTransform[SkMatrix::kMSkewX];
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar c = mTransform[SkMatrix::kMSkewY];
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkScalar d = mTransform[SkMatrix::kMScaleY];
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (b==0 && c==0 && a && d) {
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (a<0)    flags |= FLIP_H;
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d<0)    flags |= FLIP_V;
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (b && c && a==0 && d==0) {
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            flags |= ROT_90;
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (b>0)    flags |= FLIP_H;
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c<0)    flags |= FLIP_V;
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            flags = 0x80000000;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Transform::preserveRects() const
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransform.rectStaysRect();
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
235