OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "PathOpsQuadIntersectionTestData.h" | 7 #include "PathOpsQuadIntersectionTestData.h" |
8 #include "PathOpsTestCommon.h" | 8 #include "PathOpsTestCommon.h" |
9 #include "SkIntersections.h" | 9 #include "SkIntersections.h" |
10 #include "SkPathOpsRect.h" | 10 #include "SkPathOpsRect.h" |
11 #include "SkReduceOrder.h" | 11 #include "SkReduceOrder.h" |
12 #include "Test.h" | 12 #include "Test.h" |
13 | 13 |
14 static void standardTestCases(skiatest::Reporter* reporter) { | 14 static void standardTestCases(skiatest::Reporter* reporter) { |
15 bool showSkipped = false; | 15 bool showSkipped = false; |
16 for (size_t index = 0; index < quadraticTests_count; ++index) { | 16 for (size_t index = 0; index < quadraticTests_count; ++index) { |
17 const SkDQuad& quad1 = quadraticTests[index][0]; | 17 const QuadPts& q1 = quadraticTests[index][0]; |
| 18 SkDQuad quad1; |
| 19 quad1.debugSet(q1.fPts); |
18 SkASSERT(ValidQuad(quad1)); | 20 SkASSERT(ValidQuad(quad1)); |
19 const SkDQuad& quad2 = quadraticTests[index][1]; | 21 const QuadPts& q2 = quadraticTests[index][1]; |
| 22 SkDQuad quad2; |
| 23 quad2.debugSet(q2.fPts); |
20 SkASSERT(ValidQuad(quad2)); | 24 SkASSERT(ValidQuad(quad2)); |
21 SkReduceOrder reduce1, reduce2; | 25 SkReduceOrder reduce1, reduce2; |
22 int order1 = reduce1.reduce(quad1); | 26 int order1 = reduce1.reduce(quad1); |
23 int order2 = reduce2.reduce(quad2); | 27 int order2 = reduce2.reduce(quad2); |
24 if (order1 < 3) { | 28 if (order1 < 3) { |
25 if (showSkipped) { | 29 if (showSkipped) { |
26 SkDebugf("[%d] quad1 order=%d\n", static_cast<int>(index), order
1); | 30 SkDebugf("[%d] quad1 order=%d\n", static_cast<int>(index), order
1); |
27 } | 31 } |
28 } | 32 } |
29 if (order2 < 3) { | 33 if (order2 < 3) { |
(...skipping 15 matching lines...) Expand all Loading... |
45 __FUNCTION__, static_cast<int>(index), pt, tt1,
xy1.fX, xy1.fY, | 49 __FUNCTION__, static_cast<int>(index), pt, tt1,
xy1.fX, xy1.fY, |
46 tt2, xy2.fX, xy2.fY); | 50 tt2, xy2.fX, xy2.fY); |
47 REPORTER_ASSERT(reporter, 0); | 51 REPORTER_ASSERT(reporter, 0); |
48 } | 52 } |
49 } | 53 } |
50 } | 54 } |
51 } | 55 } |
52 } | 56 } |
53 } | 57 } |
54 | 58 |
55 static const SkDQuad testSet[] = { | 59 static const QuadPts testSet[] = { |
56 {{{-0.001019871095195412636, -0.008523519150912761688}, {-0.00539640802890062332
2, -0.005396373569965362549}, {-0.02855382487177848816, -0.02855364233255386353}
}}, | 60 {{{-0.001019871095195412636, -0.008523519150912761688}, {-0.00539640802890062332
2, -0.005396373569965362549}, {-0.02855382487177848816, -0.02855364233255386353}
}}, |
57 {{{-0.004567248281091451645, -0.01482933573424816132}, {-0.01142475008964538574,
-0.01140109263360500336}, {-0.02852955088019371033, -0.02847047336399555206}}}, | 61 {{{-0.004567248281091451645, -0.01482933573424816132}, {-0.01142475008964538574,
-0.01140109263360500336}, {-0.02852955088019371033, -0.02847047336399555206}}}, |
58 | 62 |
59 {{{1, 1}, {0, 2}, {3, 3}}}, | 63 {{{1, 1}, {0, 2}, {3, 3}}}, |
60 {{{3, 0}, {0, 1}, {1, 2}}}, | 64 {{{3, 0}, {0, 1}, {1, 2}}}, |
61 | 65 |
62 {{{0.33333333333333326, 0.81481481481481488}, {0.63395173631977997, 0.6874413672
6313931}, {1.205684411948591, 0.81344322326274499}}}, | 66 {{{0.33333333333333326, 0.81481481481481488}, {0.63395173631977997, 0.6874413672
6313931}, {1.205684411948591, 0.81344322326274499}}}, |
63 {{{0.33333333333333326, 0.81481481481481488}, {0.63396444791444551, 0.6874336836
2444768}, {1.205732763658403, 0.81345617746834109}}}, | 67 {{{0.33333333333333326, 0.81481481481481488}, {0.63396444791444551, 0.6874336836
2444768}, {1.205732763658403, 0.81345617746834109}}}, |
64 | 68 |
65 {{{4981.9990234375, 1590}, {4981.9990234375, 1617.7523193359375}, {4962.375, 163
7.3760986328125}}}, | 69 {{{4981.9990234375, 1590}, {4981.9990234375, 1617.7523193359375}, {4962.375, 163
7.3760986328125}}}, |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 {{{360.048828125, 229.2578125}, {360.048828125, 224.4140625}, {362.607421875
, 221.3671875}}}, | 323 {{{360.048828125, 229.2578125}, {360.048828125, 224.4140625}, {362.607421875
, 221.3671875}}}, |
320 {{{362.607421875, 221.3671875}, {365.166015625, 218.3203125}, {369.228515625
, 218.3203125}}}, | 324 {{{362.607421875, 221.3671875}, {365.166015625, 218.3203125}, {369.228515625
, 218.3203125}}}, |
321 {{{8, 8}, {10, 10}, {8, -10}}}, | 325 {{{8, 8}, {10, 10}, {8, -10}}}, |
322 {{{8, 8}, {12, 12}, {14, 4}}}, | 326 {{{8, 8}, {12, 12}, {14, 4}}}, |
323 {{{8, 8}, {9, 9}, {10, 8}}} | 327 {{{8, 8}, {9, 9}, {10, 8}}} |
324 }; | 328 }; |
325 | 329 |
326 const size_t testSetCount = SK_ARRAY_COUNT(testSet); | 330 const size_t testSetCount = SK_ARRAY_COUNT(testSet); |
327 | 331 |
328 static void oneOffTest1(skiatest::Reporter* reporter, size_t outer, size_t inner
) { | 332 static void oneOffTest1(skiatest::Reporter* reporter, size_t outer, size_t inner
) { |
329 const SkDQuad& quad1 = testSet[outer]; | 333 const QuadPts& q1 = testSet[outer]; |
| 334 SkDQuad quad1; |
| 335 quad1.debugSet(q1.fPts); |
330 SkASSERT(ValidQuad(quad1)); | 336 SkASSERT(ValidQuad(quad1)); |
331 const SkDQuad& quad2 = testSet[inner]; | 337 const QuadPts& q2 = testSet[inner]; |
| 338 SkDQuad quad2; |
| 339 quad2.debugSet(q2.fPts); |
332 SkASSERT(ValidQuad(quad2)); | 340 SkASSERT(ValidQuad(quad2)); |
333 SkIntersections intersections; | 341 SkIntersections intersections; |
334 intersections.intersect(quad1, quad2); | 342 intersections.intersect(quad1, quad2); |
335 for (int pt = 0; pt < intersections.used(); ++pt) { | 343 for (int pt = 0; pt < intersections.used(); ++pt) { |
336 double tt1 = intersections[0][pt]; | 344 double tt1 = intersections[0][pt]; |
337 SkDPoint xy1 = quad1.ptAtT(tt1); | 345 SkDPoint xy1 = quad1.ptAtT(tt1); |
338 double tt2 = intersections[1][pt]; | 346 double tt2 = intersections[1][pt]; |
339 SkDPoint xy2 = quad2.ptAtT(tt2); | 347 SkDPoint xy2 = quad2.ptAtT(tt2); |
340 if (!xy1.approximatelyEqual(xy2)) { | 348 if (!xy1.approximatelyEqual(xy2)) { |
341 SkDebugf("%s [%d,%d] x!= t1=%g (%g,%g) t2=%g (%g,%g)\n", | 349 SkDebugf("%s [%d,%d] x!= t1=%g (%g,%g) t2=%g (%g,%g)\n", |
342 __FUNCTION__, static_cast<int>(outer), static_cast<int>(inne
r), | 350 __FUNCTION__, static_cast<int>(outer), static_cast<int>(inne
r), |
343 tt1, xy1.fX, xy1.fY, tt2, xy2.fX, xy2.fY); | 351 tt1, xy1.fX, xy1.fY, tt2, xy2.fX, xy2.fY); |
344 REPORTER_ASSERT(reporter, 0); | 352 REPORTER_ASSERT(reporter, 0); |
345 } | 353 } |
346 #if ONE_OFF_DEBUG | 354 #if ONE_OFF_DEBUG |
347 SkDebugf("%s [%d][%d] t1=%1.9g (%1.9g, %1.9g) t2=%1.9g\n", __FUNCTION__, | 355 SkDebugf("%s [%d][%d] t1=%1.9g (%1.9g, %1.9g) t2=%1.9g\n", __FUNCTION__, |
348 outer, inner, tt1, xy1.fX, xy1.fY, tt2); | 356 outer, inner, tt1, xy1.fX, xy1.fY, tt2); |
349 #endif | 357 #endif |
350 } | 358 } |
351 } | 359 } |
352 | 360 |
353 static void oneOffTests(skiatest::Reporter* reporter) { | 361 static void oneOffTests(skiatest::Reporter* reporter) { |
354 for (size_t outer = 0; outer < testSetCount - 1; ++outer) { | 362 for (size_t outer = 0; outer < testSetCount - 1; ++outer) { |
355 for (size_t inner = outer + 1; inner < testSetCount; ++inner) { | 363 for (size_t inner = outer + 1; inner < testSetCount; ++inner) { |
356 oneOffTest1(reporter, outer, inner); | 364 oneOffTest1(reporter, outer, inner); |
357 } | 365 } |
358 } | 366 } |
359 } | 367 } |
360 | 368 |
361 static const SkDQuad coincidentTestSet[] = { | 369 static const QuadPts coincidentTestSet[] = { |
362 {{{4914.9990234375, 1523}, {4942.75146484375, 1523}, {4962.375, 1542.6239013
671875}}}, | 370 {{{4914.9990234375, 1523}, {4942.75146484375, 1523}, {4962.375, 1542.6239013
671875}}}, |
363 {{{4962.3759765625, 1542.6239013671875}, {4942.75244140625, 1523}, {4915, 15
23}}}, | 371 {{{4962.3759765625, 1542.6239013671875}, {4942.75244140625, 1523}, {4915, 15
23}}}, |
364 #if 0 | 372 #if 0 |
365 {{{97.9337615966796875,100}, {88,112.94264984130859375}, {88,130}}}, | 373 {{{97.9337615966796875,100}, {88,112.94264984130859375}, {88,130}}}, |
366 {{{88,130}, {88,124.80951690673828125}, {88.91983795166015625,120}}}, | 374 {{{88,130}, {88,124.80951690673828125}, {88.91983795166015625,120}}}, |
367 #endif | 375 #endif |
368 {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
}}, | 376 {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
}}, |
369 {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
}}, | 377 {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
}}, |
370 {{{8, 8}, {10, 10}, {8, -10}}}, | 378 {{{8, 8}, {10, 10}, {8, -10}}}, |
371 {{{8, -10}, {10, 10}, {8, 8}}}, | 379 {{{8, -10}, {10, 10}, {8, 8}}}, |
372 }; | 380 }; |
373 | 381 |
374 static const int coincidentTestSetCount = (int) SK_ARRAY_COUNT(coincidentTestSet
); | 382 static const int coincidentTestSetCount = (int) SK_ARRAY_COUNT(coincidentTestSet
); |
375 | 383 |
376 static void coincidentTestOne(skiatest::Reporter* reporter, int test1, int test2
) { | 384 static void coincidentTestOne(skiatest::Reporter* reporter, int test1, int test2
) { |
377 const SkDQuad& quad1 = coincidentTestSet[test1]; | 385 const QuadPts& q1 = coincidentTestSet[test1]; |
| 386 SkDQuad quad1; |
| 387 quad1.debugSet(q1.fPts); |
378 SkASSERT(ValidQuad(quad1)); | 388 SkASSERT(ValidQuad(quad1)); |
379 const SkDQuad& quad2 = coincidentTestSet[test2]; | 389 const QuadPts& q2 = coincidentTestSet[test2]; |
| 390 SkDQuad quad2; |
| 391 quad2.debugSet(q2.fPts); |
380 SkASSERT(ValidQuad(quad2)); | 392 SkASSERT(ValidQuad(quad2)); |
381 SkIntersections intersections2; | 393 SkIntersections intersections2; |
382 intersections2.intersect(quad1, quad2); | 394 intersections2.intersect(quad1, quad2); |
383 REPORTER_ASSERT(reporter, intersections2.debugCoincidentUsed() >= 2); | 395 REPORTER_ASSERT(reporter, intersections2.debugCoincidentUsed() >= 2); |
384 REPORTER_ASSERT(reporter, intersections2.used() >= 2); | 396 REPORTER_ASSERT(reporter, intersections2.used() >= 2); |
385 for (int pt = 0; pt < intersections2.debugCoincidentUsed(); pt += 2) { | 397 for (int pt = 0; pt < intersections2.debugCoincidentUsed(); pt += 2) { |
386 double tt1 = intersections2[0][pt]; | 398 double tt1 = intersections2[0][pt]; |
387 double tt2 = intersections2[1][pt]; | 399 double tt2 = intersections2[1][pt]; |
388 SkDPoint pt1 = quad1.ptAtT(tt1); | 400 SkDPoint pt1 = quad1.ptAtT(tt1); |
389 SkDPoint pt2 = quad2.ptAtT(tt2); | 401 SkDPoint pt2 = quad2.ptAtT(tt2); |
390 REPORTER_ASSERT(reporter, pt1.approximatelyEqual(pt2)); | 402 REPORTER_ASSERT(reporter, pt1.approximatelyEqual(pt2)); |
391 } | 403 } |
392 } | 404 } |
393 | 405 |
394 static void coincidentTest(skiatest::Reporter* reporter) { | 406 static void coincidentTest(skiatest::Reporter* reporter) { |
395 for (int testIndex = 0; testIndex < coincidentTestSetCount - 1; testIndex +=
2) { | 407 for (int testIndex = 0; testIndex < coincidentTestSetCount - 1; testIndex +=
2) { |
396 coincidentTestOne(reporter, testIndex, testIndex + 1); | 408 coincidentTestOne(reporter, testIndex, testIndex + 1); |
397 } | 409 } |
398 } | 410 } |
399 | 411 |
400 static void intersectionFinder(int test1, int test2) { | 412 static void intersectionFinder(int test1, int test2) { |
401 const SkDQuad& quad1 = testSet[test1]; | 413 const QuadPts& q1 = testSet[test1]; |
402 const SkDQuad& quad2 = testSet[test2]; | 414 const QuadPts& q2 = testSet[test2]; |
403 | 415 SkDQuad quad1, quad2; |
| 416 quad1.debugSet(q1.fPts); |
| 417 quad2.debugSet(q2.fPts); |
404 double t1Seed = 0.5; | 418 double t1Seed = 0.5; |
405 double t2Seed = 0.8; | 419 double t2Seed = 0.8; |
406 double t1Step = 0.1; | 420 double t1Step = 0.1; |
407 double t2Step = 0.1; | 421 double t2Step = 0.1; |
408 SkDPoint t1[3], t2[3]; | 422 SkDPoint t1[3], t2[3]; |
409 bool toggle = true; | 423 bool toggle = true; |
410 do { | 424 do { |
411 t1[0] = quad1.ptAtT(t1Seed - t1Step); | 425 t1[0] = quad1.ptAtT(t1Seed - t1Step); |
412 t1[1] = quad1.ptAtT(t1Seed); | 426 t1[1] = quad1.ptAtT(t1Seed); |
413 t1[2] = quad1.ptAtT(t1Seed + t1Step); | 427 t1[2] = quad1.ptAtT(t1Seed + t1Step); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 | 528 |
515 DEF_TEST(PathOpsQuadBinaryProfile, reporter) { | 529 DEF_TEST(PathOpsQuadBinaryProfile, reporter) { |
516 if (!FLAGS_veryVerbose) { | 530 if (!FLAGS_veryVerbose) { |
517 return; | 531 return; |
518 } | 532 } |
519 SkIntersections intersections; | 533 SkIntersections intersections; |
520 for (int x = 0; x < 100; ++x) { | 534 for (int x = 0; x < 100; ++x) { |
521 int outer = 0; | 535 int outer = 0; |
522 int inner = outer + 1; | 536 int inner = outer + 1; |
523 do { | 537 do { |
524 const SkDQuad& quad1 = testSet[outer]; | 538 const QuadPts& q1 = testSet[outer]; |
525 const SkDQuad& quad2 = testSet[inner]; | 539 SkDQuad quad1; |
| 540 quad1.debugSet(q1.fPts); |
| 541 const QuadPts& q2 = testSet[inner]; |
| 542 SkDQuad quad2; |
| 543 quad2.debugSet(q2.fPts); |
526 (void) intersections.intersect(quad1, quad2); | 544 (void) intersections.intersect(quad1, quad2); |
527 REPORTER_ASSERT(reporter, intersections.used() >= 0); // make sure
code isn't tossed | 545 REPORTER_ASSERT(reporter, intersections.used() >= 0); // make sure
code isn't tossed |
528 inner += 2; | 546 inner += 2; |
529 outer += 2; | 547 outer += 2; |
530 } while (outer < (int) testSetCount); | 548 } while (outer < (int) testSetCount); |
531 } | 549 } |
532 for (int x = 0; x < 100; ++x) { | 550 for (int x = 0; x < 100; ++x) { |
533 for (size_t test = 0; test < quadraticTests_count; ++test) { | 551 for (size_t test = 0; test < quadraticTests_count; ++test) { |
534 const SkDQuad& quad1 = quadraticTests[test][0]; | 552 const QuadPts& q1 = quadraticTests[test][0]; |
535 const SkDQuad& quad2 = quadraticTests[test][1]; | 553 const QuadPts& q2 = quadraticTests[test][1]; |
| 554 SkDQuad quad1, quad2; |
| 555 quad1.debugSet(q1.fPts); |
| 556 quad2.debugSet(q2.fPts); |
536 (void) intersections.intersect(quad1, quad2); | 557 (void) intersections.intersect(quad1, quad2); |
537 REPORTER_ASSERT(reporter, intersections.used() >= 0); // make sure
code isn't tossed | 558 REPORTER_ASSERT(reporter, intersections.used() >= 0); // make sure
code isn't tossed |
538 } | 559 } |
539 } | 560 } |
540 } | 561 } |
OLD | NEW |