1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkRSXform_DEFINED 9 #define SkRSXform_DEFINED 10 11 #include "SkPoint.h" 12 #include "SkSize.h" 13 14 /** 15 * A compressed form of a rotation+scale matrix. 16 * 17 * [ fSCos -fSSin fTx ] 18 * [ fSSin fSCos fTy ] 19 * [ 0 0 1 ] 20 */ 21 struct SkRSXform { MakeSkRSXform22 static SkRSXform Make(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty) { 23 SkRSXform xform = { scos, ssin, tx, ty }; 24 return xform; 25 } 26 27 /* 28 * Initialize a new xform based on the scale, rotation (in radians), final tx,ty location 29 * and anchor-point ax,ay within the src quad. 30 * 31 * Note: the anchor point is not normalized (e.g. 0...1) but is in pixels of the src image. 32 */ MakeFromRadiansSkRSXform33 static SkRSXform MakeFromRadians(SkScalar scale, SkScalar radians, SkScalar tx, SkScalar ty, 34 SkScalar ax, SkScalar ay) { 35 const SkScalar s = SkScalarSin(radians) * scale; 36 const SkScalar c = SkScalarCos(radians) * scale; 37 return Make(c, s, tx + -c * ax + s * ay, ty + -s * ax - c * ay); 38 } 39 40 SkScalar fSCos; 41 SkScalar fSSin; 42 SkScalar fTx; 43 SkScalar fTy; 44 rectStaysRectSkRSXform45 bool rectStaysRect() const { 46 return 0 == fSCos || 0 == fSSin; 47 } 48 setIdentitySkRSXform49 void setIdentity() { 50 fSCos = 1; 51 fSSin = fTx = fTy = 0; 52 } 53 setSkRSXform54 void set(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty) { 55 fSCos = scos; 56 fSSin = ssin; 57 fTx = tx; 58 fTy = ty; 59 } 60 61 void toQuad(SkScalar width, SkScalar height, SkPoint quad[4]) const; toQuadSkRSXform62 void toQuad(const SkSize& size, SkPoint quad[4]) const { 63 this->toQuad(size.width(), size.height(), quad); 64 } 65 }; 66 67 #endif 68 69