aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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,