aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-08-15 20:57:42 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-08-15 20:57:42 +0000
commit439df286c89391f7e46c30d310cce4cb047dcd78 (patch)
tree8790cd30ab0316098205877599d58038880f4306
parent44d662b86a504c1815ba0b73a3b83b599db2eed2 (diff)
fine-tune tolerance for pinchy quads in stroker
BUG= R=jvanverth@google.com Review URL: https://codereview.chromium.org/22947005 git-svn-id: http://skia.googlecode.com/svn/trunk@10753 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--gm/aaclip.cpp21
-rw-r--r--src/core/SkStroke.cpp15
2 files changed, 33 insertions, 3 deletions
diff --git a/gm/aaclip.cpp b/gm/aaclip.cpp
index 48df3a480f..0725ea2d0f 100644
--- a/gm/aaclip.cpp
+++ b/gm/aaclip.cpp
@@ -9,6 +9,26 @@
#include "SkCanvas.h"
#include "SkPath.h"
+static void test_quadstroke(SkCanvas* canvas) {
+ SkPath path;
+ path.moveTo(6, 0);
+ path.quadTo(150, 150, 0, 6);
+
+ SkPaint paint;
+
+ paint.setAntiAlias(true);
+ paint.setStyle(SkPaint::kStroke_Style);
+ canvas->translate(20, 20);
+
+#if 1
+ canvas->drawPath(path, paint);
+ canvas->translate(100, 0);
+#endif
+
+ paint.setStrokeWidth(1.01f);
+ canvas->drawPath(path, paint);
+}
+
static void draw_conic(SkCanvas* canvas, SkScalar weight, const SkPaint& paint) {
SkPath path;
path.moveTo(100, 100);
@@ -253,6 +273,7 @@ protected:
}
virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+ if (false) { test_quadstroke(canvas); return; }
if (false) { test_conic(canvas); return; }
if (false) {
SkRect bounds;
diff --git a/src/core/SkStroke.cpp b/src/core/SkStroke.cpp
index d094ef65b7..2037224733 100644
--- a/src/core/SkStroke.cpp
+++ b/src/core/SkStroke.cpp
@@ -30,9 +30,18 @@ static inline bool normals_too_curvy(const SkVector& norm0, SkVector& norm1) {
}
static inline bool normals_too_pinchy(const SkVector& norm0, SkVector& norm1) {
- static const SkScalar kTooPinchyNormalDotProd = -SK_Scalar1 * 999 / 1000;
-
- return SkPoint::DotProduct(norm0, norm1) <= kTooPinchyNormalDotProd;
+ // if the dot-product is -1, then we are definitely too pinchy. We tweak
+ // that by an epsilon to ensure we have significant bits in our test
+ static const int kMinSigBitsForDot = 8;
+ static const SkScalar kDotEpsilon = FLT_EPSILON * (1 << kMinSigBitsForDot);
+ static const SkScalar kTooPinchyNormalDotProd = kDotEpsilon - 1;
+
+ // just some sanity asserts to help document the expected range
+ SkASSERT(kTooPinchyNormalDotProd >= -1);
+ SkASSERT(kTooPinchyNormalDotProd < SkDoubleToScalar(-0.999));
+
+ SkScalar dot = SkPoint::DotProduct(norm0, norm1);
+ return dot <= kTooPinchyNormalDotProd;
}
static bool set_normal_unitnormal(const SkPoint& before, const SkPoint& after,