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