aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-09-07 12:23:41 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-09-07 12:23:41 +0000
commit55b5f4bd6a69e70feeaf6018171882ab9cd250ae (patch)
treec6c81cac1737319a8742973f114728ea18fe96da /src/core
parent11f6380510f40fdf83289976e51962306aac8ce4 (diff)
add SkPoint::CanNormalize to unify decisions about when a vector is degenerate
git-svn-id: http://skia.googlecode.com/svn/trunk@2236 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkPoint.cpp32
-rw-r--r--src/core/SkStroke.cpp2
2 files changed, 28 insertions, 6 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;
diff --git a/src/core/SkStroke.cpp b/src/core/SkStroke.cpp
index 0c858ebe4d..bf3ceac3b7 100644
--- a/src/core/SkStroke.cpp
+++ b/src/core/SkStroke.cpp
@@ -15,7 +15,7 @@
#define kMaxCubicSubdivide 4
static inline bool degenerate_vector(const SkVector& v) {
- return SkScalarNearlyZero(v.fX) && SkScalarNearlyZero(v.fY);
+ return !SkPoint::CanNormalize(v.fX, v.fY);
}
static inline bool degenerate_line(const SkPoint& a, const SkPoint& b,