From 818b0cc1b8b0c4acc565e8e2cb8b0b61aa5a300e Mon Sep 17 00:00:00 2001 From: "caryclark@google.com" Date: Mon, 8 Apr 2013 11:50:46 +0000 Subject: 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 --- tests/PathOpsSimplifyTrianglesThreadedTest.cpp | 109 +++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100755 tests/PathOpsSimplifyTrianglesThreadedTest.cpp (limited to 'tests/PathOpsSimplifyTrianglesThreadedTest.cpp') diff --git a/tests/PathOpsSimplifyTrianglesThreadedTest.cpp b/tests/PathOpsSimplifyTrianglesThreadedTest.cpp new file mode 100755 index 0000000000..567713ce6e --- /dev/null +++ b/tests/PathOpsSimplifyTrianglesThreadedTest.cpp @@ -0,0 +1,109 @@ +/* + * 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 testSimplifyTrianglesMain(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; + for (int d = 0; d < 15; ++d) { + int dx = d & 0x03; + int dy = d >> 2; + for (int e = d + 1; e < 16; ++e) { + int ex = e & 0x03; + int ey = e >> 2; + for (int f = d + 1; f < 16; ++f) { + if (e == f) { + continue; + } + int fx = f & 0x03; + int fy = f >> 2; + if ((ex - dx) * (fy - dy) == (ey - dy) * (fx - dx)) { + continue; + } + SkPath path, out; + path.setFillType(SkPath::kWinding_FillType); + path.moveTo(SkIntToScalar(ax), SkIntToScalar(ay)); + path.lineTo(SkIntToScalar(bx), SkIntToScalar(by)); + path.lineTo(SkIntToScalar(cx), SkIntToScalar(cy)); + path.close(); + path.moveTo(SkIntToScalar(dx), SkIntToScalar(dy)); + path.lineTo(SkIntToScalar(ex), SkIntToScalar(ey)); + path.lineTo(SkIntToScalar(fx), SkIntToScalar(fy)); + path.close(); + if (1) { + char* str = pathStr; + str += sprintf(str, " path.moveTo(%d, %d);\n", ax, ay); + str += sprintf(str, " path.lineTo(%d, %d);\n", bx, by); + str += sprintf(str, " path.lineTo(%d, %d);\n", cx, cy); + str += sprintf(str, " path.close();\n"); + str += sprintf(str, " path.moveTo(%d, %d);\n", dx, dy); + str += sprintf(str, " path.lineTo(%d, %d);\n", ex, ey); + str += sprintf(str, " path.lineTo(%d, %d);\n", fx, fy); + 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 TestSimplifyTrianglesThreaded(skiatest::Reporter* reporter) { + int testsRun = 0; + if (gShowTestProgress) SkDebugf("%s\n", __FUNCTION__); +#ifdef SK_DEBUG + gDebugMaxWindSum = 2; + gDebugMaxWindValue = 2; +#endif + const char testStr[] = "testTriangles"; + initializeTests(reporter, testStr, sizeof(testStr)); + for (int a = 0; a < 15; ++a) { + int ax = a & 0x03; + int ay = a >> 2; + for (int b = a + 1; b < 16; ++b) { + int bx = b & 0x03; + int by = b >> 2; + for (int c = a + 1; c < 16; ++c) { + if (b == c) { + continue; + } + int cx = c & 0x03; + int cy = c >> 2; + if ((bx - ax) * (cy - ay) == (by - ay) * (cx - ax)) { + continue; + } + testsRun += dispatchTest4(testSimplifyTrianglesMain, a, b, c, 0); + } + if (!gAllowExtendedTest) goto finish; + if (gShowTestProgress) SkDebugf("."); + } + if (gShowTestProgress) SkDebugf("\n%d", a); + } +finish: + testsRun += waitForCompletion(); + if (gShowTestProgress) SkDebugf("%s tests=%d\n", __FUNCTION__, testsRun); +} + +#include "TestClassDef.h" +DEFINE_TESTCLASS("SimplifyTrianglesThreaded", SimplifyTrianglesThreadedTestClass, \ + TestSimplifyTrianglesThreaded) -- cgit v1.2.3