diff options
Diffstat (limited to 'src/core/SkPoint.cpp')
-rw-r--r-- | src/core/SkPoint.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/core/SkPoint.cpp b/src/core/SkPoint.cpp index d6e6b318bf..5747504c77 100644 --- a/src/core/SkPoint.cpp +++ b/src/core/SkPoint.cpp @@ -100,16 +100,21 @@ SkScalar SkPoint::Normalize(SkPoint* pt) { #ifdef SK_SCALAR_IS_FLOAT +bool SkPoint::CanNormalize(SkScalar dx, SkScalar dy) { + float mag2 = dx * dx + dy * dy; + return mag2 > SK_ScalarNearlyZero * SK_ScalarNearlyZero; +} + SkScalar SkPoint::Length(SkScalar dx, SkScalar dy) { return sk_float_sqrt(dx * dx + dy * dy); } bool SkPoint::setLength(float x, float y, float length) { - float mag = sk_float_sqrt(x * x + y * y); - if (mag > SK_ScalarNearlyZero) { - length /= mag; - fX = x * length; - fY = y * length; + float mag2 = x * x + y * y; + if (mag2 > SK_ScalarNearlyZero * SK_ScalarNearlyZero) { + float scale = length / sk_float_sqrt(mag2); + fX = x * scale; + fY = y * scale; return true; } return false; @@ -119,6 +124,23 @@ bool SkPoint::setLength(float x, float y, float length) { #include "Sk64.h" +bool SkPoint::CanNormalize(SkScalar dx, SkScalar dy) { + Sk64 tmp1, tmp2, tolSqr; + + tmp1.setMul(dx, dx); + tmp2.setMul(dy, dy); + tmp1.add(tmp2); + + // we want nearlyzero^2, but to compute it fast we want to just do a + // 32bit multiply, so we require that it not exceed 31bits. That is true + // if nearlyzero is <= 0xB504, which should be trivial, since usually + // nearlyzero is a very small fixed-point value. + SkASSERT(SK_ScalarNearlyZero <= 0xB504); + + tolSqr.set(0, SK_ScalarNearlyZero * SK_ScalarNearlyZero); + return tmp1 > tolSqr; +} + SkScalar SkPoint::Length(SkScalar dx, SkScalar dy) { Sk64 tmp1, tmp2; |