Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Side by Side Diff: tests/PathOpsExtendedTest.cpp

Issue 13851015: path ops : fix empty-diff bug, op-in-place (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/pathops/SkPathOpsOp.cpp ('k') | tests/PathOpsOpTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "PathOpsExtendedTest.h" 8 #include "PathOpsExtendedTest.h"
9 #include "PathOpsThreadedCommon.h" 9 #include "PathOpsThreadedCommon.h"
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
(...skipping 11 matching lines...) Expand all
22 "\n" 22 "\n"
23 "<script type=\"text/javascript\">\n" 23 "<script type=\"text/javascript\">\n"
24 "\n" 24 "\n"
25 "var testDivs = [\n"; 25 "var testDivs = [\n";
26 26
27 static const char* opStrs[] = { 27 static const char* opStrs[] = {
28 "kDifference_PathOp", 28 "kDifference_PathOp",
29 "kIntersect_PathOp", 29 "kIntersect_PathOp",
30 "kUnion_PathOp", 30 "kUnion_PathOp",
31 "kXor_PathOp", 31 "kXor_PathOp",
32 "kReverseDifference_PathOp",
32 }; 33 };
33 34
34 static const char* opSuffixes[] = { 35 static const char* opSuffixes[] = {
35 "d", 36 "d",
36 "i", 37 "i",
37 "u", 38 "u",
38 "o", 39 "o",
39 }; 40 };
40 41
41 static bool gShowPath = false; 42 static bool gShowPath = false;
42 static bool gComparePaths = true; 43 static bool gComparePaths = true;
43 static bool gComparePathsAssert = true; 44 static bool gComparePathsAssert = true;
44 static bool gPathStrAssert = true; 45 static bool gPathStrAssert = true;
45 46
46 static void showPathContour(SkPath::Iter& iter) { 47 static void showPathContours(SkPath::Iter& iter) {
47 uint8_t verb; 48 uint8_t verb;
48 SkPoint pts[4]; 49 SkPoint pts[4];
49 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { 50 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
50 switch (verb) { 51 switch (verb) {
51 case SkPath::kMove_Verb: 52 case SkPath::kMove_Verb:
52 SkDebugf("path.moveTo(%1.9g,%1.9g);\n", pts[0].fX, pts[0].fY); 53 SkDebugf("path.moveTo(%1.9g,%1.9g);\n", pts[0].fX, pts[0].fY);
53 continue; 54 continue;
54 case SkPath::kLine_Verb: 55 case SkPath::kLine_Verb:
55 SkDebugf("path.lineTo(%1.9g,%1.9g);\n", pts[1].fX, pts[1].fY); 56 SkDebugf("path.lineTo(%1.9g,%1.9g);\n", pts[1].fX, pts[1].fY);
56 break; 57 break;
(...skipping 13 matching lines...) Expand all
70 return; 71 return;
71 } 72 }
72 } 73 }
73 } 74 }
74 75
75 void showPath(const SkPath& path, const char* str) { 76 void showPath(const SkPath& path, const char* str) {
76 SkDebugf("%s\n", !str ? "original:" : str); 77 SkDebugf("%s\n", !str ? "original:" : str);
77 showPath(path); 78 showPath(path);
78 } 79 }
79 80
81 const char* fillTypeStr[] = {
82 "kWinding_FillType",
83 "kEvenOdd_FillType",
84 "kInverseWinding_FillType",
85 "kInverseEvenOdd_FillType"
86 };
87
80 void showPath(const SkPath& path) { 88 void showPath(const SkPath& path) {
81 SkPath::Iter iter(path, true); 89 SkPath::Iter iter(path, true);
82 #define SUPPORT_RECT_CONTOUR_DETECTION 0 90 #define SUPPORT_RECT_CONTOUR_DETECTION 0
83 #if SUPPORT_RECT_CONTOUR_DETECTION 91 #if SUPPORT_RECT_CONTOUR_DETECTION
84 int rectCount = path.isRectContours() ? path.rectContours(NULL, NULL) : 0; 92 int rectCount = path.isRectContours() ? path.rectContours(NULL, NULL) : 0;
85 if (rectCount > 0) { 93 if (rectCount > 0) {
86 SkTDArray<SkRect> rects; 94 SkTDArray<SkRect> rects;
87 SkTDArray<SkPath::Direction> directions; 95 SkTDArray<SkPath::Direction> directions;
88 rects.setCount(rectCount); 96 rects.setCount(rectCount);
89 directions.setCount(rectCount); 97 directions.setCount(rectCount);
90 path.rectContours(rects.begin(), directions.begin()); 98 path.rectContours(rects.begin(), directions.begin());
91 for (int contour = 0; contour < rectCount; ++contour) { 99 for (int contour = 0; contour < rectCount; ++contour) {
92 const SkRect& rect = rects[contour]; 100 const SkRect& rect = rects[contour];
93 SkDebugf("path.addRect(%1.9g, %1.9g, %1.9g, %1.9g, %s);\n", rect.fLe ft, rect.fTop, 101 SkDebugf("path.addRect(%1.9g, %1.9g, %1.9g, %1.9g, %s);\n", rect.fLe ft, rect.fTop,
94 rect.fRight, rect.fBottom, directions[contour] == SkPath::kC CW_Direction 102 rect.fRight, rect.fBottom, directions[contour] == SkPath::kC CW_Direction
95 ? "SkPath::kCCW_Direction" : "SkPath::kCW_Direction"); 103 ? "SkPath::kCCW_Direction" : "SkPath::kCW_Direction");
96 } 104 }
97 return; 105 return;
98 } 106 }
99 #endif 107 #endif
108 SkPath::FillType fillType = path.getFillType();
109 SkASSERT(fillType >= SkPath::kWinding_FillType && fillType <= SkPath::kInver seEvenOdd_FillType);
110 SkDebugf("path.setFillType(%s);\n", fillTypeStr[fillType]);
100 iter.setPath(path, true); 111 iter.setPath(path, true);
101 showPathContour(iter); 112 showPathContours(iter);
102 } 113 }
103 114
104 void showPathData(const SkPath& path) { 115 void showPathData(const SkPath& path) {
105 SkPath::Iter iter(path, true); 116 SkPath::Iter iter(path, true);
106 uint8_t verb; 117 uint8_t verb;
107 SkPoint pts[4]; 118 SkPoint pts[4];
108 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { 119 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
109 switch (verb) { 120 switch (verb) {
110 case SkPath::kMove_Verb: 121 case SkPath::kMove_Verb:
111 continue; 122 continue;
(...skipping 26 matching lines...) Expand all
138 break; 149 break;
139 case kIntersect_PathOp: 150 case kIntersect_PathOp:
140 SkDebugf("op intersect\n"); 151 SkDebugf("op intersect\n");
141 break; 152 break;
142 case kUnion_PathOp: 153 case kUnion_PathOp:
143 SkDebugf("op union\n"); 154 SkDebugf("op union\n");
144 break; 155 break;
145 case kXOR_PathOp: 156 case kXOR_PathOp:
146 SkDebugf("op xor\n"); 157 SkDebugf("op xor\n");
147 break; 158 break;
159 case kReverseDifference_PathOp:
160 SkDebugf("op reverse difference\n");
161 break;
148 default: 162 default:
149 SkASSERT(0); 163 SkASSERT(0);
150 } 164 }
151 } 165 }
152 166
153 static void showPath(const SkPath& path, const char* str, const SkMatrix& scale) { 167 static void showPath(const SkPath& path, const char* str, const SkMatrix& scale) {
154 SkPath scaled; 168 SkPath scaled;
155 SkMatrix inverse; 169 SkMatrix inverse;
156 bool success = scale.invert(&inverse); 170 bool success = scale.invert(&inverse);
157 if (!success) { 171 if (!success) {
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 drawAsciiPaths(scaledOne, scaledTwo, true); 363 drawAsciiPaths(scaledOne, scaledTwo, true);
350 } 364 }
351 365
352 static int comparePaths(skiatest::Reporter* reporter, const SkPath& one, const S kPath& scaledOne, 366 static int comparePaths(skiatest::Reporter* reporter, const SkPath& one, const S kPath& scaledOne,
353 const SkPath& two, const SkPath& scaledTwo, SkBitmap& bi tmap, 367 const SkPath& two, const SkPath& scaledTwo, SkBitmap& bi tmap,
354 const SkPath& a, const SkPath& b, const SkPathOp shapeOp , 368 const SkPath& a, const SkPath& b, const SkPathOp shapeOp ,
355 const SkMatrix& scale) { 369 const SkMatrix& scale) {
356 int errors2x2; 370 int errors2x2;
357 int errors = pathsDrawTheSame(bitmap, scaledOne, scaledTwo, errors2x2); 371 int errors = pathsDrawTheSame(bitmap, scaledOne, scaledTwo, errors2x2);
358 if (errors2x2 == 0) { 372 if (errors2x2 == 0) {
373 if (gShowPath) {
374 showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale) ;
375 }
359 return 0; 376 return 0;
360 } 377 }
361 const int MAX_ERRORS = 8; 378 const int MAX_ERRORS = 8;
362 if (errors2x2 == MAX_ERRORS || errors2x2 == MAX_ERRORS - 1) { 379 if (gShowPath || errors2x2 == MAX_ERRORS || errors2x2 == MAX_ERRORS - 1) {
363 showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale); 380 showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
364 } 381 }
365 if (errors2x2 > MAX_ERRORS && gComparePathsAssert) { 382 if (errors2x2 > MAX_ERRORS && gComparePathsAssert) {
366 SkDebugf("%s errors=%d\n", __FUNCTION__, errors); 383 SkDebugf("%s errors=%d\n", __FUNCTION__, errors);
367 showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale); 384 showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
368 REPORTER_ASSERT(reporter, 0); 385 REPORTER_ASSERT(reporter, 0);
369 } 386 }
370 return errors2x2 > MAX_ERRORS ? errors2x2 : 0; 387 return errors2x2 > MAX_ERRORS ? errors2x2 : 0;
371 } 388 }
372 389
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 } 601 }
585 if (tests[index].fun == stopTest) { 602 if (tests[index].fun == stopTest) {
586 SkDebugf("lastTest\n"); 603 SkDebugf("lastTest\n");
587 } 604 }
588 if (index == last) { 605 if (index == last) {
589 break; 606 break;
590 } 607 }
591 index += reverse ? -1 : 1; 608 index += reverse ? -1 : 1;
592 } while (true); 609 } while (true);
593 } 610 }
OLDNEW
« no previous file with comments | « src/pathops/SkPathOpsOp.cpp ('k') | tests/PathOpsOpTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698