Index: src/utils/SkMatrix22.cpp |
=================================================================== |
--- src/utils/SkMatrix22.cpp (revision 0) |
+++ src/utils/SkMatrix22.cpp (working copy) |
@@ -0,0 +1,39 @@ |
+/* |
+ * 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 "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); |
+} |