Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Unified Diff: src/core/SkStroke.cpp

Issue 1484873003: add more conservative check for wayward divide (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: make test simpler Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gm/strokes.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkStroke.cpp
diff --git a/src/core/SkStroke.cpp b/src/core/SkStroke.cpp
index e04d14aea5adcf84f95f1c83bfd1ad1404702564..c50d599d1ed5184ca50ecf9550354bf01c478827 100644
--- a/src/core/SkStroke.cpp
+++ b/src/core/SkStroke.cpp
@@ -836,14 +836,12 @@ SkPathStroker::ResultType SkPathStroker::intersectRay(SkQuadConstruct* quadPts,
return STROKER_RESULT(kSplit_ResultType, depth, quadPts,
"(numerA=%g >= 0) == (numerB=%g >= 0)", numerA, numerB);
}
- // check to see if the denomerator is teeny relative to the numerator
- bool validDivide = SkScalarAbs(numerA) * SK_ScalarNearlyZero < SkScalarAbs(denom);
-// the divide check is the same as checking if the scaled denom is nearly zero
-// (commented out because on some platforms the two are not bit-identical)
-// SkASSERT(!SkScalarNearlyZero(denom / numerA) == validDivide);
+ // check to see if the denominator is teeny relative to the numerator
+ // if the ratio isn't finite, or if the offset by one will be lost, the ratio is too large
+ numerA /= denom;
+ bool validDivide = SkScalarIsFinite(numerA) && numerA != numerA - 1;
reed1 2015/11/30 21:24:13 nit: is "numerA > (numerA - 1)" clearer? I certain
if (validDivide) {
if (kCtrlPt_RayType == intersectRayType) {
- numerA /= denom;
SkPoint* ctrlPt = &quadPts->fQuad[1];
// the intersection of the tangents need not be on the tangent segment
// so 0 <= numerA <= 1 is not necessarily true
« no previous file with comments | « gm/strokes.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698