| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 #include "PathOpsTestCommon.h" | 7 #include "PathOpsTestCommon.h" |
| 8 #include "SkIntersections.h" | 8 #include "SkIntersections.h" |
| 9 #include "SkPathOpsCubic.h" | 9 #include "SkPathOpsCubic.h" |
| 10 #include "SkPathOpsLine.h" | 10 #include "SkPathOpsLine.h" |
| 11 #include "SkPathOpsQuad.h" | 11 #include "SkPathOpsQuad.h" |
| 12 #include "SkRandom.h" | 12 #include "SkRandom.h" |
| 13 #include "SkReduceOrder.h" | 13 #include "SkReduceOrder.h" |
| 14 #include "Test.h" | 14 #include "Test.h" |
| 15 | 15 |
| 16 static bool gPathOpsCubicLineIntersectionIdeasVerbose = false; | 16 static bool gPathOpsCubicLineIntersectionIdeasVerbose = false; |
| 17 | 17 |
| 18 static struct CubicLineFailures { | 18 static struct CubicLineFailures { |
| 19 SkDCubic c; | 19 CubicPts c; |
| 20 double t; | 20 double t; |
| 21 SkDPoint p; | 21 SkDPoint p; |
| 22 } cubicLineFailures[] = { | 22 } cubicLineFailures[] = { |
| 23 {{{{-164.3726806640625, 36.826904296875}, {-189.045166015625, -953.222045898
4375}, | 23 {{{{-164.3726806640625, 36.826904296875}, {-189.045166015625, -953.222045898
4375}, |
| 24 {926.505859375, -897.36175537109375}, {-139.33489990234375, 204.40771484
375}}}, | 24 {926.505859375, -897.36175537109375}, {-139.33489990234375, 204.40771484
375}}}, |
| 25 0.37329583, {107.54935269006289, -632.13736293162208}}, | 25 0.37329583, {107.54935269006289, -632.13736293162208}}, |
| 26 {{{{784.056884765625, -554.8350830078125}, {67.5489501953125, 509.0224609375
}, | 26 {{{{784.056884765625, -554.8350830078125}, {67.5489501953125, 509.0224609375
}, |
| 27 {-447.713134765625, 751.375}, {415.7784423828125, 172.22265625}}}, | 27 {-447.713134765625, 751.375}, {415.7784423828125, 172.22265625}}}, |
| 28 0.660005242, {-32.973148967736151, 478.01341797403569}}, | 28 0.660005242, {-32.973148967736151, 478.01341797403569}}, |
| 29 {{{{-580.6834716796875, -127.044921875}, {-872.8983154296875, -945.543029785
15625}, | 29 {{{{-580.6834716796875, -127.044921875}, {-872.8983154296875, -945.543029785
15625}, |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 return; | 138 return; |
| 139 } | 139 } |
| 140 SkRandom ran; | 140 SkRandom ran; |
| 141 double worstStep[256] = {0}; | 141 double worstStep[256] = {0}; |
| 142 int errors = 0; | 142 int errors = 0; |
| 143 int iters = 0; | 143 int iters = 0; |
| 144 double smallestR2 = 0; | 144 double smallestR2 = 0; |
| 145 double largestR2 = 0; | 145 double largestR2 = 0; |
| 146 for (int index = 0; index < 1000000000; ++index) { | 146 for (int index = 0; index < 1000000000; ++index) { |
| 147 SkDPoint origin = {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 10
00)}; | 147 SkDPoint origin = {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 10
00)}; |
| 148 SkDCubic cubic = {{origin, | 148 CubicPts cuPts = {{origin, |
| 149 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}, | 149 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}, |
| 150 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}, | 150 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}, |
| 151 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)} | 151 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)} |
| 152 }}; | 152 }}; |
| 153 // construct a line at a known intersection | 153 // construct a line at a known intersection |
| 154 double t = ran.nextRangeF(0, 1); | 154 double t = ran.nextRangeF(0, 1); |
| 155 SkDCubic cubic; |
| 156 cubic.debugSet(cuPts.fPts); |
| 155 SkDPoint pt = cubic.ptAtT(t); | 157 SkDPoint pt = cubic.ptAtT(t); |
| 156 // skip answers with no intersections (although note the bug!) or two, o
r more | 158 // skip answers with no intersections (although note the bug!) or two, o
r more |
| 157 // see if the line / cubic has a fun range of roots | 159 // see if the line / cubic has a fun range of roots |
| 158 double A, B, C, D; | 160 double A, B, C, D; |
| 159 SkDCubic::Coefficients(&cubic[0].fY, &A, &B, &C, &D); | 161 SkDCubic::Coefficients(&cubic[0].fY, &A, &B, &C, &D); |
| 160 D -= pt.fY; | 162 D -= pt.fY; |
| 161 double allRoots[3] = {0}, validRoots[3] = {0}; | 163 double allRoots[3] = {0}, validRoots[3] = {0}; |
| 162 int realRoots = SkDCubic::RootsReal(A, B, C, D, allRoots); | 164 int realRoots = SkDCubic::RootsReal(A, B, C, D, allRoots); |
| 163 int valid = SkDQuad::AddValidTs(allRoots, realRoots, validRoots); | 165 int valid = SkDQuad::AddValidTs(allRoots, realRoots, validRoots); |
| 164 if (valid != 1) { | 166 if (valid != 1) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 int worstLimit = SK_ARRAY_COUNT(worstStep); | 243 int worstLimit = SK_ARRAY_COUNT(worstStep); |
| 242 while (worstStep[--worstLimit] == 0) ; | 244 while (worstStep[--worstLimit] == 0) ; |
| 243 for (int idx2 = 0; idx2 <= worstLimit; ++idx2) { | 245 for (int idx2 = 0; idx2 <= worstLimit; ++idx2) { |
| 244 SkDebugf("%1.9g ", worstStep[idx2]); | 246 SkDebugf("%1.9g ", worstStep[idx2]); |
| 245 } | 247 } |
| 246 SkDebugf("\n"); | 248 SkDebugf("\n"); |
| 247 SkDebugf("smallestR2=%1.9g largestR2=%1.9g\n", smallestR2, largestR2); | 249 SkDebugf("smallestR2=%1.9g largestR2=%1.9g\n", smallestR2, largestR2); |
| 248 } | 250 } |
| 249 | 251 |
| 250 static double testOneFailure(const CubicLineFailures& failure) { | 252 static double testOneFailure(const CubicLineFailures& failure) { |
| 251 const SkDCubic& cubic = failure.c; | 253 const CubicPts& c = failure.c; |
| 254 SkDCubic cubic; |
| 255 cubic.debugSet(c.fPts); |
| 252 const SkDPoint& pt = failure.p; | 256 const SkDPoint& pt = failure.p; |
| 253 double A, B, C, D; | 257 double A, B, C, D; |
| 254 SkDCubic::Coefficients(&cubic[0].fY, &A, &B, &C, &D); | 258 SkDCubic::Coefficients(&cubic[0].fY, &A, &B, &C, &D); |
| 255 D -= pt.fY; | 259 D -= pt.fY; |
| 256 double allRoots[3] = {0}, validRoots[3] = {0}; | 260 double allRoots[3] = {0}, validRoots[3] = {0}; |
| 257 int realRoots = SkDCubic::RootsReal(A, B, C, D, allRoots); | 261 int realRoots = SkDCubic::RootsReal(A, B, C, D, allRoots); |
| 258 int valid = SkDQuad::AddValidTs(allRoots, realRoots, validRoots); | 262 int valid = SkDQuad::AddValidTs(allRoots, realRoots, validRoots); |
| 259 SkASSERT_RELEASE(valid == 1); | 263 SkASSERT_RELEASE(valid == 1); |
| 260 SkASSERT_RELEASE(realRoots != 1); | 264 SkASSERT_RELEASE(realRoots != 1); |
| 261 double t = validRoots[0]; | 265 double t = validRoots[0]; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 274 SkASSERT_RELEASE(newT >= 0); | 278 SkASSERT_RELEASE(newT >= 0); |
| 275 } | 279 } |
| 276 } | 280 } |
| 277 | 281 |
| 278 DEF_TEST(PathOpsCubicLineOneFailure, reporter) { | 282 DEF_TEST(PathOpsCubicLineOneFailure, reporter) { |
| 279 return; // disable for now | 283 return; // disable for now |
| 280 const CubicLineFailures& failure = cubicLineFailures[1]; | 284 const CubicLineFailures& failure = cubicLineFailures[1]; |
| 281 double newT = testOneFailure(failure); | 285 double newT = testOneFailure(failure); |
| 282 SkASSERT_RELEASE(newT >= 0); | 286 SkASSERT_RELEASE(newT >= 0); |
| 283 } | 287 } |
| OLD | NEW |