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 8 #include "PathOpsExtendedTest.h" 9 #include "PathOpsThreadedCommon.h" 10 #include "SkMacros.h" 11 #include "SkString.h" 12 13 // four rects, of four sizes 14 // for 3 smaller sizes, tall, wide 15 // top upper mid lower bottom aligned (3 bits, 5 values) 16 // same with x (3 bits, 5 values) 17 // not included, square, tall, wide (2 bits) 18 // cw or ccw (1 bit) 19 20 static void testSimplify4x4RectsMain(PathOpsThreadState* data) 21 { 22 SkASSERT(data); 23 PathOpsThreadState& state = *data; 24 int aShape = state.fA & 0x03; 25 SkPath::Direction aCW = state.fA >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 26 int bShape = state.fB & 0x03; 27 SkPath::Direction bCW = state.fB >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 28 int cShape = state.fC & 0x03; 29 SkPath::Direction cCW = state.fC >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 30 int dShape = state.fD & 0x03; 31 SkPath::Direction dCW = state.fD >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 32 for (int aXAlign = 0; aXAlign < 5; ++aXAlign) { 33 for (int aYAlign = 0; aYAlign < 5; ++aYAlign) { 34 for (int bXAlign = 0; bXAlign < 5; ++bXAlign) { 35 for (int bYAlign = 0; bYAlign < 5; ++bYAlign) { 36 for (int cXAlign = 0; cXAlign < 5; ++cXAlign) { 37 for (int cYAlign = 0; cYAlign < 5; ++cYAlign) { 38 for (int dXAlign = 0; dXAlign < 5; ++dXAlign) { 39 for (int dYAlign = 0; dYAlign < 5; ++dYAlign) { 40 SkString pathStr; 41 SkPath path, out; 42 path.setFillType(SkPath::kWinding_FillType); 43 int l SK_INIT_TO_AVOID_WARNING, t SK_INIT_TO_AVOID_WARNING, 44 r SK_INIT_TO_AVOID_WARNING, b SK_INIT_TO_AVOID_WARNING; 45 if (aShape) { 46 switch (aShape) { 47 case 1: // square 48 l = 0; r = 60; 49 t = 0; b = 60; 50 aXAlign = 5; 51 aYAlign = 5; 52 break; 53 case 2: 54 l = aXAlign * 12; 55 r = l + 30; 56 t = 0; b = 60; 57 aYAlign = 5; 58 break; 59 case 3: 60 l = 0; r = 60; 61 t = aYAlign * 12; 62 b = l + 30; 63 aXAlign = 5; 64 break; 65 } 66 path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 67 aCW); 68 if (state.fReporter->verbose()) { 69 pathStr.appendf(" path.addRect(%d, %d, %d, %d," 70 " SkPath::kC%sW_Direction);\n", l, t, r, b, aCW ? "C" : ""); 71 } 72 } else { 73 aXAlign = 5; 74 aYAlign = 5; 75 } 76 if (bShape) { 77 switch (bShape) { 78 case 1: // square 79 l = bXAlign * 10; 80 r = l + 20; 81 t = bYAlign * 10; 82 b = l + 20; 83 break; 84 case 2: 85 l = bXAlign * 10; 86 r = l + 20; 87 t = 10; b = 40; 88 bYAlign = 5; 89 break; 90 case 3: 91 l = 10; r = 40; 92 t = bYAlign * 10; 93 b = l + 20; 94 bXAlign = 5; 95 break; 96 } 97 path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 98 bCW); 99 if (state.fReporter->verbose()) { 100 pathStr.appendf(" path.addRect(%d, %d, %d, %d," 101 " SkPath::kC%sW_Direction);\n", l, t, r, b, bCW ? "C" : ""); 102 } 103 } else { 104 bXAlign = 5; 105 bYAlign = 5; 106 } 107 if (cShape) { 108 switch (cShape) { 109 case 1: // square 110 l = cXAlign * 6; 111 r = l + 12; 112 t = cYAlign * 6; 113 b = l + 12; 114 break; 115 case 2: 116 l = cXAlign * 6; 117 r = l + 12; 118 t = 20; b = 30; 119 cYAlign = 5; 120 break; 121 case 3: 122 l = 20; r = 30; 123 t = cYAlign * 6; 124 b = l + 20; 125 cXAlign = 5; 126 break; 127 } 128 path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 129 cCW); 130 if (state.fReporter->verbose()) { 131 pathStr.appendf(" path.addRect(%d, %d, %d, %d," 132 " SkPath::kC%sW_Direction);\n", l, t, r, b, cCW ? "C" : ""); 133 } 134 } else { 135 cXAlign = 5; 136 cYAlign = 5; 137 } 138 if (dShape) { 139 switch (dShape) { 140 case 1: // square 141 l = dXAlign * 4; 142 r = l + 9; 143 t = dYAlign * 4; 144 b = l + 9; 145 break; 146 case 2: 147 l = dXAlign * 6; 148 r = l + 9; 149 t = 32; b = 36; 150 dYAlign = 5; 151 break; 152 case 3: 153 l = 32; r = 36; 154 t = dYAlign * 6; 155 b = l + 9; 156 dXAlign = 5; 157 break; 158 } 159 path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 160 dCW); 161 if (state.fReporter->verbose()) { 162 pathStr.appendf(" path.addRect(%d, %d, %d, %d," 163 " SkPath::kC%sW_Direction);\n", l, t, r, b, dCW ? "C" : ""); 164 } 165 } else { 166 dXAlign = 5; 167 dYAlign = 5; 168 } 169 path.close(); 170 if (state.fReporter->verbose()) { 171 state.outputProgress(pathStr.c_str(), SkPath::kWinding_FillType); 172 } 173 testSimplify(path, false, out, state, pathStr.c_str()); 174 if (state.fReporter->verbose()) { 175 state.outputProgress(pathStr.c_str(), SkPath::kEvenOdd_FillType); 176 } 177 testSimplify(path, true, out, state, pathStr.c_str()); 178 } 179 } 180 } 181 } 182 } 183 } 184 } 185 } 186 } 187 188 DEF_TEST(PathOpsSimplifyRectsThreaded, reporter) { 189 initializeTests(reporter, "testLine"); 190 PathOpsThreadedTestRunner testRunner(reporter); 191 for (int a = 0; a < 8; ++a) { // outermost 192 for (int b = a ; b < 8; ++b) { 193 for (int c = b ; c < 8; ++c) { 194 for (int d = c; d < 8; ++d) { 195 *testRunner.fRunnables.append() = new PathOpsThreadedRunnable( 196 &testSimplify4x4RectsMain, a, b, c, d, &testRunner); 197 } 198 if (!reporter->allowExtendedTest()) goto finish; 199 } 200 } 201 } 202 finish: 203 testRunner.render(); 204 } 205