EdgeWalkerPolygon4x4_Test.cpp revision d6176b0dcacb124539e0cfd051e6d93a9782f020
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                        }
5624bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                        outputProgress(state, pathStr, SkPath::kWinding_FillType);
5724bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                        testSimplifyx(path, false, out, state, pathStr);
5859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        state.testsRun++;
5959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.setFillType(SkPath::kEvenOdd_FillType);
6059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
6159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        testSimplifyx(path, true, out, state, pathStr);
6259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        state.testsRun++;
63d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    }
64d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
65d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
66d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
6759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
68d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
69d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
70d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
7124bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.comvoid Simplify4x4QuadralateralsThreaded_Test(int& testsRun)
72d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com{
7359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
7459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
7559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 4; // FIXME: 3?
7659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 4;
7759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
7859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testQuadralateral";
7959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
8024bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    int testsStart = testsRun;
81d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 16; ++a) {
82d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a ; b < 16; ++b) {
83d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = b ; c < 16; ++c) {
84d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                for (int d = c; d < 16; ++d) {
8559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testsRun += dispatchTest4(testSimplify4x4QuadralateralsMain,
8659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            a, b, c, d);
87d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
8859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                if (!gRunTestsInOneThread) SkDebugf(".");
89d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
9059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf("%d", b);
91d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
9259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
93d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
9459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
9524bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
96d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
97d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
98d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
99d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4NondegeneratesMain(void* data) {
100d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
10178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
10259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
10359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
10459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
10559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
10659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
10759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
10859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
10959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
11059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
11159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int d = 0; d < 15; ++d) {
11259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dx = d & 0x03;
11359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dy = d >> 2;
11459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int e = d + 1; e < 16; ++e) {
11559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ex = e & 0x03;
11659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ey = e >> 2;
11759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int f = d + 1; f < 16; ++f) {
11859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (e == f) {
11959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
12059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
12159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fx = f & 0x03;
12259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fy = f >> 2;
12359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if ((ex - dx) * (fy - dy) == (ey - dy) * (fx - dx)) {
12459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
12559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
12659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    SkPath path, out;
12759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kWinding_FillType);
12859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(ax, ay);
12959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(bx, by);
13059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(cx, cy);
13159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
13259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(dx, dy);
13359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(ex, ey);
13459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(fx, fy);
13559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
13659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (1) {
13759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        char* str = pathStr;
13859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
13959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
14059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
14159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
14259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
14359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
14459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
14559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
14659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
14724bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    outputProgress(state, pathStr, SkPath::kWinding_FillType);
14824bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    testSimplifyx(path, false, out, state, pathStr);
14959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
15059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kEvenOdd_FillType);
15159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
15259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, true, out, state, pathStr);
15359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
154d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
155d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
156d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
15759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
158d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
159d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
160d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
16124bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.comvoid SimplifyNondegenerate4x4TrianglesThreaded_Test(int& testsRun) {
16259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
16359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
16459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 2;
16559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 2;
16659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
16759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testNondegenerate";
16859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
16924bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    int testsStart = testsRun;
170d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 15; ++a) {
171d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ax = a & 0x03;
172d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ay = a >> 2;
173d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a + 1; b < 16; ++b) {
174d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int bx = b & 0x03;
175d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int by = b >> 2;
176d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = a + 1; c < 16; ++c) {
177d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                if (b == c) {
178d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    continue;
179d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
180d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cx = c & 0x03;
181d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cy = c >> 2;
182d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                if ((bx - ax) * (cy - ay) == (by - ay) * (cx - ax)) {
183d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    continue;
184d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
18559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                testsRun += dispatchTest4(testSimplify4x4NondegeneratesMain,
18659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        a, b, c, 0);
187d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
18859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf(".");
189d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
19059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
191d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
19259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
19324bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
194d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
195d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
196d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4DegeneratesMain(void* data) {
197d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
19878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
19959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
20059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
20159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
20259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
20359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
20459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
20559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
20659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
20759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
20859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int d = 0; d < 16; ++d) {
20959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dx = d & 0x03;
21059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dy = d >> 2;
21159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int e = d ; e < 16; ++e) {
21259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ex = e & 0x03;
21359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ey = e >> 2;
21459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int f = d ; f < 16; ++f) {
21559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fx = f & 0x03;
21659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fy = f >> 2;
21759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (state.d && (ex - dx) * (fy - dy)
21859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            != (ey - dy) * (fx - dx)) {
21959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
22059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
22159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    SkPath path, out;
22259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kWinding_FillType);
22359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(ax, ay);
22459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(bx, by);
22559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(cx, cy);
22659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
22759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(dx, dy);
22859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(ex, ey);
22959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(fx, fy);
23059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
23159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (1) {
23259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        char* str = pathStr;
23359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
23459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
23559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
23659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
23759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
23859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
23959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
24059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
24159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
24224bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    outputProgress(state, pathStr, SkPath::kWinding_FillType);
24324bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    testSimplifyx(path, false, out, state, pathStr);
24459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
24559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kEvenOdd_FillType);
24659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
24759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, true, out, state, pathStr);
24859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
249d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
250d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
251d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
25259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
253d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
254d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
255d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
25624bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.comvoid SimplifyDegenerate4x4TrianglesThreaded_Test(int& testsRun) {
25759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
25859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
25959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 2;
26059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 2;
26159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
26259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testDegenerate";
26359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
26424bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    int testsStart = testsRun;
265d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 16; ++a) {
266d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ax = a & 0x03;
267d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ay = a >> 2;
268d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a ; b < 16; ++b) {
269d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int bx = b & 0x03;
270d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int by = b >> 2;
271d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = a ; c < 16; ++c) {
272d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cx = c & 0x03;
273d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cy = c >> 2;
27459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                bool abcIsATriangle = (bx - ax) * (cy - ay) != (by - ay) * (cx - ax);
27559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                testsRun += dispatchTest4(testSimplify4x4DegeneratesMain,
27659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        a, b, c, abcIsATriangle);
277d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
27859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf(".");
279d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
28059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
281d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
28259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
28324bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
284d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
285d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
286