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 #include "EdgeWalker_Test.h"
      8 #include "Intersection_Tests.h"
      9 
     10 static void* testSimplify4x4QuadralateralsMain(void* data)
     11 {
     12     SkASSERT(data);
     13     State4& state = *(State4*) data;
     14     char pathStr[1024];
     15     bzero(pathStr, sizeof(pathStr));
     16     do {
     17         int ax = state.a & 0x03;
     18         int ay = state.a >> 2;
     19         int bx = state.b & 0x03;
     20         int by = state.b >> 2;
     21         int cx = state.c & 0x03;
     22         int cy = state.c >> 2;
     23         int dx = state.d & 0x03;
     24         int dy = state.d >> 2;
     25         for (int e = 0 ; e < 16; ++e) {
     26             int ex = e & 0x03;
     27             int ey = e >> 2;
     28             for (int f = e ; f < 16; ++f) {
     29                 int fx = f & 0x03;
     30                 int fy = f >> 2;
     31                 for (int g = f ; g < 16; ++g) {
     32                     int gx = g & 0x03;
     33                     int gy = g >> 2;
     34                     for (int h = g ; h < 16; ++h) {
     35                         int hx = h & 0x03;
     36                         int hy = h >> 2;
     37                         SkPath path, out;
     38                         path.setFillType(SkPath::kWinding_FillType);
     39                         path.moveTo(ax, ay);
     40                         path.lineTo(bx, by);
     41                         path.lineTo(cx, cy);
     42                         path.lineTo(dx, dy);
     43                         path.close();
     44                         path.moveTo(ex, ey);
     45                         path.lineTo(fx, fy);
     46                         path.lineTo(gx, gy);
     47                         path.lineTo(hx, hy);
     48                         path.close();
     49                         if (1) {  // gdb: set print elements 400
     50                             char* str = pathStr;
     51                             str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
     52                             str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
     53                             str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
     54                             str += sprintf(str, "    path.lineTo(%d, %d);\n", dx, dy);
     55                             str += sprintf(str, "    path.close();\n");
     56                             str += sprintf(str, "    path.moveTo(%d, %d);\n", ex, ey);
     57                             str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
     58                             str += sprintf(str, "    path.lineTo(%d, %d);\n", gx, gy);
     59                             str += sprintf(str, "    path.lineTo(%d, %d);\n", hx, hy);
     60                             str += sprintf(str, "    path.close();\n");
     61                         }
     62                         outputProgress(state, pathStr, SkPath::kWinding_FillType);
     63                         testSimplifyx(path, false, out, state, pathStr);
     64                         state.testsRun++;
     65                         path.setFillType(SkPath::kEvenOdd_FillType);
     66                         outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
     67                         testSimplifyx(path, true, out, state, pathStr);
     68                         state.testsRun++;
     69                     }
     70                 }
     71             }
     72         }
     73     } while (runNextTestSet(state));
     74     return NULL;
     75 }
     76 
     77 void Simplify4x4QuadralateralsThreaded_Test(int& testsRun)
     78 {
     79     SkDebugf("%s\n", __FUNCTION__);
     80 #ifdef SK_DEBUG
     81     gDebugMaxWindSum = 4; // FIXME: 3?
     82     gDebugMaxWindValue = 4;
     83 #endif
     84     const char testStr[] = "testQuadralateral";
     85     initializeTests(testStr, sizeof(testStr));
     86     int testsStart = testsRun;
     87     for (int a = 0; a < 16; ++a) {
     88         for (int b = a ; b < 16; ++b) {
     89             for (int c = b ; c < 16; ++c) {
     90                 for (int d = c; d < 16; ++d) {
     91                     testsRun += dispatchTest4(testSimplify4x4QuadralateralsMain,
     92                             a, b, c, d);
     93                 }
     94                 if (!gRunTestsInOneThread) SkDebugf(".");
     95             }
     96             if (!gRunTestsInOneThread) SkDebugf("%d", b);
     97         }
     98         if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
     99     }
    100     testsRun += waitForCompletion();
    101     SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
    102 }
    103 
    104 
    105 static void* testSimplify4x4NondegeneratesMain(void* data) {
    106     SkASSERT(data);
    107     State4& state = *(State4*) data;
    108     char pathStr[1024];
    109     bzero(pathStr, sizeof(pathStr));
    110     do {
    111         int ax = state.a & 0x03;
    112         int ay = state.a >> 2;
    113         int bx = state.b & 0x03;
    114         int by = state.b >> 2;
    115         int cx = state.c & 0x03;
    116         int cy = state.c >> 2;
    117         for (int d = 0; d < 15; ++d) {
    118             int dx = d & 0x03;
    119             int dy = d >> 2;
    120             for (int e = d + 1; e < 16; ++e) {
    121                 int ex = e & 0x03;
    122                 int ey = e >> 2;
    123                 for (int f = d + 1; f < 16; ++f) {
    124                     if (e == f) {
    125                         continue;
    126                     }
    127                     int fx = f & 0x03;
    128                     int fy = f >> 2;
    129                     if ((ex - dx) * (fy - dy) == (ey - dy) * (fx - dx)) {
    130                         continue;
    131                     }
    132                     SkPath path, out;
    133                     path.setFillType(SkPath::kWinding_FillType);
    134                     path.moveTo(ax, ay);
    135                     path.lineTo(bx, by);
    136                     path.lineTo(cx, cy);
    137                     path.close();
    138                     path.moveTo(dx, dy);
    139                     path.lineTo(ex, ey);
    140                     path.lineTo(fx, fy);
    141                     path.close();
    142                     if (1) {
    143                         char* str = pathStr;
    144                         str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
    145                         str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
    146                         str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
    147                         str += sprintf(str, "    path.close();\n");
    148                         str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
    149                         str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
    150                         str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
    151                         str += sprintf(str, "    path.close();\n");
    152                     }
    153                     outputProgress(state, pathStr, SkPath::kWinding_FillType);
    154                     testSimplifyx(path, false, out, state, pathStr);
    155                     state.testsRun++;
    156                     path.setFillType(SkPath::kEvenOdd_FillType);
    157                     outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
    158                     testSimplifyx(path, true, out, state, pathStr);
    159                     state.testsRun++;
    160                 }
    161             }
    162         }
    163     } while (runNextTestSet(state));
    164     return NULL;
    165 }
    166 
    167 void SimplifyNondegenerate4x4TrianglesThreaded_Test(int& testsRun) {
    168     SkDebugf("%s\n", __FUNCTION__);
    169 #ifdef SK_DEBUG
    170     gDebugMaxWindSum = 2;
    171     gDebugMaxWindValue = 2;
    172 #endif
    173     const char testStr[] = "testNondegenerate";
    174     initializeTests(testStr, sizeof(testStr));
    175     int testsStart = testsRun;
    176     for (int a = 0; a < 15; ++a) {
    177         int ax = a & 0x03;
    178         int ay = a >> 2;
    179         for (int b = a + 1; b < 16; ++b) {
    180             int bx = b & 0x03;
    181             int by = b >> 2;
    182             for (int c = a + 1; c < 16; ++c) {
    183                 if (b == c) {
    184                     continue;
    185                 }
    186                 int cx = c & 0x03;
    187                 int cy = c >> 2;
    188                 if ((bx - ax) * (cy - ay) == (by - ay) * (cx - ax)) {
    189                     continue;
    190                 }
    191                 testsRun += dispatchTest4(testSimplify4x4NondegeneratesMain,
    192                         a, b, c, 0);
    193             }
    194             if (!gRunTestsInOneThread) SkDebugf(".");
    195         }
    196         if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
    197     }
    198     testsRun += waitForCompletion();
    199     SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
    200 }
    201 
    202 static void* testSimplify4x4DegeneratesMain(void* data) {
    203     SkASSERT(data);
    204     State4& state = *(State4*) data;
    205     char pathStr[1024];
    206     bzero(pathStr, sizeof(pathStr));
    207     do {
    208         int ax = state.a & 0x03;
    209         int ay = state.a >> 2;
    210         int bx = state.b & 0x03;
    211         int by = state.b >> 2;
    212         int cx = state.c & 0x03;
    213         int cy = state.c >> 2;
    214         for (int d = 0; d < 16; ++d) {
    215             int dx = d & 0x03;
    216             int dy = d >> 2;
    217             for (int e = d ; e < 16; ++e) {
    218                 int ex = e & 0x03;
    219                 int ey = e >> 2;
    220                 for (int f = d ; f < 16; ++f) {
    221                     int fx = f & 0x03;
    222                     int fy = f >> 2;
    223                     if (state.d && (ex - dx) * (fy - dy)
    224                             != (ey - dy) * (fx - dx)) {
    225                         continue;
    226                     }
    227                     SkPath path, out;
    228                     path.setFillType(SkPath::kWinding_FillType);
    229                     path.moveTo(ax, ay);
    230                     path.lineTo(bx, by);
    231                     path.lineTo(cx, cy);
    232                     path.close();
    233                     path.moveTo(dx, dy);
    234                     path.lineTo(ex, ey);
    235                     path.lineTo(fx, fy);
    236                     path.close();
    237                     if (1) {
    238                         char* str = pathStr;
    239                         str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
    240                         str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
    241                         str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
    242                         str += sprintf(str, "    path.close();\n");
    243                         str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
    244                         str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
    245                         str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
    246                         str += sprintf(str, "    path.close();\n");
    247                     }
    248                     outputProgress(state, pathStr, SkPath::kWinding_FillType);
    249                     testSimplifyx(path, false, out, state, pathStr);
    250                     state.testsRun++;
    251                     path.setFillType(SkPath::kEvenOdd_FillType);
    252                     outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
    253                     testSimplifyx(path, true, out, state, pathStr);
    254                     state.testsRun++;
    255                 }
    256             }
    257         }
    258     } while (runNextTestSet(state));
    259     return NULL;
    260 }
    261 
    262 void SimplifyDegenerate4x4TrianglesThreaded_Test(int& testsRun) {
    263     SkDebugf("%s\n", __FUNCTION__);
    264 #ifdef SK_DEBUG
    265     gDebugMaxWindSum = 2;
    266     gDebugMaxWindValue = 2;
    267 #endif
    268     const char testStr[] = "testDegenerate";
    269     initializeTests(testStr, sizeof(testStr));
    270     int testsStart = testsRun;
    271     for (int a = 0; a < 16; ++a) {
    272         int ax = a & 0x03;
    273         int ay = a >> 2;
    274         for (int b = a ; b < 16; ++b) {
    275             int bx = b & 0x03;
    276             int by = b >> 2;
    277             for (int c = a ; c < 16; ++c) {
    278                 int cx = c & 0x03;
    279                 int cy = c >> 2;
    280                 bool abcIsATriangle = (bx - ax) * (cy - ay) != (by - ay) * (cx - ax);
    281                 testsRun += dispatchTest4(testSimplify4x4DegeneratesMain,
    282                         a, b, c, abcIsATriangle);
    283             }
    284             if (!gRunTestsInOneThread) SkDebugf(".");
    285         }
    286         if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
    287     }
    288     testsRun += waitForCompletion();
    289     SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
    290 }
    291