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