aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/PathOpsAngleTest.cpp
diff options
context:
space:
mode:
authorGravatar caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-07 18:51:31 +0000
committerGravatar caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-07 18:51:31 +0000
commita5e55925ea03e76885804bda77408a1d6f04c335 (patch)
tree346772e0d28a5483ca807742cf5e074cf3fb0bb5 /tests/PathOpsAngleTest.cpp
parent3faf1f1fb6157c49bd09cd3c78dc88421e70deb7 (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.cpp70
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) {