diff options
author | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-04-08 11:50:46 +0000 |
---|---|---|
committer | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-04-08 11:50:46 +0000 |
commit | 818b0cc1b8b0c4acc565e8e2cb8b0b61aa5a300e (patch) | |
tree | 358cf664d3979252f881a6c45c4dfa93fa75de46 /tests/PathOpsSimplifyQuadThreadedTest.cpp | |
parent | 9166dcb3a0e8784bea83d76ae01aa338c049ae05 (diff) |
Add implementation of path ops
This CL depends on
https://codereview.chromium.org/12880016/
"Add intersections for path ops"
Given a path, iterate through its contour, and
construct an array of segments containing its curves.
Intersect each curve with every other curve, and for
cubics, with itself.
Given the set of intersections, find one with the
smallest y and sort the curves eminating from the
intersection. Assign each curve a winding value.
Operate on the curves, keeping and discarding them
according to the current operation and the sum of
the winding values.
Assemble the kept curves into an output path.
Review URL: https://codereview.chromium.org/13094010
git-svn-id: http://skia.googlecode.com/svn/trunk@8553 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tests/PathOpsSimplifyQuadThreadedTest.cpp')
-rw-r--r-- | tests/PathOpsSimplifyQuadThreadedTest.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/PathOpsSimplifyQuadThreadedTest.cpp b/tests/PathOpsSimplifyQuadThreadedTest.cpp new file mode 100644 index 0000000000..96626a61ad --- /dev/null +++ b/tests/PathOpsSimplifyQuadThreadedTest.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2012 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" + +static THREAD_TYPE testSimplifyQuadsMain(void* data) +{ + SkASSERT(data); + State4& state = *(State4*) data; + char pathStr[1024]; + sk_bzero(pathStr, sizeof(pathStr)); + do { + int ax = state.a & 0x03; + int ay = state.a >> 2; + int bx = state.b & 0x03; + int by = state.b >> 2; + int cx = state.c & 0x03; + int cy = state.c >> 2; + int dx = state.d & 0x03; + int dy = state.d >> 2; + for (int e = 0 ; e < 16; ++e) { + int ex = e & 0x03; + int ey = e >> 2; + for (int f = e ; f < 16; ++f) { + int fx = f & 0x03; + int fy = f >> 2; + for (int g = f ; g < 16; ++g) { + int gx = g & 0x03; + int gy = g >> 2; + for (int h = g ; h < 16; ++h) { + int hx = h & 0x03; + int hy = h >> 2; + SkPath path, out; + path.setFillType(SkPath::kWinding_FillType); + path.moveTo(SkIntToScalar(ax), SkIntToScalar(ay)); + path.quadTo(SkIntToScalar(bx), SkIntToScalar(by), + SkIntToScalar(cx), SkIntToScalar(cy)); + path.lineTo(SkIntToScalar(dx), SkIntToScalar(dy)); + path.close(); + path.moveTo(SkIntToScalar(ex), SkIntToScalar(ey)); + path.lineTo(SkIntToScalar(fx), SkIntToScalar(fy)); + path.quadTo(SkIntToScalar(gx), SkIntToScalar(gy), + SkIntToScalar(hx), SkIntToScalar(hy)); + path.close(); + // gdb: set print elements 400 + char* str = pathStr; + str += sprintf(str, " path.moveTo(%d, %d);\n", ax, ay); + str += sprintf(str, " path.quadTo(%d, %d, %d, %d);\n", bx, by, cx, cy); + str += sprintf(str, " path.lineTo(%d, %d);\n", dx, dy); + str += sprintf(str, " path.close();\n"); + str += sprintf(str, " path.moveTo(%d, %d);\n", ex, ey); + str += sprintf(str, " path.lineTo(%d, %d);\n", fx, fy); + str += sprintf(str, " path.quadTo(%d, %d, %d, %d);\n", gx, gy, hx, hy); + str += sprintf(str, " path.close();\n"); + outputProgress(state, pathStr, SkPath::kWinding_FillType); + testSimplify(path, false, out, state, pathStr); + state.testsRun++; + path.setFillType(SkPath::kEvenOdd_FillType); + outputProgress(state, pathStr, SkPath::kEvenOdd_FillType); + testSimplify(path, true, out, state, pathStr); + state.testsRun++; + } + } + } + } + } while (runNextTestSet(state)); + THREAD_RETURN +} + +static void TestSimplifyQuadsThreaded(skiatest::Reporter* reporter) +{ + int testsRun = 0; + if (gShowTestProgress) SkDebugf("%s\n", __FUNCTION__); +#ifdef SK_DEBUG + gDebugMaxWindSum = 4; // FIXME: 3? + gDebugMaxWindValue = 4; +#endif + const char testStr[] = "testQuads"; + initializeTests(reporter, testStr, sizeof(testStr)); + int a = 0; + for (; a < 16; ++a) { + for (int b = a ; b < 16; ++b) { + for (int c = b ; c < 16; ++c) { + for (int d = c; d < 16; ++d) { + testsRun += dispatchTest4(testSimplifyQuadsMain, a, b, c, d); + } + if (!gAllowExtendedTest) goto finish; + if (gShowTestProgress) SkDebugf("."); + } + if (gShowTestProgress) SkDebugf("%d", b); + } + if (gShowTestProgress) SkDebugf("\n%d", a); + } +finish: + testsRun += waitForCompletion(); + if (gShowTestProgress) SkDebugf("%s tests=%d\n", __FUNCTION__, testsRun); +} + +#include "TestClassDef.h" +DEFINE_TESTCLASS("PathOpsSimplifyQuadsThreaded", SimplifyQuadsThreadedTestClass, \ + TestSimplifyQuadsThreaded) |