/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkRSXform_DEFINED
#define SkRSXform_DEFINED

#include "include/core/SkPoint.h"
#include "include/core/SkSize.h"

/**
 *  A compressed form of a rotation+scale matrix.
 *
 *  [ fSCos     -fSSin    fTx ]
 *  [ fSSin      fSCos    fTy ]
 *  [     0          0      1 ]
 */
struct SkRSXform {
    static SkRSXform Make(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty) {
        SkRSXform xform = { scos, ssin, tx, ty };
        return xform;
    }

    /*
     *  Initialize a new xform based on the scale, rotation (in radians), final tx,ty location
     *  and anchor-point ax,ay within the src quad.
     *
     *  Note: the anchor point is not normalized (e.g. 0...1) but is in pixels of the src image.
     */
    static SkRSXform MakeFromRadians(SkScalar scale, SkScalar radians, SkScalar tx, SkScalar ty,
                                     SkScalar ax, SkScalar ay) {
        const SkScalar s = SkScalarSin(radians) * scale;
        const SkScalar c = SkScalarCos(radians) * scale;
        return Make(c, s, tx + -c * ax + s * ay, ty + -s * ax - c * ay);
    }

    SkScalar fSCos;
    SkScalar fSSin;
    SkScalar fTx;
    SkScalar fTy;

    bool rectStaysRect() const {
        return 0 == fSCos || 0 == fSSin;
    }

    void setIdentity() {
        fSCos = 1;
        fSSin = fTx = fTy = 0;
    }

    void set(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty) {
        fSCos = scos;
        fSSin = ssin;
        fTx = tx;
        fTy = ty;
    }

    void toQuad(SkScalar width, SkScalar height, SkPoint quad[4]) const;
    void toQuad(const SkSize& size, SkPoint quad[4]) const {
        this->toQuad(size.width(), size.height(), quad);
    }
    void toTriStrip(SkScalar width, SkScalar height, SkPoint strip[4]) const;
};

#endif

