Home | History | Annotate | Download | only in Intersection
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #define DEBUG_TEST 1
      9 
     10 #include "Simplify.h"
     11 
     12 namespace SimplifyFindNextTest {
     13 
     14 #include "Simplify.cpp"
     15 
     16 } // end of SimplifyFindNextTest namespace
     17 
     18 #include "Intersection_Tests.h"
     19 
     20 static const SimplifyFindNextTest::Segment* testCommon(
     21         int contourWinding, int spanWinding, int startIndex, int endIndex,
     22         SkTArray<SimplifyFindNextTest::Contour>& contours) {
     23     SkTDArray<SimplifyFindNextTest::Contour*> contourList;
     24     makeContourList(contours, contourList, false, false);
     25     addIntersectTs(contourList[0], contourList[0]);
     26     if (contours.count() > 1) {
     27         SkASSERT(contours.count() == 2);
     28         addIntersectTs(contourList[0], contourList[1]);
     29         addIntersectTs(contourList[1], contourList[1]);
     30     }
     31     fixOtherTIndex(contourList);
     32     SimplifyFindNextTest::Segment& segment = contours[0].debugSegments()[0];
     33     SkPoint pts[2];
     34     pts[0] = segment.xyAtT(&segment.span(endIndex));
     35     int nextStart = startIndex;
     36     int nextEnd = endIndex;
     37     SkTDArray<SimplifyFindNextTest::Span*> chaseArray;
     38     bool unsortable = false;
     39     SimplifyFindNextTest::Segment* next = segment.findNextWinding(chaseArray,
     40             nextStart, nextEnd, unsortable);
     41     pts[1] = next->xyAtT(&next->span(nextStart));
     42     SkASSERT(pts[0] == pts[1]);
     43     return next;
     44 }
     45 
     46 static void test(const SkPath& path) {
     47     SkTArray<SimplifyFindNextTest::Contour> contours;
     48     SimplifyFindNextTest::EdgeBuilder builder(path, contours);
     49     int contourWinding = 0;
     50     int spanWinding = 1;
     51     int start = 0;
     52     int end = 1;
     53     testCommon(contourWinding, spanWinding, start, end, contours);
     54 }
     55 
     56 static void test(const SkPath& path, int start, int end) {
     57     SkTArray<SimplifyFindNextTest::Contour> contours;
     58     SimplifyFindNextTest::EdgeBuilder builder(path, contours);
     59     int contourWinding = 0;
     60     int spanWinding = 1;
     61     testCommon(contourWinding, spanWinding, start, end, contours);
     62 }
     63 
     64 static void testLine1() {
     65     SkPath path;
     66     path.moveTo(2,0);
     67     path.lineTo(1,1);
     68     path.lineTo(0,0);
     69     path.close();
     70     test(path);
     71 }
     72 
     73 static void addInnerCWTriangle(SkPath& path) {
     74     path.moveTo(3,0);
     75     path.lineTo(4,1);
     76     path.lineTo(2,1);
     77     path.close();
     78 }
     79 
     80 #if DEBUG_UNUSED
     81 static void addInnerCCWTriangle(SkPath& path) {
     82     path.moveTo(3,0);
     83     path.lineTo(2,1);
     84     path.lineTo(4,1);
     85     path.close();
     86 }
     87 #endif
     88 
     89 static void addOuterCWTriangle(SkPath& path) {
     90     path.moveTo(3,0);
     91     path.lineTo(6,2);
     92     path.lineTo(0,2);
     93     path.close();
     94 }
     95 
     96 #if DEBUG_UNUSED
     97 static void addOuterCCWTriangle(SkPath& path) {
     98     path.moveTo(3,0);
     99     path.lineTo(0,2);
    100     path.lineTo(6,2);
    101     path.close();
    102 }
    103 #endif
    104 
    105 static void testLine2() {
    106     SkPath path;
    107     addInnerCWTriangle(path);
    108     addOuterCWTriangle(path);
    109     test(path, 0, 3);
    110 }
    111 
    112 static void testLine3() {
    113     SkPath path;
    114     addInnerCWTriangle(path);
    115     addOuterCWTriangle(path);
    116     test(path, 3, 0);
    117 }
    118 
    119 static void testLine4() {
    120     SkPath path;
    121     addInnerCWTriangle(path);
    122     addOuterCWTriangle(path);
    123     test(path, 3, 2);
    124 }
    125 
    126 static void (*tests[])() = {
    127     testLine1,
    128     testLine2,
    129     testLine3,
    130     testLine4,
    131 };
    132 
    133 static const size_t testCount = sizeof(tests) / sizeof(tests[0]);
    134 
    135 static void (*firstTest)() = 0;
    136 static bool skipAll = false;
    137 
    138 void SimplifyFindNext_Test() {
    139     if (skipAll) {
    140         return;
    141     }
    142     size_t index = 0;
    143     if (firstTest) {
    144         while (index < testCount && tests[index] != firstTest) {
    145             ++index;
    146         }
    147     }
    148     bool firstTestComplete = false;
    149     for ( ; index < testCount; ++index) {
    150         (*tests[index])();
    151         firstTestComplete = true;
    152     }
    153 }
    154