|  | #include "EdgeWalker_Test.h" | 
|  | #include "Intersection_Tests.h" | 
|  | #include "ShapeOps.h" | 
|  |  | 
|  | bool gShowOriginal = true; | 
|  |  | 
|  | struct curve { | 
|  | SkPath::Verb verb; | 
|  | SkPoint pts[4]; | 
|  | }; | 
|  |  | 
|  | struct curve test1[] = { | 
|  | {SkPath::kQuad_Verb, {{366.608826f, 151.196014f}, {378.803101f, 136.674606f}, {398.164948f, 136.674606f}}}, | 
|  | {SkPath::kLine_Verb, {{354.009216f, 208.816208f}, {393.291473f, 102.232819f}}}, | 
|  | {SkPath::kQuad_Verb, {{359.978058f, 136.581512f}, {378.315979f, 136.581512f}, {388.322723f, 149.613556f}}}, | 
|  | {SkPath::kQuad_Verb, {{364.390686f, 157.898193f}, {375.281769f, 136.674606f}, {396.039917f, 136.674606f}}}, | 
|  | {SkPath::kLine_Verb, {{396.039917f, 136.674606f}, {350, 120}}}, | 
|  | {SkPath::kDone_Verb} | 
|  | }; | 
|  |  | 
|  | struct curve test2[] = { | 
|  | {SkPath::kQuad_Verb, {{366.608826f, 151.196014f}, {378.803101f, 136.674606f}, {398.164948f, 136.674606f}}}, | 
|  | {SkPath::kQuad_Verb, {{359.978058f, 136.581512f}, {378.315979f, 136.581512f}, {388.322723f, 149.613556f}}}, | 
|  | {SkPath::kQuad_Verb, {{364.390686f, 157.898193f}, {375.281769f, 136.674606f}, {396.039917f, 136.674606f}}}, | 
|  | {SkPath::kDone_Verb} | 
|  | }; | 
|  |  | 
|  | struct curve* testSet[] = { | 
|  | test2, | 
|  | test1 | 
|  | }; | 
|  |  | 
|  | size_t testSet_count = sizeof(testSet) / sizeof(testSet[0]); | 
|  |  | 
|  | static void construct() { | 
|  | for (size_t idx = 0; idx < testSet_count; ++idx) { | 
|  | const curve* test = testSet[idx]; | 
|  | SkPath path; | 
|  | bool pathComplete = false; | 
|  | bool first = true; | 
|  | do { | 
|  | if (first) { | 
|  | path.moveTo(test->pts[0].fX, test->pts[0].fY); | 
|  | first = false; | 
|  | } else if (test->verb != SkPath::kDone_Verb) { | 
|  | path.lineTo(test->pts[0].fX, test->pts[0].fY); | 
|  | } | 
|  | switch (test->verb) { | 
|  | case SkPath::kDone_Verb: | 
|  | pathComplete = true; | 
|  | break; | 
|  | case SkPath::kLine_Verb: | 
|  | path.lineTo(test->pts[1].fX, test->pts[1].fY); | 
|  | break; | 
|  | case SkPath::kQuad_Verb: | 
|  | path.quadTo(test->pts[1].fX, test->pts[1].fY, test->pts[2].fX, test->pts[2].fY); | 
|  | break; | 
|  | case SkPath::kCubic_Verb: | 
|  | path.cubicTo(test->pts[1].fX, test->pts[1].fY, test->pts[2].fX, test->pts[2].fY, test->pts[3].fX, test->pts[3].fY); | 
|  | break; | 
|  | default: | 
|  | SkASSERT(0); | 
|  | } | 
|  | test++; | 
|  | } while (!pathComplete); | 
|  | path.close(); | 
|  | if (gShowOriginal) { | 
|  | showPath(path, NULL); | 
|  | SkDebugf("simplified:\n"); | 
|  | } | 
|  | testSimplifyx(path); | 
|  | } | 
|  | } | 
|  |  | 
|  | static void (*tests[])() = { | 
|  | construct, | 
|  | }; | 
|  |  | 
|  | static const size_t testCount = sizeof(tests) / sizeof(tests[0]); | 
|  |  | 
|  | static void (*firstTest)() = 0; | 
|  | static bool skipAll = false; | 
|  |  | 
|  | void MiniSimplify_Test() { | 
|  | if (skipAll) { | 
|  | return; | 
|  | } | 
|  | size_t index = 0; | 
|  | if (firstTest) { | 
|  | while (index < testCount && tests[index] != firstTest) { | 
|  | ++index; | 
|  | } | 
|  | } | 
|  | bool firstTestComplete = false; | 
|  | for ( ; index < testCount; ++index) { | 
|  | (*tests[index])(); | 
|  | firstTestComplete = true; | 
|  | } | 
|  | } |