1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #include "PathOpsExtendedTest.h" 8 #include "PathOpsThreadedCommon.h" 9 10 static void testOpCubicsMain(PathOpsThreadState* data) 11 { 12 #if DEBUG_SHOW_TEST_NAME 13 strncpy(DEBUG_FILENAME_STRING, "", DEBUG_FILENAME_STRING_LENGTH); 14 #endif 15 SkASSERT(data); 16 PathOpsThreadState& state = *data; 17 char pathStr[1024]; // gdb: set print elements 400 18 bool progress = state.fReporter->verbose(); // FIXME: break out into its own parameter? 19 if (progress) { 20 sk_bzero(pathStr, sizeof(pathStr)); 21 } 22 for (int a = 0 ; a < 6; ++a) { 23 for (int b = a + 1 ; b < 7; ++b) { 24 for (int c = 0 ; c < 6; ++c) { 25 for (int d = c + 1 ; d < 7; ++d) { 26 for (int e = SkPath::kWinding_FillType ; e <= SkPath::kEvenOdd_FillType; ++e) { 27 for (int f = SkPath::kWinding_FillType ; f <= SkPath::kEvenOdd_FillType; ++f) { 28 SkPath pathA, pathB; 29 if (progress) { 30 char* str = pathStr; 31 str += sprintf(str, " path.setFillType(SkPath::k%s_FillType);\n", 32 e == SkPath::kWinding_FillType ? "Winding" : e == SkPath::kEvenOdd_FillType 33 ? "EvenOdd" : "?UNDEFINED"); 34 str += sprintf(str, " path.moveTo(%d,%d);\n", state.fA, state.fB); 35 str += sprintf(str, " path.cubicTo(%d,%d, %d,%d, %d,%d);\n", state.fC, state.fD, 36 b, a, d, c); 37 str += sprintf(str, " path.close();\n"); 38 str += sprintf(str, " pathB.setFillType(SkPath::k%s_FillType);\n", 39 f == SkPath::kWinding_FillType ? "Winding" : f == SkPath::kEvenOdd_FillType 40 ? "EvenOdd" : "?UNDEFINED"); 41 str += sprintf(str, " pathB.moveTo(%d,%d);\n", a, b); 42 str += sprintf(str, " pathB.cubicTo(%d,%d, %d,%d, %d,%d);\n", c, d, 43 state.fB, state.fA, state.fD, state.fC); 44 str += sprintf(str, " pathB.close();\n"); 45 } 46 pathA.setFillType((SkPath::FillType) e); 47 pathA.moveTo(SkIntToScalar(state.fA), SkIntToScalar(state.fB)); 48 pathA.cubicTo(SkIntToScalar(state.fC), SkIntToScalar(state.fD), SkIntToScalar(b), 49 SkIntToScalar(a), SkIntToScalar(d), SkIntToScalar(c)); 50 pathA.close(); 51 pathB.setFillType((SkPath::FillType) f); 52 pathB.moveTo(SkIntToScalar(a), SkIntToScalar(b)); 53 pathB.cubicTo(SkIntToScalar(c), SkIntToScalar(d), SkIntToScalar(state.fB), 54 SkIntToScalar(state.fA), SkIntToScalar(state.fD), SkIntToScalar(state.fC)); 55 pathB.close(); 56 for (int op = 0 ; op <= kXOR_PathOp; ++op) { 57 if (progress) { 58 outputProgress(state.fPathStr, pathStr, (SkPathOp) op); 59 } 60 testThreadedPathOp(state.fReporter, pathA, pathB, (SkPathOp) op); 61 } 62 } 63 } 64 } 65 } 66 } 67 } 68 } 69 70 static void PathOpsOpCubicsThreadedTest(skiatest::Reporter* reporter) 71 { 72 int threadCount = initializeTests(reporter, "cubicOp"); 73 PathOpsThreadedTestRunner testRunner(reporter, threadCount); 74 for (int a = 0; a < 6; ++a) { // outermost 75 for (int b = a + 1; b < 7; ++b) { 76 for (int c = 0 ; c < 6; ++c) { 77 for (int d = c + 1; d < 7; ++d) { 78 *testRunner.fRunnables.append() = SkNEW_ARGS(PathOpsThreadedRunnable, 79 (&testOpCubicsMain, a, b, c, d, &testRunner)); 80 } 81 } 82 if (!reporter->allowExtendedTest()) goto finish; 83 } 84 } 85 finish: 86 testRunner.render(); 87 } 88 89 #include "TestClassDef.h" 90 DEFINE_TESTCLASS_SHORT(PathOpsOpCubicsThreadedTest) 91