Line data Source code
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 {
22 0 : static SkRSXform Make(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty) {
23 0 : SkRSXform xform = { scos, ssin, tx, ty };
24 0 : 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 0 : static SkRSXform MakeFromRadians(SkScalar scale, SkScalar radians, SkScalar tx, SkScalar ty,
34 : SkScalar ax, SkScalar ay) {
35 0 : const SkScalar s = SkScalarSin(radians) * scale;
36 0 : const SkScalar c = SkScalarCos(radians) * scale;
37 0 : 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 : };
66 :
67 : #endif
68 :
|