17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/* 27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2012 Google Inc. 37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * 47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file. 67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "PathOpsExtendedTest.h" 87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "PathOpsThreadedCommon.h" 97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// four rects, of four sizes 117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// for 3 smaller sizes, tall, wide 127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // top upper mid lower bottom aligned (3 bits, 5 values) 137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // same with x (3 bits, 5 values) 147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// not included, square, tall, wide (2 bits) 157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// cw or ccw (1 bit) 167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void testSimplify4x4RectsMain(PathOpsThreadState* data) 187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger{ 197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkASSERT(data); 207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger PathOpsThreadState& state = *data; 217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger char pathStr[1024]; // gdb: set print elements 400 2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool progress = state.fReporter->verbose(); // FIXME: break out into its own parameter? 2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (progress) { 2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger sk_bzero(pathStr, sizeof(pathStr)); 2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int aShape = state.fA & 0x03; 277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkPath::Direction aCW = state.fA >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int bShape = state.fB & 0x03; 297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkPath::Direction bCW = state.fB >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int cShape = state.fC & 0x03; 317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkPath::Direction cCW = state.fC >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int dShape = state.fD & 0x03; 337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkPath::Direction dCW = state.fD >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int aXAlign = 0; aXAlign < 5; ++aXAlign) { 357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int aYAlign = 0; aYAlign < 5; ++aYAlign) { 367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int bXAlign = 0; bXAlign < 5; ++bXAlign) { 377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int bYAlign = 0; bYAlign < 5; ++bYAlign) { 387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int cXAlign = 0; cXAlign < 5; ++cXAlign) { 397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int cYAlign = 0; cYAlign < 5; ++cYAlign) { 407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int dXAlign = 0; dXAlign < 5; ++dXAlign) { 417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int dYAlign = 0; dYAlign < 5; ++dYAlign) { 427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkPath path, out; 437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger char* str = pathStr; 447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger path.setFillType(SkPath::kWinding_FillType); 457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int l, t, r, b; 467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (aShape) { 477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger switch (aShape) { 487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 1: // square 497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = 0; r = 60; 507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = 0; b = 60; 517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger aXAlign = 5; 527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger aYAlign = 5; 537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 2: 557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = aXAlign * 12; 567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger r = l + 30; 577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = 0; b = 60; 587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger aYAlign = 5; 597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 3: 617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = 0; r = 60; 627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = aYAlign * 12; 637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger b = l + 30; 647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger aXAlign = 5; 657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger aCW); 6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (progress) { 7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger str += sprintf(str, " path.addRect(%d, %d, %d, %d," 7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger " SkPath::kC%sW_Direction);\n", l, t, r, b, aCW ? "C" : ""); 7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } else { 747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger aXAlign = 5; 757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger aYAlign = 5; 767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (bShape) { 787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger switch (bShape) { 797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 1: // square 807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = bXAlign * 10; 817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger r = l + 20; 827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = bYAlign * 10; 837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger b = l + 20; 847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 2: 867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = bXAlign * 10; 877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger r = l + 20; 887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = 10; b = 40; 897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bYAlign = 5; 907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 3: 927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = 10; r = 40; 937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = bYAlign * 10; 947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger b = l + 20; 957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bXAlign = 5; 967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bCW); 10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (progress) { 10158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger str += sprintf(str, " path.addRect(%d, %d, %d, %d," 10258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger " SkPath::kC%sW_Direction);\n", l, t, r, b, bCW ? "C" : ""); 10358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } else { 1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bXAlign = 5; 1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bYAlign = 5; 1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (cShape) { 1097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger switch (cShape) { 1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 1: // square 1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = cXAlign * 6; 1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger r = l + 12; 1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = cYAlign * 6; 1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger b = l + 12; 1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 2: 1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = cXAlign * 6; 1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger r = l + 12; 1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = 20; b = 30; 1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger cYAlign = 5; 1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 3: 1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = 20; r = 30; 1247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = cYAlign * 6; 1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger b = l + 20; 1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger cXAlign = 5; 1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger cCW); 13158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (progress) { 13258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger str += sprintf(str, " path.addRect(%d, %d, %d, %d," 13358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger " SkPath::kC%sW_Direction);\n", l, t, r, b, cCW ? "C" : ""); 13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } else { 1367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger cXAlign = 5; 1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger cYAlign = 5; 1387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (dShape) { 1407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger switch (dShape) { 1417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 1: // square 1427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = dXAlign * 4; 1437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger r = l + 9; 1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = dYAlign * 4; 1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger b = l + 9; 1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 1477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 2: 1487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = dXAlign * 6; 1497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger r = l + 9; 1507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = 32; b = 36; 1517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger dYAlign = 5; 1527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 1537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case 3: 1547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger l = 32; r = 36; 1557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger t = dYAlign * 6; 1567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger b = l + 9; 1577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger dXAlign = 5; 1587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 1597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b), 1617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger dCW); 16258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (progress) { 16358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger str += sprintf(str, " path.addRect(%d, %d, %d, %d," 16458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger " SkPath::kC%sW_Direction);\n", l, t, r, b, dCW ? "C" : ""); 16558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 1667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } else { 1677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger dXAlign = 5; 1687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger dYAlign = 5; 1697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger path.close(); 17158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (progress) { 17258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger outputProgress(state.fPathStr, pathStr, SkPath::kWinding_FillType); 17358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 1747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger testSimplify(path, false, out, state, pathStr); 17558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (progress) { 17658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger outputProgress(state.fPathStr, pathStr, SkPath::kEvenOdd_FillType); 17758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 1787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger testSimplify(path, true, out, state, pathStr); 1797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 1887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void PathOpsSimplifyRectsThreadedTest(skiatest::Reporter* reporter) 1907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger{ 1917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int threadCount = initializeTests(reporter, "testLine"); 1927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger PathOpsThreadedTestRunner testRunner(reporter, threadCount); 1937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int a = 0; a < 8; ++a) { // outermost 1947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int b = a ; b < 8; ++b) { 1957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int c = b ; c < 8; ++c) { 1967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int d = c; d < 8; ++d) { 1977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *testRunner.fRunnables.append() = SkNEW_ARGS(PathOpsThreadedRunnable, 1987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger (&testSimplify4x4RectsMain, a, b, c, d, &testRunner)); 1997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 2007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (!reporter->allowExtendedTest()) goto finish; 2017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 2027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 2037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 2047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfinish: 2057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger testRunner.render(); 2067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 2077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 2087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "TestClassDef.h" 2097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerDEFINE_TESTCLASS_SHORT(PathOpsSimplifyRectsThreadedTest) 210