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

Side by Side Diff: tests/PathOpsDebug.cpp

Issue 131103009: update pathops to circle sort (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: disable old test that still fails on linux 32 release Created 6 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
« no previous file with comments | « tests/PathOpsCubicQuadIntersectionTest.cpp ('k') | tests/PathOpsExtendedTest.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #include "SkOpContour.h"
2 #include "SkIntersectionHelper.h"
3 #include "SkOpSegment.h"
4
5 inline void DebugDumpDouble(double x) {
6 if (x == floor(x)) {
7 SkDebugf("%.0f", x);
8 } else {
9 SkDebugf("%1.19g", x);
10 }
11 }
12
13 inline void DebugDumpFloat(float x) {
14 if (x == floorf(x)) {
15 SkDebugf("%.0f", x);
16 } else {
17 SkDebugf("%1.9gf", x);
18 }
19 }
20
21 // if not defined by PathOpsDebug.cpp ...
22 #if !defined SK_DEBUG && FORCE_RELEASE
23 bool SkPathOpsDebug::ValidWind(int wind) {
24 return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF;
25 }
26
27 void SkPathOpsDebug::WindingPrintf(int wind) {
28 if (wind == SK_MinS32) {
29 SkDebugf("?");
30 } else {
31 SkDebugf("%d", wind);
32 }
33 }
34 #endif
35
36 void SkOpAngle::dump() const {
37 #if DEBUG_SORT
38 debugOne(false);
39 #endif
40 SkDebugf("\n");
41 }
42
43 void SkOpAngle::dumpFromTo(const SkOpSegment* segment, int from, int to) const {
44 #if DEBUG_SORT && DEBUG_ANGLE
45 const SkOpAngle* first = this;
46 const SkOpAngle* next = this;
47 const char* indent = "";
48 do {
49 SkDebugf("%s", indent);
50 next->debugOne(false);
51 if (segment == next->fSegment) {
52 if (fNext && from == fNext->debugID()) {
53 SkDebugf(" << from");
54 }
55 if (fNext && to == fNext->debugID()) {
56 SkDebugf(" << to");
57 }
58 }
59 SkDebugf("\n");
60 indent = " ";
61 next = next->fNext;
62 } while (next && next != first);
63 #endif
64 }
65
66 void SkOpAngle::dumpLoop() const {
67 const SkOpAngle* first = this;
68 const SkOpAngle* next = this;
69 do {
70 next->dump();
71 next = next->fNext;
72 } while (next && next != first);
73 }
74
75 void SkOpAngle::dumpPartials() const {
76 const SkOpAngle* first = this;
77 const SkOpAngle* next = this;
78 do {
79 next->fCurvePart.dumpNumber();
80 next = next->fNext;
81 } while (next && next != first);
82 }
83
84 void SkOpContour::dump() const {
85 int segmentCount = fSegments.count();
86 SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID());
87 for (int test = 0; test < segmentCount; ++test) {
88 SkDebugf(" [%d] ((SkOpSegment*) 0x%p) [%d]\n", test, &fSegments[test],
89 fSegments[test].debugID());
90 }
91 }
92
93 void SkOpContour::dumpAngles() const {
94 int segmentCount = fSegments.count();
95 SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID());
96 for (int test = 0; test < segmentCount; ++test) {
97 SkDebugf(" [%d] ", test);
98 fSegments[test].dumpAngles();
99 }
100 }
101
102 void SkOpContour::dumpPts() const {
103 int segmentCount = fSegments.count();
104 SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID());
105 for (int test = 0; test < segmentCount; ++test) {
106 SkDebugf(" [%d] ", test);
107 fSegments[test].dumpPts();
108 }
109 }
110
111 void SkOpContour::dumpSpans() const {
112 int segmentCount = fSegments.count();
113 SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID());
114 for (int test = 0; test < segmentCount; ++test) {
115 SkDebugf(" [%d] ", test);
116 fSegments[test].dumpSpans();
117 }
118 }
119
120 void SkDCubic::dump() const {
121 SkDebugf("{{");
122 int index = 0;
123 do {
124 fPts[index].dump();
125 SkDebugf(", ");
126 } while (++index < 3);
127 fPts[index].dump();
128 SkDebugf("}}\n");
129 }
130
131 void SkDCubic::dumpNumber() const {
132 SkDebugf("{{");
133 int index = 0;
134 bool dumpedOne = false;
135 do {
136 if (!(fPts[index].fX == fPts[index].fX && fPts[index].fY == fPts[index]. fY)) {
137 continue;
138 }
139 if (dumpedOne) {
140 SkDebugf(", ");
141 }
142 fPts[index].dump();
143 dumpedOne = true;
144 } while (++index < 3);
145 if (fPts[index].fX == fPts[index].fX && fPts[index].fY == fPts[index].fY) {
146 if (dumpedOne) {
147 SkDebugf(", ");
148 }
149 fPts[index].dump();
150 }
151 SkDebugf("}}\n");
152 }
153
154 void SkDLine::dump() const {
155 SkDebugf("{{");
156 fPts[0].dump();
157 SkDebugf(", ");
158 fPts[1].dump();
159 SkDebugf("}}\n");
160 }
161
162 void SkDPoint::dump() const {
163 SkDebugf("{");
164 DebugDumpDouble(fX);
165 SkDebugf(", ");
166 DebugDumpDouble(fY);
167 SkDebugf("}");
168 }
169
170 void SkDPoint::Dump(const SkPoint& pt) {
171 SkDebugf("{");
172 DebugDumpFloat(pt.fX);
173 SkDebugf(", ");
174 DebugDumpFloat(pt.fY);
175 SkDebugf("}");
176 }
177
178
179 void SkDQuad::dumpComma(const char* comma) const {
180 SkDebugf("{{");
181 int index = 0;
182 do {
183 fPts[index].dump();
184 SkDebugf(", ");
185 } while (++index < 2);
186 fPts[index].dump();
187 SkDebugf("}}%s\n", comma ? comma : "");
188 }
189
190 void SkDQuad::dump() const {
191 dumpComma("");
192 }
193
194 void SkIntersectionHelper::dump() const {
195 SkDPoint::Dump(pts()[0]);
196 SkDPoint::Dump(pts()[1]);
197 if (verb() >= SkPath::kQuad_Verb) {
198 SkDPoint::Dump(pts()[2]);
199 }
200 if (verb() >= SkPath::kCubic_Verb) {
201 SkDPoint::Dump(pts()[3]);
202 }
203 }
204
205 void SkOpSegment::dumpAngles() const {
206 SkDebugf("((SkOpSegment*) 0x%p) [%d]\n", this, debugID());
207 int fromIndex = -1, toIndex = -1;
208 for (int index = 0; index < count(); ++index) {
209 int fIndex = fTs[index].fFromAngleIndex;
210 int tIndex = fTs[index].fToAngleIndex;
211 if (fromIndex == fIndex && tIndex == toIndex) {
212 continue;
213 }
214 if (fIndex >= 0) {
215 SkDebugf(" [%d] from=%d ", index, fIndex);
216 const SkOpAngle& angle = this->angle(fIndex);
217 angle.dumpFromTo(this, fIndex, tIndex);
218 }
219 if (tIndex >= 0) {
220 SkDebugf(" [%d] to=%d ", index, tIndex);
221 const SkOpAngle& angle = this->angle(tIndex);
222 angle.dumpFromTo(this, fIndex, tIndex);
223 }
224 fromIndex = fIndex;
225 toIndex = tIndex;
226 }
227 }
228
229 void SkOpSegment::dumpContour(int firstID, int lastID) const {
230 if (debugID() < 0) {
231 return;
232 }
233 const SkOpSegment* test = this - (debugID() - 1);
234 test += (firstID - 1);
235 const SkOpSegment* last = test + (lastID - firstID);
236 while (test <= last) {
237 test->dumpSpans();
238 ++test;
239 }
240 }
241
242 void SkOpSegment::dumpPts() const {
243 int last = SkPathOpsVerbToPoints(fVerb);
244 SkDebugf("((SkOpSegment*) 0x%p) [%d] {{", this, debugID());
245 int index = 0;
246 do {
247 SkDPoint::Dump(fPts[index]);
248 SkDebugf(", ");
249 } while (++index < last);
250 SkDPoint::Dump(fPts[index]);
251 SkDebugf("}}\n");
252 }
253
254 void SkOpSegment::dumpDPts() const {
255 int count = SkPathOpsVerbToPoints(fVerb);
256 SkDebugf("((SkOpSegment*) 0x%p) [%d] {{", this, debugID());
257 int index = 0;
258 do {
259 SkDPoint dPt = {fPts[index].fX, fPts[index].fY};
260 dPt.dump();
261 if (index != count) {
262 SkDebugf(", ");
263 }
264 } while (++index <= count);
265 SkDebugf("}}\n");
266 }
267
268 void SkOpSegment::dumpSpans() const {
269 int count = this->count();
270 SkDebugf("((SkOpSegment*) 0x%p) [%d]\n", this, debugID());
271 for (int index = 0; index < count; ++index) {
272 const SkOpSpan& span = this->span(index);
273 SkDebugf(" [%d] ", index);
274 span.dumpOne();
275 }
276 }
277
278 void SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle, true>& angles) {
279 int count = angles.count();
280 for (int index = 0; index < count; ++index) {
281 angles[index].dump();
282 }
283 }
284
285 void SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle* , true>& angles) {
286 int count = angles.count();
287 for (int index = 0; index < count; ++index) {
288 angles[index]->dump();
289 }
290 }
291
292 void SkPathOpsDebug::DumpContours(const SkTArray<SkOpContour, true>& contours) {
293 int count = contours.count();
294 for (int index = 0; index < count; ++index) {
295 contours[index].dump();
296 }
297 }
298
299 void SkPathOpsDebug::DumpContours(const SkTArray<SkOpContour* , true>& contours) {
300 int count = contours.count();
301 for (int index = 0; index < count; ++index) {
302 contours[index]->dump();
303 }
304 }
305
306 void SkPathOpsDebug::DumpContourAngles(const SkTArray<SkOpContour, true>& contou rs) {
307 int count = contours.count();
308 for (int index = 0; index < count; ++index) {
309 contours[index].dumpAngles();
310 }
311 }
312
313 void SkPathOpsDebug::DumpContourAngles(const SkTArray<SkOpContour* , true>& cont ours) {
314 int count = contours.count();
315 for (int index = 0; index < count; ++index) {
316 contours[index]->dumpAngles();
317 }
318 }
319
320 void SkPathOpsDebug::DumpContourPts(const SkTArray<SkOpContour, true>& contours) {
321 int count = contours.count();
322 for (int index = 0; index < count; ++index) {
323 contours[index].dumpPts();
324 }
325 }
326
327 void SkPathOpsDebug::DumpContourPts(const SkTArray<SkOpContour* , true>& contour s) {
328 int count = contours.count();
329 for (int index = 0; index < count; ++index) {
330 contours[index]->dumpPts();
331 }
332 }
333
334 void SkPathOpsDebug::DumpContourSpans(const SkTArray<SkOpContour, true>& contour s) {
335 int count = contours.count();
336 for (int index = 0; index < count; ++index) {
337 contours[index].dumpSpans();
338 }
339 }
340
341 void SkPathOpsDebug::DumpContourSpans(const SkTArray<SkOpContour* , true>& conto urs) {
342 int count = contours.count();
343 for (int index = 0; index < count; ++index) {
344 contours[index]->dumpSpans();
345 }
346 }
347
348 void SkPathOpsDebug::DumpSpans(const SkTDArray<SkOpSpan *>& spans) {
349 int count = spans.count();
350 for (int index = 0; index < count; ++index) {
351 const SkOpSpan* span = spans[index];
352 const SkOpSpan& oSpan = span->fOther->span(span->fOtherIndex);
353 const SkOpSegment* segment = oSpan.fOther;
354 SkDebugf("((SkOpSegment*) 0x%p) [%d] ", segment, segment->debugID());
355 SkDebugf("spanIndex:%d ", oSpan.fOtherIndex);
356 span->dumpOne();
357 }
358 }
359
360 // this does not require that other T index is initialized or correct
361 const SkOpSegment* SkOpSpan::debugToSegment(ptrdiff_t* spanIndex) const {
362 if (!fOther) {
363 return NULL;
364 }
365 int oppCount = fOther->count();
366 for (int index = 0; index < oppCount; ++index) {
367 const SkOpSpan& otherSpan = fOther->span(index);
368 double otherTestT = otherSpan.fT;
369 if (otherTestT < fOtherT) {
370 continue;
371 }
372 SkASSERT(otherTestT == fOtherT);
373 const SkOpSegment* candidate = otherSpan.fOther;
374 const SkOpSpan* first = candidate->spans().begin();
375 const SkOpSpan* last = candidate->spans().end() - 1;
376 if (first <= this && this <= last) {
377 if (spanIndex) {
378 *spanIndex = this - first;
379 }
380 return candidate;
381 }
382 }
383 SkASSERT(0);
384 return NULL;
385 }
386
387 void SkOpSpan::dumpOne() const {
388 SkDebugf("t=");
389 DebugDumpDouble(fT);
390 SkDebugf(" pt=");
391 SkDPoint::Dump(fPt);
392 if (fOther) {
393 SkDebugf(" other.fID=%d", fOther->debugID());
394 SkDebugf(" [%d] otherT=", fOtherIndex);
395 DebugDumpDouble(fOtherT);
396 } else {
397 SkDebugf(" other.fID=? [?] otherT=?");
398 }
399 #if DEBUG_WINDING
400 SkDebugf(" windSum=");
401 SkPathOpsDebug::WindingPrintf(fWindSum);
402 #endif
403 if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) {
404 #if DEBUG_WINDING
405 SkDebugf(" oppSum=");
406 SkPathOpsDebug::WindingPrintf(fOppSum);
407 #endif
408 }
409 SkDebugf(" windValue=%d", fWindValue);
410 if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) {
411 SkDebugf(" oppValue=%d", fOppValue);
412 }
413 SkDebugf(" from=%d", fFromAngleIndex);
414 SkDebugf(" to=%d", fToAngleIndex);
415 if (fDone) {
416 SkDebugf(" done");
417 }
418 if (fUnsortableStart) {
419 SkDebugf(" unsortable-start");
420 }
421 if (fUnsortableEnd) {
422 SkDebugf(" unsortable-end");
423 }
424 if (fTiny) {
425 SkDebugf(" tiny");
426 }
427 if (fSmall) {
428 SkDebugf(" small");
429 }
430 if (fLoop) {
431 SkDebugf(" loop");
432 }
433 SkDebugf("\n");
434 }
435
436 void SkOpSpan::dump() const {
437 ptrdiff_t spanIndex;
438 const SkOpSegment* segment = debugToSegment(&spanIndex);
439 if (segment) {
440 SkDebugf("((SkOpSegment*) 0x%p) [%d]\n", segment, segment->debugID());
441 SkDebugf(" [%d] ", spanIndex);
442 } else {
443 SkDebugf("((SkOpSegment*) ?) [?]\n");
444 SkDebugf(" [?] ");
445 }
446 dumpOne();
447 }
448
449 void Dump(const SkTArray<class SkOpAngle, true>& angles) {
450 SkPathOpsDebug::DumpAngles(angles);
451 }
452
453 void Dump(const SkTArray<class SkOpAngle* , true>& angles) {
454 SkPathOpsDebug::DumpAngles(angles);
455 }
456
457 void Dump(const SkTArray<class SkOpAngle, true>* angles) {
458 SkPathOpsDebug::DumpAngles(*angles);
459 }
460
461 void Dump(const SkTArray<class SkOpAngle* , true>* angles) {
462 SkPathOpsDebug::DumpAngles(*angles);
463 }
464
465 void Dump(const SkTArray<class SkOpContour, true>& contours) {
466 SkPathOpsDebug::DumpContours(contours);
467 }
468
469 void Dump(const SkTArray<class SkOpContour* , true>& contours) {
470 SkPathOpsDebug::DumpContours(contours);
471 }
472
473 void Dump(const SkTArray<class SkOpContour, true>* contours) {
474 SkPathOpsDebug::DumpContours(*contours);
475 }
476
477 void Dump(const SkTArray<class SkOpContour* , true>* contours) {
478 SkPathOpsDebug::DumpContours(*contours);
479 }
480
481 void Dump(const SkTDArray<SkOpSpan *>& chaseArray) {
482 SkPathOpsDebug::DumpSpans(chaseArray);
483 }
484
485 void Dump(const SkTDArray<SkOpSpan *>* chaseArray) {
486 SkPathOpsDebug::DumpSpans(*chaseArray);
487 }
488
489 void DumpAngles(const SkTArray<class SkOpContour, true>& contours) {
490 SkPathOpsDebug::DumpContourAngles(contours);
491 }
492
493 void DumpAngles(const SkTArray<class SkOpContour* , true>& contours) {
494 SkPathOpsDebug::DumpContourAngles(contours);
495 }
496
497 void DumpAngles(const SkTArray<class SkOpContour, true>* contours) {
498 SkPathOpsDebug::DumpContourAngles(*contours);
499 }
500
501 void DumpAngles(const SkTArray<class SkOpContour* , true>* contours) {
502 SkPathOpsDebug::DumpContourAngles(*contours);
503 }
504
505 void DumpSpans(const SkTArray<class SkOpContour, true>& contours) {
506 SkPathOpsDebug::DumpContourSpans(contours);
507 }
508
509 void DumpSpans(const SkTArray<class SkOpContour* , true>& contours) {
510 SkPathOpsDebug::DumpContourSpans(contours);
511 }
512
513 void DumpSpans(const SkTArray<class SkOpContour, true>* contours) {
514 SkPathOpsDebug::DumpContourSpans(*contours);
515 }
516
517 void DumpSpans(const SkTArray<class SkOpContour* , true>* contours) {
518 SkPathOpsDebug::DumpContourSpans(*contours);
519 }
520
521 void DumpPts(const SkTArray<class SkOpContour, true>& contours) {
522 SkPathOpsDebug::DumpContourPts(contours);
523 }
524
525 void DumpPts(const SkTArray<class SkOpContour* , true>& contours) {
526 SkPathOpsDebug::DumpContourPts(contours);
527 }
528
529 void DumpPts(const SkTArray<class SkOpContour, true>* contours) {
530 SkPathOpsDebug::DumpContourPts(*contours);
531 }
532
533 void DumpPts(const SkTArray<class SkOpContour* , true>* contours) {
534 SkPathOpsDebug::DumpContourPts(*contours);
535 }
536
537 static void dumpTestCase(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) {
538 SkDebugf("<div id=\"quad%d\">\n", testNo);
539 quad1.dumpComma(",");
540 quad2.dump();
541 SkDebugf("</div>\n\n");
542 }
543
544 static void dumpTestTrailer() {
545 SkDebugf("</div>\n\n<script type=\"text/javascript\">\n\n");
546 SkDebugf(" var testDivs = [\n");
547 }
548
549 static void dumpTestList(int testNo, double min) {
550 SkDebugf(" quad%d,", testNo);
551 if (min > 0) {
552 SkDebugf(" // %1.9g", min);
553 }
554 SkDebugf("\n");
555 }
556
557 void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) {
558 SkDebugf("\n");
559 dumpTestCase(quad1, quad2, testNo);
560 dumpTestTrailer();
561 dumpTestList(testNo, 0);
562 SkDebugf("\n");
563 }
564
565 void DumpT(const SkDQuad& quad, double t) {
566 SkDLine line = {{quad.ptAtT(t), quad[0]}};
567 line.dump();
568 }
OLDNEW
« no previous file with comments | « tests/PathOpsCubicQuadIntersectionTest.cpp ('k') | tests/PathOpsExtendedTest.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698