diff options
author | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-07 18:51:31 +0000 |
---|---|---|
committer | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-07 18:51:31 +0000 |
commit | a5e55925ea03e76885804bda77408a1d6f04c335 (patch) | |
tree | 346772e0d28a5483ca807742cf5e074cf3fb0bb5 /tests/PathOpsAngleTest.cpp | |
parent | 3faf1f1fb6157c49bd09cd3c78dc88421e70deb7 (diff) |
path ops -- fix skp bugs
This fixes a series of bugs discovered by running
the small set of Skia skp files through pathops
to flatten the clips.
Review URL: https://codereview.chromium.org/14798004
git-svn-id: http://skia.googlecode.com/svn/trunk@9042 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tests/PathOpsAngleTest.cpp')
-rw-r--r-- | tests/PathOpsAngleTest.cpp | 70 |
1 files changed, 49 insertions, 21 deletions
diff --git a/tests/PathOpsAngleTest.cpp b/tests/PathOpsAngleTest.cpp index 6714ca4609..e0331ec60f 100644 --- a/tests/PathOpsAngleTest.cpp +++ b/tests/PathOpsAngleTest.cpp @@ -8,11 +8,16 @@ #include "Test.h" static const SkPoint cubics[][4] = { - {{0, 1}, {2, 6}, {4, 2}, {5, 3}} + {{0, 1}, {2, 6}, {4, 2}, {5, 3}}, + {{10, 234}, {10, 229.581726f}, {13.5817204f, 226}, {18, 226}}, +}; + +static const SkPoint quads[][3] = { + {{12.3423996f, 228.342407f}, {10, 230.686295f}, {10, 234}}, }; static const SkPoint lines[][2] = { - {{6, 2}, {2, 4}} + {{6, 2}, {2, 4}}, }; struct SortSet { @@ -36,38 +41,61 @@ static const SortSet set2[] = { {lines[0], 2, 0.574074074, 0.9140625}, }; +static const SortSet set3[] = { + {cubics[1], 4, 0, 1}, + {quads[0], 3, 1, 0}, +}; + struct SortSetTests { const SortSet* set; size_t count; }; static const SortSetTests tests[] = { + { set3, SK_ARRAY_COUNT(set3) }, { set2, SK_ARRAY_COUNT(set2) }, - { set1, SK_ARRAY_COUNT(set1) } + { set1, SK_ARRAY_COUNT(set1) }, }; static void setup(const SortSet* set, const size_t idx, SkPoint const ** data, SkOpSegment* seg, int* ts) { SkPoint start, end; - if (set[idx].ptCount == 2) { - *data = set[idx].ptData; - seg->addLine(*data, false, false); - SkDLine dLine; - dLine.set(set[idx].ptData); - start = dLine.xyAtT(set[idx].tStart).asSkPoint(); - end = dLine.xyAtT(set[idx].tEnd).asSkPoint(); - } else if (set[idx].ptCount == 4) { - *data = set[idx].ptData; - seg->addCubic(*data, false, false); - SkDCubic dCubic; - dCubic.set(set[idx].ptData); - start = dCubic.xyAtT(set[idx].tStart).asSkPoint(); - end = dCubic.xyAtT(set[idx].tEnd).asSkPoint(); + *data = set[idx].ptData; + switch(set[idx].ptCount) { + case 2: { + seg->addLine(*data, false, false); + SkDLine dLine; + dLine.set(set[idx].ptData); + start = dLine.xyAtT(set[idx].tStart).asSkPoint(); + end = dLine.xyAtT(set[idx].tEnd).asSkPoint(); + } break; + case 3: { + seg->addQuad(*data, false, false); + SkDQuad dQuad; + dQuad.set(set[idx].ptData); + start = dQuad.xyAtT(set[idx].tStart).asSkPoint(); + end = dQuad.xyAtT(set[idx].tEnd).asSkPoint(); + } break; + case 4: { + seg->addCubic(*data, false, false); + SkDCubic dCubic; + dCubic.set(set[idx].ptData); + start = dCubic.xyAtT(set[idx].tStart).asSkPoint(); + end = dCubic.xyAtT(set[idx].tEnd).asSkPoint(); + } break; + } + double tStart = set[idx].tStart; + double tEnd = set[idx].tEnd; + seg->addT(NULL, start, tStart); + seg->addT(NULL, end, tEnd); + double tLeft = tStart < tEnd ? 0 : 1; + if (tStart != tLeft && tEnd != tLeft) { + seg->addT(NULL, set[idx].ptData[0], tLeft); + } + double tRight = tStart < tEnd ? 1 : 0; + if (tStart != tRight && tEnd != tRight) { + seg->addT(NULL, set[idx].ptData[set[idx].ptCount - 1], tRight); } - seg->addT(NULL, start, set[idx].tStart); - seg->addT(NULL, end, set[idx].tEnd); - seg->addT(NULL, set[idx].ptData[0], 0); - seg->addT(NULL, set[idx].ptData[set[idx].ptCount - 1], 1); int tIndex = 0; do { if (seg->t(tIndex) == set[idx].tStart) { |