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