diff options
-rw-r--r-- | gm/aaclip.cpp | 21 | ||||
-rw-r--r-- | src/core/SkStroke.cpp | 15 |
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, |