19e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com/*
29e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com * Copyright 2012 Google Inc.
39e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com *
49e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be
59e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com * found in the LICENSE file.
69e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com */
7d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com#include "EdgeWalker_Test.h"
8d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com#include "Intersection_Tests.h"
9198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com
10d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4QuadralateralsMain(void* data)
11d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com{
12d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
1378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
1459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
1559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
1659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
1759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
1859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
1959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
2059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
2159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
2259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
2359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int dx = state.d & 0x03;
2459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int dy = state.d >> 2;
2559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int e = 0 ; e < 16; ++e) {
2659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int ex = e & 0x03;
2759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int ey = e >> 2;
2859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int f = e ; f < 16; ++f) {
2959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int fx = f & 0x03;
3059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int fy = f >> 2;
3159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int g = f ; g < 16; ++g) {
3259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int gx = g & 0x03;
3359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int gy = g >> 2;
3459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    for (int h = g ; h < 16; ++h) {
3559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        int hx = h & 0x03;
3659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        int hy = h >> 2;
3759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        SkPath path, out;
3859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.setFillType(SkPath::kWinding_FillType);
3959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.moveTo(ax, ay);
4059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(bx, by);
4159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(cx, cy);
4259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(dx, dy);
4359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.close();
4459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.moveTo(ex, ey);
4559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(fx, fy);
4659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(gx, gy);
4759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.lineTo(hx, hy);
4859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.close();
4959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        if (1) {  // gdb: set print elements 400
5059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            char* str = pathStr;
5159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
5259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
5359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
5459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", dx, dy);
5559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.close();\n");
5659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.moveTo(%d, %d);\n", ex, ey);
5759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
5859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", gx, gy);
5959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.lineTo(%d, %d);\n", hx, hy);
6059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            str += sprintf(str, "    path.close();\n");
6159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        }
6224bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                        outputProgress(state, pathStr, SkPath::kWinding_FillType);
6324bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                        testSimplifyx(path, false, out, state, pathStr);
6459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        state.testsRun++;
6559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        path.setFillType(SkPath::kEvenOdd_FillType);
6659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
6759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        testSimplifyx(path, true, out, state, pathStr);
6859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        state.testsRun++;
69d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    }
70d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
71d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
72d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
7359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
74d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
75d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
76d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
7724bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.comvoid Simplify4x4QuadralateralsThreaded_Test(int& testsRun)
78d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com{
7959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
8059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
8159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 4; // FIXME: 3?
8259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 4;
8359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
8459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testQuadralateral";
8559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
8624bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    int testsStart = testsRun;
87d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 16; ++a) {
88d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a ; b < 16; ++b) {
89d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = b ; c < 16; ++c) {
90d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                for (int d = c; d < 16; ++d) {
9159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testsRun += dispatchTest4(testSimplify4x4QuadralateralsMain,
9259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            a, b, c, d);
93d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
9459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                if (!gRunTestsInOneThread) SkDebugf(".");
95d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
9659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf("%d", b);
97d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
9859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
99d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
10059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
10124bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
102d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
103d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
104d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
105d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4NondegeneratesMain(void* data) {
106d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
10778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
10859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
10959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
11059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
11159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
11259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
11359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
11459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
11559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
11659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
11759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int d = 0; d < 15; ++d) {
11859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dx = d & 0x03;
11959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dy = d >> 2;
12059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int e = d + 1; e < 16; ++e) {
12159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ex = e & 0x03;
12259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ey = e >> 2;
12359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int f = d + 1; f < 16; ++f) {
12459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (e == f) {
12559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
12659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
12759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fx = f & 0x03;
12859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fy = f >> 2;
12959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if ((ex - dx) * (fy - dy) == (ey - dy) * (fx - dx)) {
13059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
13159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
13259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    SkPath path, out;
13359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kWinding_FillType);
13459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(ax, ay);
13559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(bx, by);
13659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(cx, cy);
13759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
13859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(dx, dy);
13959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(ex, ey);
14059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(fx, fy);
14159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
14259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (1) {
14359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        char* str = pathStr;
14459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
14559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
14659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
14759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
14859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
14959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
15059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
15159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
15259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
15324bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    outputProgress(state, pathStr, SkPath::kWinding_FillType);
15424bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    testSimplifyx(path, false, out, state, pathStr);
15559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
15659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kEvenOdd_FillType);
15759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
15859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, true, out, state, pathStr);
15959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
160d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
161d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
162d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
16359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    } while (runNextTestSet(state));
164d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    return NULL;
165d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
166d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
16724bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.comvoid SimplifyNondegenerate4x4TrianglesThreaded_Test(int& testsRun) {
16859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    SkDebugf("%s\n", __FUNCTION__);
16959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#ifdef SK_DEBUG
17059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindSum = 2;
17159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    gDebugMaxWindValue = 2;
17259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com#endif
17359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    const char testStr[] = "testNondegenerate";
17459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    initializeTests(testStr, sizeof(testStr));
17524bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    int testsStart = testsRun;
176d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    for (int a = 0; a < 15; ++a) {
177d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ax = a & 0x03;
178d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        int ay = a >> 2;
179d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        for (int b = a + 1; b < 16; ++b) {
180d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int bx = b & 0x03;
181d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            int by = b >> 2;
182d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            for (int c = a + 1; c < 16; ++c) {
183d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                if (b == c) {
184d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    continue;
185d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
186d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cx = c & 0x03;
187d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                int cy = c >> 2;
188d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                if ((bx - ax) * (cy - ay) == (by - ay) * (cx - ax)) {
189d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                    continue;
190d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com                }
19159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                testsRun += dispatchTest4(testSimplify4x4NondegeneratesMain,
19259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        a, b, c, 0);
193d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com            }
19459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            if (!gRunTestsInOneThread) SkDebugf(".");
195d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com        }
19659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        if (!gRunTestsInOneThread) SkDebugf("\n%d", a);
197d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    }
19859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    testsRun += waitForCompletion();
19924bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
200d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
201d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com
202d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.comstatic void* testSimplify4x4DegeneratesMain(void* data) {
203d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com    SkASSERT(data);
20478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com    State4& state = *(State4*) data;
20559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    char pathStr[1024];
20659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    bzero(pathStr, sizeof(pathStr));
20759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com    do {
20859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ax = state.a & 0x03;
20959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int ay = state.a >> 2;
21059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int bx = state.b & 0x03;
21159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int by = state.b >> 2;
21259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cx = state.c & 0x03;
21359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        int cy = state.c >> 2;
21459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com        for (int d = 0; d < 16; ++d) {
21559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dx = d & 0x03;
21659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            int dy = d >> 2;
21759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com            for (int e = d ; e < 16; ++e) {
21859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ex = e & 0x03;
21959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                int ey = e >> 2;
22059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                for (int f = d ; f < 16; ++f) {
22159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fx = f & 0x03;
22259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    int fy = f >> 2;
22359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (state.d && (ex - dx) * (fy - dy)
22459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                            != (ey - dy) * (fx - dx)) {
22559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        continue;
22659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
22759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    SkPath path, out;
22859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kWinding_FillType);
22959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(ax, ay);
23059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(bx, by);
23159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(cx, cy);
23259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
23359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.moveTo(dx, dy);
23459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(ex, ey);
23559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.lineTo(fx, fy);
23659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.close();
23759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    if (1) {
23859823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        char* str = pathStr;
23959823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", ax, ay);
24059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", bx, by);
24159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", cx, cy);
24259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
24359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.moveTo(%d, %d);\n", dx, dy);
24459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", ex, ey);
24559823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.lineTo(%d, %d);\n", fx, fy);
24659823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                        str += sprintf(str, "    path.close();\n");
24759823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    }
24824bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    outputProgress(state, pathStr, SkPath::kWinding_FillType);
24924bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com                    testSimplifyx(path, false, out, state, pathStr);
25059823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
25159823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    path.setFillType(SkPath::kEvenOdd_FillType);
25259823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
25359823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    testSimplifyx(path, true, out, state, pathStr);
25459823f7f3ba43c7c6bc1fa8c600b093ecb4236aacaryclark@google.com                    state.testsRun++;
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
26224bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.comvoid SimplifyDegenerate4x4TrianglesThreaded_Test(int& testsRun) {
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));
27024bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    int testsStart = testsRun;
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();
28924bec79d6f3d71ff97b50db72461a3892bd4f6b5caryclark@google.com    SkDebugf("%s tests=%d total=%d\n", __FUNCTION__, testsRun - testsStart, testsRun);
290d88e0894d0156f4d427b812fec69bfba3eec7a8dcaryclark@google.com}
291