/* * 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 "SkMatrix.h" #include "SkMatrix22.h" #include "SkPoint.h" #include "SkScalar.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); }