12345678910111213141516171819202122232425262728293031323334353637383940 |
- /*
- * 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);
- }
|