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

#include "include/core/SkMatrix.h"
#include "include/core/SkPoint.h"
#include "include/core/SkScalar.h"
#include "src/utils/SkMatrix22.h"

void SkComputeGivensRotation(const SkVector& h, SkMatrix* G) {
    const SkScalar& a = h.fX;
    const SkScalar& b = h.fY;
    SkScalar c, s;
    if (0 == b) {
        c = SkScalarCopySign(SK_Scalar1, a);
        s = 0;
        //r = SkScalarAbs(a);
    } else if (0 == a) {
        c = 0;
        s = -SkScalarCopySign(SK_Scalar1, b);
        //r = SkScalarAbs(b);
    } else if (SkScalarAbs(b) > SkScalarAbs(a)) {
        SkScalar t = a / b;
        SkScalar u = SkScalarCopySign(SkScalarSqrt(SK_Scalar1 + t*t), b);
        s = -SK_Scalar1 / u;
        c = -s * t;
        //r = b * u;
    } else {
        SkScalar t = b / a;
        SkScalar u = SkScalarCopySign(SkScalarSqrt(SK_Scalar1 + t*t), a);
        c = SK_Scalar1 / u;
        s = -c * t;
        //r = a * u;
    }

    G->setSinCos(s, c);
}
