1d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com/*
2d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com * Copyright 2014 Google Inc.
3d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com *
4d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com * Use of this source code is governed by a BSD-style license that can be
5d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com * found in the LICENSE file.
6d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com */
7d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com
8d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com#include "SkMatrix.h"
92cfa3200fda29279eba1240170c7e873d12f9d48commit-bot@chromium.org#include "SkMatrix22.h"
10d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com#include "SkPoint.h"
11d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com#include "SkScalar.h"
12d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com
13d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.comvoid SkComputeGivensRotation(const SkVector& h, SkMatrix* G) {
14d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    const SkScalar& a = h.fX;
15d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    const SkScalar& b = h.fY;
16d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    SkScalar c, s;
17d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    if (0 == b) {
18d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        c = SkScalarCopySign(SK_Scalar1, a);
19d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        s = 0;
20d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        //r = SkScalarAbs(a);
21d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    } else if (0 == a) {
22d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        c = 0;
23d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        s = -SkScalarCopySign(SK_Scalar1, b);
24d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        //r = SkScalarAbs(b);
25d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    } else if (SkScalarAbs(b) > SkScalarAbs(a)) {
26d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        SkScalar t = a / b;
27d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        SkScalar u = SkScalarCopySign(SkScalarSqrt(SK_Scalar1 + t*t), b);
28d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        s = -SK_Scalar1 / u;
29d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        c = -s * t;
30d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        //r = b * u;
31d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    } else {
32d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        SkScalar t = b / a;
33d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        SkScalar u = SkScalarCopySign(SkScalarSqrt(SK_Scalar1 + t*t), a);
34d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        c = SK_Scalar1 / u;
35d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        s = -c * t;
36d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com        //r = a * u;
37d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    }
38d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com
39d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com    G->setSinCos(s, c);
40d3fbd34099a530b5415c95b1f2f8149ac417b9b3bungeman@google.com}
41