validate using nx to match bounds
authorcaryclark <caryclark@google.com>
Wed, 5 Oct 2016 19:16:52 +0000 (12:16 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 5 Oct 2016 19:16:52 +0000 (12:16 -0700)
Check the path against the bounds
using Nx instead of straight scalars,

R=mtklein@google.com
BUG=skia:5541
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2388903006

Review-Url: https://codereview.chromium.org/2388903006

src/core/SkPathRef.cpp
tests/PathOpsOpTest.cpp

index e5efefcceb7c8b319efe065a5aa7ee9db17d8be6..844c40a505b1df9e20daa737f121bd60537f7c98 100644 (file)
@@ -677,6 +677,9 @@ uint8_t SkPathRef::Iter::peek() const {
 }
 
 #ifdef SK_DEBUG
+
+#include "SkNx.h"
+
 void SkPathRef::validate() const {
     SkASSERT(static_cast<ptrdiff_t>(fFreeSpace) >= 0);
     SkASSERT(reinterpret_cast<intptr_t>(fVerbs) - reinterpret_cast<intptr_t>(fPoints) >= 0);
@@ -700,11 +703,13 @@ void SkPathRef::validate() const {
 
     if (!fBoundsIsDirty && !fBounds.isEmpty()) {
         bool isFinite = true;
+        Sk2s leftTop = Sk2s(fBounds.fLeft, fBounds.fTop);
+        Sk2s rightBot = Sk2s(fBounds.fRight, fBounds.fBottom);
         for (int i = 0; i < fPointCnt; ++i) {
+            Sk2s point = Sk2s(fPoints[i].fX, fPoints[i].fY);
 #ifdef SK_DEBUG
             if (fPoints[i].isFinite() &&
-                (fPoints[i].fX < fBounds.fLeft || fPoints[i].fX > fBounds.fRight ||
-                 fPoints[i].fY < fBounds.fTop || fPoints[i].fY > fBounds.fBottom)) {
+                ((point < leftTop).anyTrue() || (point > rightBot).anyTrue())) {
                 SkDebugf("bounds: %f %f %f %f\n",
                          fBounds.fLeft, fBounds.fTop, fBounds.fRight, fBounds.fBottom);
                 for (int j = 0; j < fPointCnt; ++j) {
@@ -717,8 +722,7 @@ void SkPathRef::validate() const {
 #endif
 
             SkASSERT(!fPoints[i].isFinite() ||
-                    (fPoints[i].fX >= fBounds.fLeft && fPoints[i].fX <= fBounds.fRight &&
-                     fPoints[i].fY >= fBounds.fTop && fPoints[i].fY <= fBounds.fBottom));
+                    (!(point < leftTop).anyTrue() && !(point > rightBot).anyTrue()));
             if (!fPoints[i].isFinite()) {
                 isFinite = false;
             }
index b480700d263ab5ee466e7ac58804e9a9b0dfd146..4244fd7caffe50b7989a74add05187a425c2b081 100644 (file)
@@ -6298,10 +6298,6 @@ static void fuzz763_1b(skiatest::Reporter* reporter, const char* filename) {
 }
 
 static void fuzz763_1a(skiatest::Reporter* reporter, const char* filename) {
-// FIXME: fails on Nexus5 by generating a path with points that are not inside the path bounds
-#if DEBUG_UNDER_DEVELOPMENT
-    return;
-#endif
     SkPath path;
     path.setFillType((SkPath::FillType) 0);
     path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0