EdgeWalkerPolygon4x4_Test.cpp revision 59823f7f3ba43c7c6bc1fa8c600b093ecb4236aa
1d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com#include "EdgeWalker_Test.h"
2d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com#include "Intersection_Tests.h"
3198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com
4d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4QuadralateralsMain(void* data)
5d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com{
6d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
1059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
1159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
1259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
1359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
1459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
1559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
1659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
1759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int dx = state.d & 0x03;
1859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int dy = state.d >> 2;
1959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int e = 0 ; e < 16; ++e) {
2059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int ex = e & 0x03;
2159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int ey = e >> 2;
2259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int f = e ; f < 16; ++f) {
2359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int fx = f & 0x03;
2459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int fy = f >> 2;
2559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int g = f ; g < 16; ++g) {
2659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int gx = g & 0x03;
2759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int gy = g >> 2;
2859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    for (int h = g ; h < 16; ++h) {
2959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        int hx = h & 0x03;
3059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        int hy = h >> 2;
3159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        SkPath path, out;
3259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.setFillType(SkPath::kWinding_FillType);
3359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.moveTo(ax, ay);
3459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(bx, by);
3559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(cx, cy);
3659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(dx, dy);
3759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.close();
3859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.moveTo(ex, ey);
3959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(fx, fy);
4059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(gx, gy);
4159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(hx, hy);
4259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.close();
4359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        if (1) {  // gdb: set print elements 400
4459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            char* str = pathStr;
4559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
4659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
4759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
4859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", dx, dy);
4959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.close();\n");
5059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.moveTo(%d, %d);\n", ex, ey);
5159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
5259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", gx, gy);
5359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", hx, hy);
5459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.close();\n");
5559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        }
5659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        outputProgress(state, pathStr);
5759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        testSimplifyx(path, out, state, pathStr);
5859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        state.testsRun++;
5959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                #if 0 // FIXME: enable once we have support for even/odd
6059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.setFillType(SkPath::kEvenOdd_FillType);
6159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
6259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        testSimplifyx(path, true, out, state, pathStr);
6359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        state.testsRun++;
6459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                #endif
65d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    }
66d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
67d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
68d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
6959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
70d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
71d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
72d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
73d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comvoid Simplify4x4QuadralateralsThreaded_Test()
74d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com{
7559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
7659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
7759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 4; // FIXME: 3?
7859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 4;
7959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
8059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testQuadralateral";
8159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
8259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    int testsRun = 0;
83d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 16; ++a) {
84d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a ; b < 16; ++b) {
85d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = b ; c < 16; ++c) {
86d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                for (int d = c; d < 16; ++d) {
8759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testsRun += dispatchTest4(testSimplify4x4QuadralateralsMain,
8859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            a, b, c, d);
89d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
9059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                if (!gRunTestsInOneThread) SkDebugf(".");
91d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
9259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf("%d", b);
93d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
9459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
95d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
9659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
9759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s total tests run=%d\n", __FUNCTION__, testsRun);
98d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
99d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
100d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
101d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4NondegeneratesMain(void* data) {
102d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
10378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
10459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
10559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
10659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
10759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
10859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
10959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
11059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
11159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
11259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
11359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int d = 0; d < 15; ++d) {
11459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dx = d & 0x03;
11559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dy = d >> 2;
11659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int e = d + 1; e < 16; ++e) {
11759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ex = e & 0x03;
11859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ey = e >> 2;
11959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int f = d + 1; f < 16; ++f) {
12059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (e == f) {
12159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
12259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
12359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fx = f & 0x03;
12459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fy = f >> 2;
12559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if ((ex - dx) * (fy - dy) == (ey - dy) * (fx - dx)) {
12659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
12759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
12859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    SkPath path, out;
12959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kWinding_FillType);
13059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(ax, ay);
13159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(bx, by);
13259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(cx, cy);
13359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
13459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(dx, dy);
13559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(ex, ey);
13659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(fx, fy);
13759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
13859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (1) {
13959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        char* str = pathStr;
14059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
14159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
14259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
14359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
14459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
14559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
14659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
14759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
14859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
14959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr);
15059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, out, state, pathStr);
15159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
15259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            #if 0 // FIXME: enable once we have support for even/odd
15359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kEvenOdd_FillType);
15459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
15559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, true, out, state, pathStr);
15659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
15759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            #endif
158d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
159d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
160d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
16159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
162d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
163d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
164d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
165d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comvoid SimplifyNondegenerate4x4TrianglesThreaded_Test() {
16659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
16759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
16859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 2;
16959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 2;
17059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
17159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testNondegenerate";
17259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
17359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    int testsRun = 0;
174d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 15; ++a) {
175d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ax = a & 0x03;
176d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ay = a >> 2;
177d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a + 1; b < 16; ++b) {
178d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int bx = b & 0x03;
179d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int by = b >> 2;
180d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = a + 1; c < 16; ++c) {
181d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                if (b == c) {
182d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    continue;
183d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
184d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cx = c & 0x03;
185d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cy = c >> 2;
186d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                if ((bx - ax) * (cy - ay) == (by - ay) * (cx - ax)) {
187d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    continue;
188d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
18959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                testsRun += dispatchTest4(testSimplify4x4NondegeneratesMain,
19059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        a, b, c, 0);
191d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
19259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf(".");
193d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
19459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
195d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
19659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
19759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s total tests run=%d\n", __FUNCTION__, testsRun);
198d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
199d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
200d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4DegeneratesMain(void* data) {
201d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
20278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
20359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
20459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
20559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
20659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
20759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
20859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
20959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
21059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
21159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
21259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int d = 0; d < 16; ++d) {
21359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dx = d & 0x03;
21459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dy = d >> 2;
21559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int e = d ; e < 16; ++e) {
21659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ex = e & 0x03;
21759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ey = e >> 2;
21859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int f = d ; f < 16; ++f) {
21959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fx = f & 0x03;
22059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fy = f >> 2;
22159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (state.d && (ex - dx) * (fy - dy)
22259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            != (ey - dy) * (fx - dx)) {
22359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
22459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
22559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    SkPath path, out;
22659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kWinding_FillType);
22759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(ax, ay);
22859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(bx, by);
22959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(cx, cy);
23059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
23159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(dx, dy);
23259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(ex, ey);
23359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(fx, fy);
23459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
23559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (1) {
23659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        char* str = pathStr;
23759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
23859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
23959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
24059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
24159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
24259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
24359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
24459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
24559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
24659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr);
24759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, out, state, pathStr);
24859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
24959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            #if 0 // FIXME: enable once we have support for even/odd
25059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kEvenOdd_FillType);
25159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
25259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, true, out, state, pathStr);
25359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
25459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            #endif
255d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
256d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
257d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
25859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
259d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
260d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
261d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
262d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comvoid SimplifyDegenerate4x4TrianglesThreaded_Test() {
26359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
26459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
26559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 2;
26659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 2;
26759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
26859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testDegenerate";
26959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
27059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    int testsRun = 0;
271d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 16; ++a) {
272d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ax = a & 0x03;
273d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ay = a >> 2;
274d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a ; b < 16; ++b) {
275d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int bx = b & 0x03;
276d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int by = b >> 2;
277d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = a ; c < 16; ++c) {
278d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cx = c & 0x03;
279d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cy = c >> 2;
28059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                bool abcIsATriangle = (bx - ax) * (cy - ay) != (by - ay) * (cx - ax);
28159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                testsRun += dispatchTest4(testSimplify4x4DegeneratesMain,
28259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        a, b, c, abcIsATriangle);
283d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
28459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf(".");
285d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
28659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
287d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
28859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
28959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s total tests run=%d\n", __FUNCTION__, testsRun);
290d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
291d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
292