/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "PathOpsExtendedTest.h"
#include "PathOpsThreadedCommon.h"

static int add_point(char* str, SkScalar x, SkScalar y) {
    int result;
    int asInt = SkScalarRoundToInt(x);
    if (SkIntToScalar(asInt) == x) {
        result = sprintf(str, "%d", asInt);
    } else {
        result = sprintf(str, "%1.9gf", x);
    }
    result += sprintf(str + result, ",");
    asInt = SkScalarRoundToInt(y);
    if (SkIntToScalar(asInt) == y) {
        result += sprintf(str + result, "%d", asInt);
    } else {
        result += sprintf(str + result, "%1.9gf", y);
    }
    return result;
}

static void testOpLoopsMain(PathOpsThreadState* data) {
#if DEBUG_SHOW_TEST_NAME
    strncpy(DEBUG_FILENAME_STRING, "", DEBUG_FILENAME_STRING_LENGTH);
#endif
    SkASSERT(data);
    PathOpsThreadState& state = *data;
    char pathStr[1024];  // gdb: set print elements 400
    bool progress = state.fReporter->verbose(); // FIXME: break out into its own parameter?
    if (progress) {
        sk_bzero(pathStr, sizeof(pathStr));
    }
    for (int a = 0 ; a < 6; ++a) {
        for (int b = a + 1 ; b < 7; ++b) {
            for (int c = 0 ; c < 6; ++c) {
                for (int d = c + 1 ; d < 7; ++d) {
        // define 4 points that form two lines that often cross; one line is (a, b) (c, d)
        SkVector v = {SkIntToScalar(a - c), SkIntToScalar(b - d)};
        SkPoint midA = { SkIntToScalar(a * state.fA + c * (6 - state.fA)) / 6,
                         SkIntToScalar(b * state.fA + d * (6 - state.fA)) / 6 };
        SkPoint midB = { SkIntToScalar(a * state.fB + c * (6 - state.fB)) / 6,
                         SkIntToScalar(b * state.fB + d * (6 - state.fB)) / 6 };
        SkPoint endC = { midA.fX + v.fY * state.fC / 3,
                          midA.fY + v.fX * state.fC / 3 };
        SkPoint endD = { midB.fX - v.fY * state.fD / 3,
                          midB.fY + v.fX * state.fD / 3 };
        SkPath pathA, pathB;
        if (progress) {
            char* str = pathStr;
            const int loopNo = 17;
            str += sprintf(str, "static void loop%d(skiatest::Reporter* reporter,"
                    " const char* filename) {\n", loopNo);
            str += sprintf(str, "    SkPath path, pathB;\n");
            str += sprintf(str, "    path.moveTo(%d,%d);\n", a, b);
            str += sprintf(str, "    path.cubicTo(%d,%d, ", c, d);
            str += add_point(str, endC.fX, endC.fY);
            str += sprintf(str, ", ");
            str += add_point(str, endD.fX, endD.fY);
            str += sprintf(str, ");\n");
            str += sprintf(str, "    path.close();\n");
            str += sprintf(str, "    pathB.moveTo(%d,%d);\n", c, d);
            str += sprintf(str, "    pathB.cubicTo(");
            str += add_point(str, endC.fX, endC.fY);
            str += sprintf(str, ", ");
            str += add_point(str, endD.fX, endD.fY);
            str += sprintf(str, ", %d,%d);\n", a, b);
            str += sprintf(str, "    pathB.close();\n");
            str += sprintf(str, "    testPathOp(reporter, path, pathB, kIntersect_SkPathOp,"
                    " filename);\n");
            str += sprintf(str, "}\n");
        }
        pathA.moveTo(SkIntToScalar(a), SkIntToScalar(b));
        pathA.cubicTo(SkIntToScalar(c), SkIntToScalar(d), endC.fX, endC.fY, endD.fX, endD.fY);
        pathA.close();
        pathB.moveTo(SkIntToScalar(c), SkIntToScalar(d));
        pathB.cubicTo(endC.fX, endC.fY, endD.fX, endD.fY, SkIntToScalar(a), SkIntToScalar(b));
        pathB.close();
//        SkDebugf("%s\n", pathStr);
        if (progress) {
            outputProgress(state.fPathStr, pathStr, kIntersect_SkPathOp);
        }
        testThreadedPathOp(state.fReporter, pathA, pathB, kIntersect_SkPathOp, "loops");
                }
            }
        }
    }
}

DEF_TEST(PathOpsOpLoopsThreaded, reporter) {
    initializeTests(reporter, "loopOp");
    PathOpsThreadedTestRunner testRunner(reporter);
    for (int a = 0; a < 6; ++a) {  // outermost
        for (int b = a + 1; b < 7; ++b) {
            for (int c = 0 ; c < 6; ++c) {
                for (int d = c + 1; d < 7; ++d) {
                    *testRunner.fRunnables.append() = SkNEW_ARGS(PathOpsThreadedRunnable,
                            (&testOpLoopsMain, a, b, c, d, &testRunner));
                }
            }
            if (!reporter->allowExtendedTest()) goto finish;
        }
    }
finish:
    testRunner.render();
    ShowTestArray("loopOp");
}
