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 */ 21struct SkRSXform { 22 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 */ 33 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 45 bool rectStaysRect() const { 46 return 0 == fSCos || 0 == fSSin; 47 } 48 49 void setIdentity() { 50 fSCos = 1; 51 fSSin = fTx = fTy = 0; 52 } 53 54 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; 62 void toQuad(const SkSize& size, SkPoint quad[4]) const { 63 this->toQuad(size.width(), size.height(), quad); 64 } 65 void toTriStrip(SkScalar width, SkScalar height, SkPoint strip[4]) const; 66}; 67 68#endif 69 70