1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/pathops/SkPathOps.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMath.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkFloatBits.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkIntersections.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpAngle.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpCoincidence.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpContour.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpSegment.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpSpan.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsConic.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsCubic.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsCurve.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsLine.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsPoint.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsQuad.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsRect.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsTSect.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsTypes.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "tests/PathOpsDebug.h"
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm>
34*c8dee2aaSAndroid Build Coastguard Worker #include <cfloat>
35*c8dee2aaSAndroid Build Coastguard Worker #include <cmath>
36*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker bool PathOpsDebug::gJson;
39*c8dee2aaSAndroid Build Coastguard Worker bool PathOpsDebug::gMarkJsonFlaky;
40*c8dee2aaSAndroid Build Coastguard Worker bool PathOpsDebug::gOutFirst;
41*c8dee2aaSAndroid Build Coastguard Worker bool PathOpsDebug::gCheckForDuplicateNames;
42*c8dee2aaSAndroid Build Coastguard Worker bool PathOpsDebug::gOutputSVG;
43*c8dee2aaSAndroid Build Coastguard Worker FILE* PathOpsDebug::gOut;
44*c8dee2aaSAndroid Build Coastguard Worker
DebugDumpDouble(double x)45*c8dee2aaSAndroid Build Coastguard Worker inline void DebugDumpDouble(double x) {
46*c8dee2aaSAndroid Build Coastguard Worker if (x == floor(x)) {
47*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%.0f", x);
48*c8dee2aaSAndroid Build Coastguard Worker } else {
49*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%1.19g", x);
50*c8dee2aaSAndroid Build Coastguard Worker }
51*c8dee2aaSAndroid Build Coastguard Worker }
52*c8dee2aaSAndroid Build Coastguard Worker
DebugDumpFloat(float x)53*c8dee2aaSAndroid Build Coastguard Worker inline void DebugDumpFloat(float x) {
54*c8dee2aaSAndroid Build Coastguard Worker if (x == floorf(x)) {
55*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%.0f", x);
56*c8dee2aaSAndroid Build Coastguard Worker } else {
57*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%1.9gf", x);
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker }
60*c8dee2aaSAndroid Build Coastguard Worker
DebugDumpHexFloat(float x)61*c8dee2aaSAndroid Build Coastguard Worker inline void DebugDumpHexFloat(float x) {
62*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("SkBits2Float(0x%08x)", SkFloat2Bits(x));
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker // if not defined by PathOpsDebug.cpp ...
66*c8dee2aaSAndroid Build Coastguard Worker #if !defined SK_DEBUG && FORCE_RELEASE
ValidWind(int wind)67*c8dee2aaSAndroid Build Coastguard Worker bool SkPathOpsDebug::ValidWind(int wind) {
68*c8dee2aaSAndroid Build Coastguard Worker return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF;
69*c8dee2aaSAndroid Build Coastguard Worker }
70*c8dee2aaSAndroid Build Coastguard Worker
WindingPrintf(int wind)71*c8dee2aaSAndroid Build Coastguard Worker void SkPathOpsDebug::WindingPrintf(int wind) {
72*c8dee2aaSAndroid Build Coastguard Worker if (wind == SK_MinS32) {
73*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("?");
74*c8dee2aaSAndroid Build Coastguard Worker } else {
75*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%d", wind);
76*c8dee2aaSAndroid Build Coastguard Worker }
77*c8dee2aaSAndroid Build Coastguard Worker }
78*c8dee2aaSAndroid Build Coastguard Worker #endif
79*c8dee2aaSAndroid Build Coastguard Worker
DumpID(int id)80*c8dee2aaSAndroid Build Coastguard Worker static void DumpID(int id) {
81*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("} ");
82*c8dee2aaSAndroid Build Coastguard Worker if (id >= 0) {
83*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("id=%d", id);
84*c8dee2aaSAndroid Build Coastguard Worker }
85*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
86*c8dee2aaSAndroid Build Coastguard Worker }
87*c8dee2aaSAndroid Build Coastguard Worker
dump() const88*c8dee2aaSAndroid Build Coastguard Worker void SkDConic::dump() const {
89*c8dee2aaSAndroid Build Coastguard Worker dumpInner();
90*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("},\n");
91*c8dee2aaSAndroid Build Coastguard Worker }
92*c8dee2aaSAndroid Build Coastguard Worker
dumpID(int id) const93*c8dee2aaSAndroid Build Coastguard Worker void SkDConic::dumpID(int id) const {
94*c8dee2aaSAndroid Build Coastguard Worker dumpInner();
95*c8dee2aaSAndroid Build Coastguard Worker DumpID(id);
96*c8dee2aaSAndroid Build Coastguard Worker }
97*c8dee2aaSAndroid Build Coastguard Worker
dumpInner() const98*c8dee2aaSAndroid Build Coastguard Worker void SkDConic::dumpInner() const {
99*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{");
100*c8dee2aaSAndroid Build Coastguard Worker fPts.dumpInner();
101*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}}, %1.9gf", fWeight);
102*c8dee2aaSAndroid Build Coastguard Worker }
103*c8dee2aaSAndroid Build Coastguard Worker
dump() const104*c8dee2aaSAndroid Build Coastguard Worker void SkDCubic::dump() const {
105*c8dee2aaSAndroid Build Coastguard Worker this->dumpInner();
106*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}},\n");
107*c8dee2aaSAndroid Build Coastguard Worker }
108*c8dee2aaSAndroid Build Coastguard Worker
dumpID(int id) const109*c8dee2aaSAndroid Build Coastguard Worker void SkDCubic::dumpID(int id) const {
110*c8dee2aaSAndroid Build Coastguard Worker this->dumpInner();
111*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}");
112*c8dee2aaSAndroid Build Coastguard Worker DumpID(id);
113*c8dee2aaSAndroid Build Coastguard Worker }
114*c8dee2aaSAndroid Build Coastguard Worker
double_is_NaN(double x)115*c8dee2aaSAndroid Build Coastguard Worker static inline bool double_is_NaN(double x) { return x != x; }
116*c8dee2aaSAndroid Build Coastguard Worker
dumpInner() const117*c8dee2aaSAndroid Build Coastguard Worker void SkDCubic::dumpInner() const {
118*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{{");
119*c8dee2aaSAndroid Build Coastguard Worker int index = 0;
120*c8dee2aaSAndroid Build Coastguard Worker do {
121*c8dee2aaSAndroid Build Coastguard Worker if (index != 0) {
122*c8dee2aaSAndroid Build Coastguard Worker if (double_is_NaN(fPts[index].fX) && double_is_NaN(fPts[index].fY)) {
123*c8dee2aaSAndroid Build Coastguard Worker return;
124*c8dee2aaSAndroid Build Coastguard Worker }
125*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker fPts[index].dump();
128*c8dee2aaSAndroid Build Coastguard Worker } while (++index < 3);
129*c8dee2aaSAndroid Build Coastguard Worker if (double_is_NaN(fPts[index].fX) && double_is_NaN(fPts[index].fY)) {
130*c8dee2aaSAndroid Build Coastguard Worker return;
131*c8dee2aaSAndroid Build Coastguard Worker }
132*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
133*c8dee2aaSAndroid Build Coastguard Worker fPts[index].dump();
134*c8dee2aaSAndroid Build Coastguard Worker }
135*c8dee2aaSAndroid Build Coastguard Worker
dump() const136*c8dee2aaSAndroid Build Coastguard Worker void SkDCurve::dump() const {
137*c8dee2aaSAndroid Build Coastguard Worker dumpID(-1);
138*c8dee2aaSAndroid Build Coastguard Worker }
139*c8dee2aaSAndroid Build Coastguard Worker
dumpID(int id) const140*c8dee2aaSAndroid Build Coastguard Worker void SkDCurve::dumpID(int id) const {
141*c8dee2aaSAndroid Build Coastguard Worker #ifndef SK_RELEASE
142*c8dee2aaSAndroid Build Coastguard Worker switch(fVerb) {
143*c8dee2aaSAndroid Build Coastguard Worker case SkPath::kLine_Verb:
144*c8dee2aaSAndroid Build Coastguard Worker fLine.dumpID(id);
145*c8dee2aaSAndroid Build Coastguard Worker break;
146*c8dee2aaSAndroid Build Coastguard Worker case SkPath::kQuad_Verb:
147*c8dee2aaSAndroid Build Coastguard Worker fQuad.dumpID(id);
148*c8dee2aaSAndroid Build Coastguard Worker break;
149*c8dee2aaSAndroid Build Coastguard Worker case SkPath::kConic_Verb:
150*c8dee2aaSAndroid Build Coastguard Worker fConic.dumpID(id);
151*c8dee2aaSAndroid Build Coastguard Worker break;
152*c8dee2aaSAndroid Build Coastguard Worker case SkPath::kCubic_Verb:
153*c8dee2aaSAndroid Build Coastguard Worker fCubic.dumpID(id);
154*c8dee2aaSAndroid Build Coastguard Worker break;
155*c8dee2aaSAndroid Build Coastguard Worker default:
156*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(0);
157*c8dee2aaSAndroid Build Coastguard Worker }
158*c8dee2aaSAndroid Build Coastguard Worker #else
159*c8dee2aaSAndroid Build Coastguard Worker fCubic.dumpID(id);
160*c8dee2aaSAndroid Build Coastguard Worker #endif
161*c8dee2aaSAndroid Build Coastguard Worker }
162*c8dee2aaSAndroid Build Coastguard Worker
dump() const163*c8dee2aaSAndroid Build Coastguard Worker void SkDLine::dump() const {
164*c8dee2aaSAndroid Build Coastguard Worker this->dumpInner();
165*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}},\n");
166*c8dee2aaSAndroid Build Coastguard Worker }
167*c8dee2aaSAndroid Build Coastguard Worker
dumpID(int id) const168*c8dee2aaSAndroid Build Coastguard Worker void SkDLine::dumpID(int id) const {
169*c8dee2aaSAndroid Build Coastguard Worker this->dumpInner();
170*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}");
171*c8dee2aaSAndroid Build Coastguard Worker DumpID(id);
172*c8dee2aaSAndroid Build Coastguard Worker }
173*c8dee2aaSAndroid Build Coastguard Worker
dumpInner() const174*c8dee2aaSAndroid Build Coastguard Worker void SkDLine::dumpInner() const {
175*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{{");
176*c8dee2aaSAndroid Build Coastguard Worker fPts[0].dump();
177*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
178*c8dee2aaSAndroid Build Coastguard Worker fPts[1].dump();
179*c8dee2aaSAndroid Build Coastguard Worker }
180*c8dee2aaSAndroid Build Coastguard Worker
dump() const181*c8dee2aaSAndroid Build Coastguard Worker void SkDPoint::dump() const {
182*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{");
183*c8dee2aaSAndroid Build Coastguard Worker DebugDumpDouble(fX);
184*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
185*c8dee2aaSAndroid Build Coastguard Worker DebugDumpDouble(fY);
186*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}");
187*c8dee2aaSAndroid Build Coastguard Worker }
188*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkPoint & pt)189*c8dee2aaSAndroid Build Coastguard Worker void SkDPoint::Dump(const SkPoint& pt) {
190*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{");
191*c8dee2aaSAndroid Build Coastguard Worker DebugDumpFloat(pt.fX);
192*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
193*c8dee2aaSAndroid Build Coastguard Worker DebugDumpFloat(pt.fY);
194*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}");
195*c8dee2aaSAndroid Build Coastguard Worker }
196*c8dee2aaSAndroid Build Coastguard Worker
DumpHex(const SkPoint & pt)197*c8dee2aaSAndroid Build Coastguard Worker void SkDPoint::DumpHex(const SkPoint& pt) {
198*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{");
199*c8dee2aaSAndroid Build Coastguard Worker DebugDumpHexFloat(pt.fX);
200*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
201*c8dee2aaSAndroid Build Coastguard Worker DebugDumpHexFloat(pt.fY);
202*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}");
203*c8dee2aaSAndroid Build Coastguard Worker }
204*c8dee2aaSAndroid Build Coastguard Worker
dump() const205*c8dee2aaSAndroid Build Coastguard Worker void SkDQuad::dump() const {
206*c8dee2aaSAndroid Build Coastguard Worker dumpInner();
207*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}},\n");
208*c8dee2aaSAndroid Build Coastguard Worker }
209*c8dee2aaSAndroid Build Coastguard Worker
dumpID(int id) const210*c8dee2aaSAndroid Build Coastguard Worker void SkDQuad::dumpID(int id) const {
211*c8dee2aaSAndroid Build Coastguard Worker dumpInner();
212*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}");
213*c8dee2aaSAndroid Build Coastguard Worker DumpID(id);
214*c8dee2aaSAndroid Build Coastguard Worker }
215*c8dee2aaSAndroid Build Coastguard Worker
dumpInner() const216*c8dee2aaSAndroid Build Coastguard Worker void SkDQuad::dumpInner() const {
217*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{{");
218*c8dee2aaSAndroid Build Coastguard Worker int index = 0;
219*c8dee2aaSAndroid Build Coastguard Worker do {
220*c8dee2aaSAndroid Build Coastguard Worker fPts[index].dump();
221*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
222*c8dee2aaSAndroid Build Coastguard Worker } while (++index < 2);
223*c8dee2aaSAndroid Build Coastguard Worker fPts[index].dump();
224*c8dee2aaSAndroid Build Coastguard Worker }
225*c8dee2aaSAndroid Build Coastguard Worker
dump() const226*c8dee2aaSAndroid Build Coastguard Worker void SkIntersections::dump() const {
227*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("used=%d of %d", fUsed, fMax);
228*c8dee2aaSAndroid Build Coastguard Worker for (int index = 0; index < fUsed; ++index) {
229*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" t=(%s%1.9g,%s%1.9g) pt=(%1.9g,%1.9g)",
230*c8dee2aaSAndroid Build Coastguard Worker fIsCoincident[0] & (1 << index) ? "*" : "", fT[0][index],
231*c8dee2aaSAndroid Build Coastguard Worker fIsCoincident[1] & (1 << index) ? "*" : "", fT[1][index],
232*c8dee2aaSAndroid Build Coastguard Worker fPt[index].fX, fPt[index].fY);
233*c8dee2aaSAndroid Build Coastguard Worker if (index < 2 && fNearlySame[index]) {
234*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" pt2=(%1.9g,%1.9g)",fPt2[index].fX, fPt2[index].fY);
235*c8dee2aaSAndroid Build Coastguard Worker }
236*c8dee2aaSAndroid Build Coastguard Worker }
237*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
238*c8dee2aaSAndroid Build Coastguard Worker }
239*c8dee2aaSAndroid Build Coastguard Worker
AngleAngle(const SkOpAngle * angle,int id)240*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* AngleAngle(const SkOpAngle* angle, int id) {
241*c8dee2aaSAndroid Build Coastguard Worker return angle->debugAngle(id);
242*c8dee2aaSAndroid Build Coastguard Worker }
243*c8dee2aaSAndroid Build Coastguard Worker
AngleContour(SkOpAngle * angle,int id)244*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* AngleContour(SkOpAngle* angle, int id) {
245*c8dee2aaSAndroid Build Coastguard Worker return angle->debugContour(id);
246*c8dee2aaSAndroid Build Coastguard Worker }
247*c8dee2aaSAndroid Build Coastguard Worker
AnglePtT(const SkOpAngle * angle,int id)248*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* AnglePtT(const SkOpAngle* angle, int id) {
249*c8dee2aaSAndroid Build Coastguard Worker return angle->debugPtT(id);
250*c8dee2aaSAndroid Build Coastguard Worker }
251*c8dee2aaSAndroid Build Coastguard Worker
AngleSegment(const SkOpAngle * angle,int id)252*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* AngleSegment(const SkOpAngle* angle, int id) {
253*c8dee2aaSAndroid Build Coastguard Worker return angle->debugSegment(id);
254*c8dee2aaSAndroid Build Coastguard Worker }
255*c8dee2aaSAndroid Build Coastguard Worker
AngleSpan(const SkOpAngle * angle,int id)256*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* AngleSpan(const SkOpAngle* angle, int id) {
257*c8dee2aaSAndroid Build Coastguard Worker return angle->debugSpan(id);
258*c8dee2aaSAndroid Build Coastguard Worker }
259*c8dee2aaSAndroid Build Coastguard Worker
ContourAngle(SkOpContour * contour,int id)260*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* ContourAngle(SkOpContour* contour, int id) {
261*c8dee2aaSAndroid Build Coastguard Worker return contour->debugAngle(id);
262*c8dee2aaSAndroid Build Coastguard Worker }
263*c8dee2aaSAndroid Build Coastguard Worker
ContourContour(SkOpContour * contour,int id)264*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* ContourContour(SkOpContour* contour, int id) {
265*c8dee2aaSAndroid Build Coastguard Worker return contour->debugContour(id);
266*c8dee2aaSAndroid Build Coastguard Worker }
267*c8dee2aaSAndroid Build Coastguard Worker
ContourPtT(SkOpContour * contour,int id)268*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* ContourPtT(SkOpContour* contour, int id) {
269*c8dee2aaSAndroid Build Coastguard Worker return contour->debugPtT(id);
270*c8dee2aaSAndroid Build Coastguard Worker }
271*c8dee2aaSAndroid Build Coastguard Worker
ContourSegment(SkOpContour * contour,int id)272*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* ContourSegment(SkOpContour* contour, int id) {
273*c8dee2aaSAndroid Build Coastguard Worker return contour->debugSegment(id);
274*c8dee2aaSAndroid Build Coastguard Worker }
275*c8dee2aaSAndroid Build Coastguard Worker
ContourSpan(SkOpContour * contour,int id)276*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* ContourSpan(SkOpContour* contour, int id) {
277*c8dee2aaSAndroid Build Coastguard Worker return contour->debugSpan(id);
278*c8dee2aaSAndroid Build Coastguard Worker }
279*c8dee2aaSAndroid Build Coastguard Worker
CoincidenceAngle(SkOpCoincidence * coin,int id)280*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* CoincidenceAngle(SkOpCoincidence* coin, int id) {
281*c8dee2aaSAndroid Build Coastguard Worker return coin->debugAngle(id);
282*c8dee2aaSAndroid Build Coastguard Worker }
283*c8dee2aaSAndroid Build Coastguard Worker
CoincidenceContour(SkOpCoincidence * coin,int id)284*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* CoincidenceContour(SkOpCoincidence* coin, int id) {
285*c8dee2aaSAndroid Build Coastguard Worker return coin->debugContour(id);
286*c8dee2aaSAndroid Build Coastguard Worker }
287*c8dee2aaSAndroid Build Coastguard Worker
CoincidencePtT(SkOpCoincidence * coin,int id)288*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* CoincidencePtT(SkOpCoincidence* coin, int id) {
289*c8dee2aaSAndroid Build Coastguard Worker return coin->debugPtT(id);
290*c8dee2aaSAndroid Build Coastguard Worker }
291*c8dee2aaSAndroid Build Coastguard Worker
CoincidenceSegment(SkOpCoincidence * coin,int id)292*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* CoincidenceSegment(SkOpCoincidence* coin, int id) {
293*c8dee2aaSAndroid Build Coastguard Worker return coin->debugSegment(id);
294*c8dee2aaSAndroid Build Coastguard Worker }
295*c8dee2aaSAndroid Build Coastguard Worker
CoincidenceSpan(SkOpCoincidence * coin,int id)296*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* CoincidenceSpan(SkOpCoincidence* coin, int id) {
297*c8dee2aaSAndroid Build Coastguard Worker return coin->debugSpan(id);
298*c8dee2aaSAndroid Build Coastguard Worker }
299*c8dee2aaSAndroid Build Coastguard Worker
PtTAngle(const SkOpPtT * ptT,int id)300*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* PtTAngle(const SkOpPtT* ptT, int id) {
301*c8dee2aaSAndroid Build Coastguard Worker return ptT->debugAngle(id);
302*c8dee2aaSAndroid Build Coastguard Worker }
303*c8dee2aaSAndroid Build Coastguard Worker
PtTContour(SkOpPtT * ptT,int id)304*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* PtTContour(SkOpPtT* ptT, int id) {
305*c8dee2aaSAndroid Build Coastguard Worker return ptT->debugContour(id);
306*c8dee2aaSAndroid Build Coastguard Worker }
307*c8dee2aaSAndroid Build Coastguard Worker
PtTPtT(const SkOpPtT * ptT,int id)308*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* PtTPtT(const SkOpPtT* ptT, int id) {
309*c8dee2aaSAndroid Build Coastguard Worker return ptT->debugPtT(id);
310*c8dee2aaSAndroid Build Coastguard Worker }
311*c8dee2aaSAndroid Build Coastguard Worker
PtTSegment(const SkOpPtT * ptT,int id)312*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* PtTSegment(const SkOpPtT* ptT, int id) {
313*c8dee2aaSAndroid Build Coastguard Worker return ptT->debugSegment(id);
314*c8dee2aaSAndroid Build Coastguard Worker }
315*c8dee2aaSAndroid Build Coastguard Worker
PtTSpan(const SkOpPtT * ptT,int id)316*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* PtTSpan(const SkOpPtT* ptT, int id) {
317*c8dee2aaSAndroid Build Coastguard Worker return ptT->debugSpan(id);
318*c8dee2aaSAndroid Build Coastguard Worker }
319*c8dee2aaSAndroid Build Coastguard Worker
SegmentAngle(const SkOpSegment * span,int id)320*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* SegmentAngle(const SkOpSegment* span, int id) {
321*c8dee2aaSAndroid Build Coastguard Worker return span->debugAngle(id);
322*c8dee2aaSAndroid Build Coastguard Worker }
323*c8dee2aaSAndroid Build Coastguard Worker
SegmentContour(SkOpSegment * span,int id)324*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* SegmentContour(SkOpSegment* span, int id) {
325*c8dee2aaSAndroid Build Coastguard Worker return span->debugContour(id);
326*c8dee2aaSAndroid Build Coastguard Worker }
327*c8dee2aaSAndroid Build Coastguard Worker
SegmentPtT(const SkOpSegment * span,int id)328*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* SegmentPtT(const SkOpSegment* span, int id) {
329*c8dee2aaSAndroid Build Coastguard Worker return span->debugPtT(id);
330*c8dee2aaSAndroid Build Coastguard Worker }
331*c8dee2aaSAndroid Build Coastguard Worker
SegmentSegment(const SkOpSegment * span,int id)332*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* SegmentSegment(const SkOpSegment* span, int id) {
333*c8dee2aaSAndroid Build Coastguard Worker return span->debugSegment(id);
334*c8dee2aaSAndroid Build Coastguard Worker }
335*c8dee2aaSAndroid Build Coastguard Worker
SegmentSpan(const SkOpSegment * span,int id)336*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* SegmentSpan(const SkOpSegment* span, int id) {
337*c8dee2aaSAndroid Build Coastguard Worker return span->debugSpan(id);
338*c8dee2aaSAndroid Build Coastguard Worker }
339*c8dee2aaSAndroid Build Coastguard Worker
SpanAngle(const SkOpSpanBase * span,int id)340*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* SpanAngle(const SkOpSpanBase* span, int id) {
341*c8dee2aaSAndroid Build Coastguard Worker return span->debugAngle(id);
342*c8dee2aaSAndroid Build Coastguard Worker }
343*c8dee2aaSAndroid Build Coastguard Worker
SpanContour(SkOpSpanBase * span,int id)344*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* SpanContour(SkOpSpanBase* span, int id) {
345*c8dee2aaSAndroid Build Coastguard Worker return span->debugContour(id);
346*c8dee2aaSAndroid Build Coastguard Worker }
347*c8dee2aaSAndroid Build Coastguard Worker
SpanPtT(const SkOpSpanBase * span,int id)348*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* SpanPtT(const SkOpSpanBase* span, int id) {
349*c8dee2aaSAndroid Build Coastguard Worker return span->debugPtT(id);
350*c8dee2aaSAndroid Build Coastguard Worker }
351*c8dee2aaSAndroid Build Coastguard Worker
SpanSegment(const SkOpSpanBase * span,int id)352*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* SpanSegment(const SkOpSpanBase* span, int id) {
353*c8dee2aaSAndroid Build Coastguard Worker return span->debugSegment(id);
354*c8dee2aaSAndroid Build Coastguard Worker }
355*c8dee2aaSAndroid Build Coastguard Worker
SpanSpan(const SkOpSpanBase * span,int id)356*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* SpanSpan(const SkOpSpanBase* span, int id) {
357*c8dee2aaSAndroid Build Coastguard Worker return span->debugSpan(id);
358*c8dee2aaSAndroid Build Coastguard Worker }
359*c8dee2aaSAndroid Build Coastguard Worker
360*c8dee2aaSAndroid Build Coastguard Worker #if DEBUG_COIN
DumpCoinDict()361*c8dee2aaSAndroid Build Coastguard Worker void SkPathOpsDebug::DumpCoinDict() {
362*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsDebug::gCoinSumChangedDict.dump("unused coin algorithm", false);
363*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsDebug::gCoinSumVisitedDict.dump("visited coin function", true);
364*c8dee2aaSAndroid Build Coastguard Worker }
365*c8dee2aaSAndroid Build Coastguard Worker
dump(const char * str,bool visitCheck) const366*c8dee2aaSAndroid Build Coastguard Worker void SkPathOpsDebug::CoinDict::dump(const char* str, bool visitCheck) const {
367*c8dee2aaSAndroid Build Coastguard Worker int count = fDict.size();
368*c8dee2aaSAndroid Build Coastguard Worker for (int index = 0; index < count; ++index) {
369*c8dee2aaSAndroid Build Coastguard Worker const auto& entry = fDict[index];
370*c8dee2aaSAndroid Build Coastguard Worker if (visitCheck || entry.fGlitchType == kUninitialized_Glitch) {
371*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%s %s : line %d iteration %d", str, entry.fFunctionName,
372*c8dee2aaSAndroid Build Coastguard Worker entry.fLineNumber, entry.fIteration);
373*c8dee2aaSAndroid Build Coastguard Worker DumpGlitchType(entry.fGlitchType);
374*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
375*c8dee2aaSAndroid Build Coastguard Worker }
376*c8dee2aaSAndroid Build Coastguard Worker }
377*c8dee2aaSAndroid Build Coastguard Worker }
378*c8dee2aaSAndroid Build Coastguard Worker #endif
379*c8dee2aaSAndroid Build Coastguard Worker
dumpContours() const380*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContours() const {
381*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
382*c8dee2aaSAndroid Build Coastguard Worker do {
383*c8dee2aaSAndroid Build Coastguard Worker contour->dump();
384*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
385*c8dee2aaSAndroid Build Coastguard Worker }
386*c8dee2aaSAndroid Build Coastguard Worker
dumpContoursAll() const387*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContoursAll() const {
388*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
389*c8dee2aaSAndroid Build Coastguard Worker do {
390*c8dee2aaSAndroid Build Coastguard Worker contour->dumpAll();
391*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
392*c8dee2aaSAndroid Build Coastguard Worker }
393*c8dee2aaSAndroid Build Coastguard Worker
dumpContoursAngles() const394*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContoursAngles() const {
395*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
396*c8dee2aaSAndroid Build Coastguard Worker do {
397*c8dee2aaSAndroid Build Coastguard Worker contour->dumpAngles();
398*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
399*c8dee2aaSAndroid Build Coastguard Worker }
400*c8dee2aaSAndroid Build Coastguard Worker
dumpContoursPts() const401*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContoursPts() const {
402*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
403*c8dee2aaSAndroid Build Coastguard Worker do {
404*c8dee2aaSAndroid Build Coastguard Worker contour->dumpPts();
405*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
406*c8dee2aaSAndroid Build Coastguard Worker }
407*c8dee2aaSAndroid Build Coastguard Worker
dumpContoursPt(int segmentID) const408*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContoursPt(int segmentID) const {
409*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
410*c8dee2aaSAndroid Build Coastguard Worker do {
411*c8dee2aaSAndroid Build Coastguard Worker contour->dumpPt(segmentID);
412*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
413*c8dee2aaSAndroid Build Coastguard Worker }
414*c8dee2aaSAndroid Build Coastguard Worker
dumpContoursSegment(int segmentID) const415*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContoursSegment(int segmentID) const {
416*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
417*c8dee2aaSAndroid Build Coastguard Worker do {
418*c8dee2aaSAndroid Build Coastguard Worker contour->dumpSegment(segmentID);
419*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
420*c8dee2aaSAndroid Build Coastguard Worker }
421*c8dee2aaSAndroid Build Coastguard Worker
dumpContoursSpan(int spanID) const422*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContoursSpan(int spanID) const {
423*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
424*c8dee2aaSAndroid Build Coastguard Worker do {
425*c8dee2aaSAndroid Build Coastguard Worker contour->dumpSpan(spanID);
426*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
427*c8dee2aaSAndroid Build Coastguard Worker }
428*c8dee2aaSAndroid Build Coastguard Worker
dumpContoursSpans() const429*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpContoursSpans() const {
430*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = this->globalState()->contourHead();
431*c8dee2aaSAndroid Build Coastguard Worker do {
432*c8dee2aaSAndroid Build Coastguard Worker contour->dumpSpans();
433*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
434*c8dee2aaSAndroid Build Coastguard Worker }
435*c8dee2aaSAndroid Build Coastguard Worker
436*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
DebugSpan(const SkTSect * sect,int id)437*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* DebugSpan(const SkTSect* sect, int id) {
438*c8dee2aaSAndroid Build Coastguard Worker return sect->debugSpan(id);
439*c8dee2aaSAndroid Build Coastguard Worker }
440*c8dee2aaSAndroid Build Coastguard Worker
DebugT(const SkTSect * sect,double t)441*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* DebugT(const SkTSect* sect, double t) {
442*c8dee2aaSAndroid Build Coastguard Worker return sect->debugT(t);
443*c8dee2aaSAndroid Build Coastguard Worker }
444*c8dee2aaSAndroid Build Coastguard Worker #endif
445*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkTSect * sect)446*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkTSect* sect) {
447*c8dee2aaSAndroid Build Coastguard Worker sect->dump();
448*c8dee2aaSAndroid Build Coastguard Worker }
449*c8dee2aaSAndroid Build Coastguard Worker
DumpBoth(SkTSect * sect1,SkTSect * sect2)450*c8dee2aaSAndroid Build Coastguard Worker void DumpBoth(SkTSect* sect1, SkTSect* sect2) {
451*c8dee2aaSAndroid Build Coastguard Worker sect1->dumpBoth(sect2);
452*c8dee2aaSAndroid Build Coastguard Worker }
453*c8dee2aaSAndroid Build Coastguard Worker
DumpBounded(SkTSect * sect1,int id)454*c8dee2aaSAndroid Build Coastguard Worker void DumpBounded(SkTSect* sect1, int id) {
455*c8dee2aaSAndroid Build Coastguard Worker sect1->dumpBounded(id);
456*c8dee2aaSAndroid Build Coastguard Worker }
457*c8dee2aaSAndroid Build Coastguard Worker
DumpBounds(SkTSect * sect1)458*c8dee2aaSAndroid Build Coastguard Worker void DumpBounds(SkTSect* sect1) {
459*c8dee2aaSAndroid Build Coastguard Worker sect1->dumpBounds();
460*c8dee2aaSAndroid Build Coastguard Worker }
461*c8dee2aaSAndroid Build Coastguard Worker
DumpCoin(SkTSect * sect1)462*c8dee2aaSAndroid Build Coastguard Worker void DumpCoin(SkTSect* sect1) {
463*c8dee2aaSAndroid Build Coastguard Worker sect1->dumpCoin();
464*c8dee2aaSAndroid Build Coastguard Worker }
465*c8dee2aaSAndroid Build Coastguard Worker
DumpCoinCurves(SkTSect * sect1)466*c8dee2aaSAndroid Build Coastguard Worker void DumpCoinCurves(SkTSect* sect1) {
467*c8dee2aaSAndroid Build Coastguard Worker sect1->dumpCoinCurves();
468*c8dee2aaSAndroid Build Coastguard Worker }
469*c8dee2aaSAndroid Build Coastguard Worker
DumpCurves(const SkTSect * sect)470*c8dee2aaSAndroid Build Coastguard Worker void DumpCurves(const SkTSect* sect) {
471*c8dee2aaSAndroid Build Coastguard Worker sect->dumpCurves();
472*c8dee2aaSAndroid Build Coastguard Worker }
473*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkTSpan * span)474*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkTSpan* span) {
475*c8dee2aaSAndroid Build Coastguard Worker span->dump();
476*c8dee2aaSAndroid Build Coastguard Worker }
477*c8dee2aaSAndroid Build Coastguard Worker
DumpAll(const SkTSpan * span)478*c8dee2aaSAndroid Build Coastguard Worker void DumpAll(const SkTSpan* span) {
479*c8dee2aaSAndroid Build Coastguard Worker span->dumpAll();
480*c8dee2aaSAndroid Build Coastguard Worker }
481*c8dee2aaSAndroid Build Coastguard Worker
DumpBounded(const SkTSpan * span)482*c8dee2aaSAndroid Build Coastguard Worker void DumpBounded(const SkTSpan* span) {
483*c8dee2aaSAndroid Build Coastguard Worker span->dumpBounded(0);
484*c8dee2aaSAndroid Build Coastguard Worker }
485*c8dee2aaSAndroid Build Coastguard Worker
DumpCoin(const SkTSpan * span)486*c8dee2aaSAndroid Build Coastguard Worker void DumpCoin(const SkTSpan* span) {
487*c8dee2aaSAndroid Build Coastguard Worker span->dumpCoin();
488*c8dee2aaSAndroid Build Coastguard Worker }
489*c8dee2aaSAndroid Build Coastguard Worker
dumpTestCase(const SkDQuad & quad1,const SkDQuad & quad2,int testNo)490*c8dee2aaSAndroid Build Coastguard Worker static void dumpTestCase(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) {
491*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n<div id=\"quad%d\">\n", testNo);
492*c8dee2aaSAndroid Build Coastguard Worker quad1.dumpInner();
493*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}}, ");
494*c8dee2aaSAndroid Build Coastguard Worker quad2.dump();
495*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("</div>\n\n");
496*c8dee2aaSAndroid Build Coastguard Worker }
497*c8dee2aaSAndroid Build Coastguard Worker
dumpTestTrailer()498*c8dee2aaSAndroid Build Coastguard Worker static void dumpTestTrailer() {
499*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("</div>\n\n<script type=\"text/javascript\">\n\n");
500*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" var testDivs = [\n");
501*c8dee2aaSAndroid Build Coastguard Worker }
502*c8dee2aaSAndroid Build Coastguard Worker
dumpTestList(int testNo,double min)503*c8dee2aaSAndroid Build Coastguard Worker static void dumpTestList(int testNo, double min) {
504*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" quad%d,", testNo);
505*c8dee2aaSAndroid Build Coastguard Worker if (min > 0) {
506*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" // %1.9g", min);
507*c8dee2aaSAndroid Build Coastguard Worker }
508*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
509*c8dee2aaSAndroid Build Coastguard Worker }
510*c8dee2aaSAndroid Build Coastguard Worker
DumpQ(const SkDQuad & quad1,const SkDQuad & quad2,int testNo)511*c8dee2aaSAndroid Build Coastguard Worker void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) {
512*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
513*c8dee2aaSAndroid Build Coastguard Worker dumpTestCase(quad1, quad2, testNo);
514*c8dee2aaSAndroid Build Coastguard Worker dumpTestTrailer();
515*c8dee2aaSAndroid Build Coastguard Worker dumpTestList(testNo, 0);
516*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
517*c8dee2aaSAndroid Build Coastguard Worker }
518*c8dee2aaSAndroid Build Coastguard Worker
DumpT(const SkDQuad & quad,double t)519*c8dee2aaSAndroid Build Coastguard Worker void DumpT(const SkDQuad& quad, double t) {
520*c8dee2aaSAndroid Build Coastguard Worker SkDLine line = {{quad.ptAtT(t), quad[0]}};
521*c8dee2aaSAndroid Build Coastguard Worker line.dump();
522*c8dee2aaSAndroid Build Coastguard Worker }
523*c8dee2aaSAndroid Build Coastguard Worker
debugAngle(int id) const524*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* SkOpAngle::debugAngle(int id) const {
525*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugAngle(id);
526*c8dee2aaSAndroid Build Coastguard Worker }
527*c8dee2aaSAndroid Build Coastguard Worker
debugCoincidence() const528*c8dee2aaSAndroid Build Coastguard Worker const SkOpCoincidence* SkOpAngle::debugCoincidence() const {
529*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugCoincidence();
530*c8dee2aaSAndroid Build Coastguard Worker }
531*c8dee2aaSAndroid Build Coastguard Worker
debugContour(int id) const532*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* SkOpAngle::debugContour(int id) const {
533*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugContour(id);
534*c8dee2aaSAndroid Build Coastguard Worker }
535*c8dee2aaSAndroid Build Coastguard Worker
debugPtT(int id) const536*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* SkOpAngle::debugPtT(int id) const {
537*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugPtT(id);
538*c8dee2aaSAndroid Build Coastguard Worker }
539*c8dee2aaSAndroid Build Coastguard Worker
debugSegment(int id) const540*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* SkOpAngle::debugSegment(int id) const {
541*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugSegment(id);
542*c8dee2aaSAndroid Build Coastguard Worker }
543*c8dee2aaSAndroid Build Coastguard Worker
debugSign() const544*c8dee2aaSAndroid Build Coastguard Worker int SkOpAngle::debugSign() const {
545*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fStart->t() != fEnd->t());
546*c8dee2aaSAndroid Build Coastguard Worker return fStart->t() < fEnd->t() ? -1 : 1;
547*c8dee2aaSAndroid Build Coastguard Worker }
548*c8dee2aaSAndroid Build Coastguard Worker
debugSpan(int id) const549*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* SkOpAngle::debugSpan(int id) const {
550*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugSpan(id);
551*c8dee2aaSAndroid Build Coastguard Worker }
552*c8dee2aaSAndroid Build Coastguard Worker
dump() const553*c8dee2aaSAndroid Build Coastguard Worker void SkOpAngle::dump() const {
554*c8dee2aaSAndroid Build Coastguard Worker dumpOne(true);
555*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
556*c8dee2aaSAndroid Build Coastguard Worker }
557*c8dee2aaSAndroid Build Coastguard Worker
dumpOne(bool functionHeader) const558*c8dee2aaSAndroid Build Coastguard Worker void SkOpAngle::dumpOne(bool functionHeader) const {
559*c8dee2aaSAndroid Build Coastguard Worker // fSegment->debugValidate();
560*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = this->segment();
561*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpan& mSpan = *fStart->starter(fEnd);
562*c8dee2aaSAndroid Build Coastguard Worker if (functionHeader) {
563*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%s ", __FUNCTION__);
564*c8dee2aaSAndroid Build Coastguard Worker }
565*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("[%d", segment->debugID());
566*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("/%d", debugID());
567*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("] next=");
568*c8dee2aaSAndroid Build Coastguard Worker if (fNext) {
569*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%d", fNext->fStart->segment()->debugID());
570*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("/%d", fNext->debugID());
571*c8dee2aaSAndroid Build Coastguard Worker } else {
572*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("?");
573*c8dee2aaSAndroid Build Coastguard Worker }
574*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" sect=%d/%d ", fSectorStart, fSectorEnd);
575*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" s=%1.9g [%d] e=%1.9g [%d]", fStart->t(), fStart->debugID(),
576*c8dee2aaSAndroid Build Coastguard Worker fEnd->t(), fEnd->debugID());
577*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" sgn=%d windVal=%d", this->debugSign(), mSpan.windValue());
578*c8dee2aaSAndroid Build Coastguard Worker
579*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" windSum=");
580*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsDebug::WindingPrintf(mSpan.windSum());
581*c8dee2aaSAndroid Build Coastguard Worker if (mSpan.oppValue() != 0 || mSpan.oppSum() != SK_MinS32) {
582*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" oppVal=%d", mSpan.oppValue());
583*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" oppSum=");
584*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsDebug::WindingPrintf(mSpan.oppSum());
585*c8dee2aaSAndroid Build Coastguard Worker }
586*c8dee2aaSAndroid Build Coastguard Worker if (mSpan.done()) {
587*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" done");
588*c8dee2aaSAndroid Build Coastguard Worker }
589*c8dee2aaSAndroid Build Coastguard Worker if (unorderable()) {
590*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" unorderable");
591*c8dee2aaSAndroid Build Coastguard Worker }
592*c8dee2aaSAndroid Build Coastguard Worker if (segment->operand()) {
593*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" operand");
594*c8dee2aaSAndroid Build Coastguard Worker }
595*c8dee2aaSAndroid Build Coastguard Worker }
596*c8dee2aaSAndroid Build Coastguard Worker
dumpTo(const SkOpSegment * segment,const SkOpAngle * to) const597*c8dee2aaSAndroid Build Coastguard Worker void SkOpAngle::dumpTo(const SkOpSegment* segment, const SkOpAngle* to) const {
598*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* first = this;
599*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* next = this;
600*c8dee2aaSAndroid Build Coastguard Worker const char* indent = "";
601*c8dee2aaSAndroid Build Coastguard Worker do {
602*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%s", indent);
603*c8dee2aaSAndroid Build Coastguard Worker next->dumpOne(false);
604*c8dee2aaSAndroid Build Coastguard Worker if (segment == next->fStart->segment()) {
605*c8dee2aaSAndroid Build Coastguard Worker if (this == fNext) {
606*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" << from");
607*c8dee2aaSAndroid Build Coastguard Worker }
608*c8dee2aaSAndroid Build Coastguard Worker if (to == fNext) {
609*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" << to");
610*c8dee2aaSAndroid Build Coastguard Worker }
611*c8dee2aaSAndroid Build Coastguard Worker }
612*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
613*c8dee2aaSAndroid Build Coastguard Worker indent = " ";
614*c8dee2aaSAndroid Build Coastguard Worker next = next->fNext;
615*c8dee2aaSAndroid Build Coastguard Worker } while (next && next != first);
616*c8dee2aaSAndroid Build Coastguard Worker }
617*c8dee2aaSAndroid Build Coastguard Worker
dumpCurves() const618*c8dee2aaSAndroid Build Coastguard Worker void SkOpAngle::dumpCurves() const {
619*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* first = this;
620*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* next = this;
621*c8dee2aaSAndroid Build Coastguard Worker do {
622*c8dee2aaSAndroid Build Coastguard Worker next->fPart.fCurve.dumpID(next->segment()->debugID());
623*c8dee2aaSAndroid Build Coastguard Worker next = next->fNext;
624*c8dee2aaSAndroid Build Coastguard Worker } while (next && next != first);
625*c8dee2aaSAndroid Build Coastguard Worker }
626*c8dee2aaSAndroid Build Coastguard Worker
dumpLoop() const627*c8dee2aaSAndroid Build Coastguard Worker void SkOpAngle::dumpLoop() const {
628*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* first = this;
629*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* next = this;
630*c8dee2aaSAndroid Build Coastguard Worker do {
631*c8dee2aaSAndroid Build Coastguard Worker next->dumpOne(false);
632*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
633*c8dee2aaSAndroid Build Coastguard Worker next = next->fNext;
634*c8dee2aaSAndroid Build Coastguard Worker } while (next && next != first);
635*c8dee2aaSAndroid Build Coastguard Worker }
636*c8dee2aaSAndroid Build Coastguard Worker
dumpTest() const637*c8dee2aaSAndroid Build Coastguard Worker void SkOpAngle::dumpTest() const {
638*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* first = this;
639*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* next = this;
640*c8dee2aaSAndroid Build Coastguard Worker do {
641*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{ ");
642*c8dee2aaSAndroid Build Coastguard Worker SkOpSegment* segment = next->segment();
643*c8dee2aaSAndroid Build Coastguard Worker segment->dumpPts();
644*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", %d, %1.9g, %1.9g, {} },\n", SkPathOpsVerbToPoints(segment->verb()) + 1,
645*c8dee2aaSAndroid Build Coastguard Worker next->start()->t(), next->end()->t());
646*c8dee2aaSAndroid Build Coastguard Worker next = next->fNext;
647*c8dee2aaSAndroid Build Coastguard Worker } while (next && next != first);
648*c8dee2aaSAndroid Build Coastguard Worker }
649*c8dee2aaSAndroid Build Coastguard Worker
debugMatchID(int id) const650*c8dee2aaSAndroid Build Coastguard Worker bool SkOpPtT::debugMatchID(int id) const {
651*c8dee2aaSAndroid Build Coastguard Worker int limit = this->debugLoopLimit(false);
652*c8dee2aaSAndroid Build Coastguard Worker int loop = 0;
653*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* ptT = this;
654*c8dee2aaSAndroid Build Coastguard Worker do {
655*c8dee2aaSAndroid Build Coastguard Worker if (ptT->debugID() == id) {
656*c8dee2aaSAndroid Build Coastguard Worker return true;
657*c8dee2aaSAndroid Build Coastguard Worker }
658*c8dee2aaSAndroid Build Coastguard Worker } while ((!limit || ++loop <= limit) && (ptT = ptT->next()) && ptT != this);
659*c8dee2aaSAndroid Build Coastguard Worker return false;
660*c8dee2aaSAndroid Build Coastguard Worker }
661*c8dee2aaSAndroid Build Coastguard Worker
debugAngle(int id) const662*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* SkOpPtT::debugAngle(int id) const {
663*c8dee2aaSAndroid Build Coastguard Worker return this->span()->debugAngle(id);
664*c8dee2aaSAndroid Build Coastguard Worker }
665*c8dee2aaSAndroid Build Coastguard Worker
debugContour(int id) const666*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* SkOpPtT::debugContour(int id) const {
667*c8dee2aaSAndroid Build Coastguard Worker return this->span()->debugContour(id);
668*c8dee2aaSAndroid Build Coastguard Worker }
669*c8dee2aaSAndroid Build Coastguard Worker
debugCoincidence() const670*c8dee2aaSAndroid Build Coastguard Worker const SkOpCoincidence* SkOpPtT::debugCoincidence() const {
671*c8dee2aaSAndroid Build Coastguard Worker return this->span()->debugCoincidence();
672*c8dee2aaSAndroid Build Coastguard Worker }
673*c8dee2aaSAndroid Build Coastguard Worker
debugPtT(int id) const674*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* SkOpPtT::debugPtT(int id) const {
675*c8dee2aaSAndroid Build Coastguard Worker return this->span()->debugPtT(id);
676*c8dee2aaSAndroid Build Coastguard Worker }
677*c8dee2aaSAndroid Build Coastguard Worker
debugSegment(int id) const678*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* SkOpPtT::debugSegment(int id) const {
679*c8dee2aaSAndroid Build Coastguard Worker return this->span()->debugSegment(id);
680*c8dee2aaSAndroid Build Coastguard Worker }
681*c8dee2aaSAndroid Build Coastguard Worker
debugSpan(int id) const682*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* SkOpPtT::debugSpan(int id) const {
683*c8dee2aaSAndroid Build Coastguard Worker return this->span()->debugSpan(id);
684*c8dee2aaSAndroid Build Coastguard Worker }
685*c8dee2aaSAndroid Build Coastguard Worker
dump() const686*c8dee2aaSAndroid Build Coastguard Worker void SkOpPtT::dump() const {
687*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("seg=%d span=%d ptT=%d",
688*c8dee2aaSAndroid Build Coastguard Worker this->segment()->debugID(), this->span()->debugID(), this->debugID());
689*c8dee2aaSAndroid Build Coastguard Worker this->dumpBase();
690*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
691*c8dee2aaSAndroid Build Coastguard Worker }
692*c8dee2aaSAndroid Build Coastguard Worker
dumpAll() const693*c8dee2aaSAndroid Build Coastguard Worker void SkOpPtT::dumpAll() const {
694*c8dee2aaSAndroid Build Coastguard Worker contour()->indentDump();
695*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* next = this;
696*c8dee2aaSAndroid Build Coastguard Worker int limit = debugLoopLimit(true);
697*c8dee2aaSAndroid Build Coastguard Worker int loop = 0;
698*c8dee2aaSAndroid Build Coastguard Worker do {
699*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%.*s", contour()->debugIndent(), " ");
700*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("seg=%d span=%d ptT=%d",
701*c8dee2aaSAndroid Build Coastguard Worker next->segment()->debugID(), next->span()->debugID(), next->debugID());
702*c8dee2aaSAndroid Build Coastguard Worker next->dumpBase();
703*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
704*c8dee2aaSAndroid Build Coastguard Worker if (limit && ++loop >= limit) {
705*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("*** abort loop ***\n");
706*c8dee2aaSAndroid Build Coastguard Worker break;
707*c8dee2aaSAndroid Build Coastguard Worker }
708*c8dee2aaSAndroid Build Coastguard Worker } while ((next = next->fNext) && next != this);
709*c8dee2aaSAndroid Build Coastguard Worker contour()->outdentDump();
710*c8dee2aaSAndroid Build Coastguard Worker }
711*c8dee2aaSAndroid Build Coastguard Worker
dumpBase() const712*c8dee2aaSAndroid Build Coastguard Worker void SkOpPtT::dumpBase() const {
713*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" t=%1.9g pt=(%1.9g,%1.9g)%s%s%s", this->fT, this->fPt.fX, this->fPt.fY,
714*c8dee2aaSAndroid Build Coastguard Worker this->fCoincident ? " coin" : "",
715*c8dee2aaSAndroid Build Coastguard Worker this->fDuplicatePt ? " dup" : "", this->fDeleted ? " deleted" : "");
716*c8dee2aaSAndroid Build Coastguard Worker }
717*c8dee2aaSAndroid Build Coastguard Worker
debugAngle(int id) const718*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* SkOpSpanBase::debugAngle(int id) const {
719*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugAngle(id);
720*c8dee2aaSAndroid Build Coastguard Worker }
721*c8dee2aaSAndroid Build Coastguard Worker
debugCoincidence() const722*c8dee2aaSAndroid Build Coastguard Worker const SkOpCoincidence* SkOpSpanBase::debugCoincidence() const {
723*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugCoincidence();
724*c8dee2aaSAndroid Build Coastguard Worker }
725*c8dee2aaSAndroid Build Coastguard Worker
debugContour(int id) const726*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* SkOpSpanBase::debugContour(int id) const {
727*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugContour(id);
728*c8dee2aaSAndroid Build Coastguard Worker }
729*c8dee2aaSAndroid Build Coastguard Worker
debugPtT(int id) const730*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* SkOpSpanBase::debugPtT(int id) const {
731*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugPtT(id);
732*c8dee2aaSAndroid Build Coastguard Worker }
733*c8dee2aaSAndroid Build Coastguard Worker
debugSegment(int id) const734*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* SkOpSpanBase::debugSegment(int id) const {
735*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugSegment(id);
736*c8dee2aaSAndroid Build Coastguard Worker }
737*c8dee2aaSAndroid Build Coastguard Worker
debugSpan(int id) const738*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* SkOpSpanBase::debugSpan(int id) const {
739*c8dee2aaSAndroid Build Coastguard Worker return this->segment()->debugSpan(id);
740*c8dee2aaSAndroid Build Coastguard Worker }
741*c8dee2aaSAndroid Build Coastguard Worker
dump() const742*c8dee2aaSAndroid Build Coastguard Worker void SkOpSpanBase::dump() const {
743*c8dee2aaSAndroid Build Coastguard Worker this->dumpHead();
744*c8dee2aaSAndroid Build Coastguard Worker this->fPtT.dump();
745*c8dee2aaSAndroid Build Coastguard Worker }
746*c8dee2aaSAndroid Build Coastguard Worker
dumpHead() const747*c8dee2aaSAndroid Build Coastguard Worker void SkOpSpanBase::dumpHead() const {
748*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%.*s", contour()->debugIndent(), " ");
749*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("seg=%d span=%d", this->segment()->debugID(), this->debugID());
750*c8dee2aaSAndroid Build Coastguard Worker this->dumpBase();
751*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
752*c8dee2aaSAndroid Build Coastguard Worker }
753*c8dee2aaSAndroid Build Coastguard Worker
dumpAll() const754*c8dee2aaSAndroid Build Coastguard Worker void SkOpSpanBase::dumpAll() const {
755*c8dee2aaSAndroid Build Coastguard Worker this->dumpHead();
756*c8dee2aaSAndroid Build Coastguard Worker this->fPtT.dumpAll();
757*c8dee2aaSAndroid Build Coastguard Worker }
758*c8dee2aaSAndroid Build Coastguard Worker
dumpBase() const759*c8dee2aaSAndroid Build Coastguard Worker void SkOpSpanBase::dumpBase() const {
760*c8dee2aaSAndroid Build Coastguard Worker if (this->fAligned) {
761*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" aligned");
762*c8dee2aaSAndroid Build Coastguard Worker }
763*c8dee2aaSAndroid Build Coastguard Worker if (this->fChased) {
764*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" chased");
765*c8dee2aaSAndroid Build Coastguard Worker }
766*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
767*c8dee2aaSAndroid Build Coastguard Worker if (this->fDebugDeleted) {
768*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" deleted");
769*c8dee2aaSAndroid Build Coastguard Worker }
770*c8dee2aaSAndroid Build Coastguard Worker #endif
771*c8dee2aaSAndroid Build Coastguard Worker if (!this->final()) {
772*c8dee2aaSAndroid Build Coastguard Worker this->upCast()->dumpSpan();
773*c8dee2aaSAndroid Build Coastguard Worker }
774*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* coin = this->coinEnd();
775*c8dee2aaSAndroid Build Coastguard Worker if (this != coin) {
776*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" coinEnd seg/span=%d/%d", coin->segment()->debugID(), coin->debugID());
777*c8dee2aaSAndroid Build Coastguard Worker } else if (this->final() || !this->upCast()->isCoincident()) {
778*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* oPt = this->ptT()->next();
779*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" seg/span=%d/%d", oPt->segment()->debugID(), oPt->span()->debugID());
780*c8dee2aaSAndroid Build Coastguard Worker }
781*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" adds=%d", fSpanAdds);
782*c8dee2aaSAndroid Build Coastguard Worker }
783*c8dee2aaSAndroid Build Coastguard Worker
dumpCoin() const784*c8dee2aaSAndroid Build Coastguard Worker void SkOpSpanBase::dumpCoin() const {
785*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpan* span = this->upCastable();
786*c8dee2aaSAndroid Build Coastguard Worker if (!span) {
787*c8dee2aaSAndroid Build Coastguard Worker return;
788*c8dee2aaSAndroid Build Coastguard Worker }
789*c8dee2aaSAndroid Build Coastguard Worker if (!span->isCoincident()) {
790*c8dee2aaSAndroid Build Coastguard Worker return;
791*c8dee2aaSAndroid Build Coastguard Worker }
792*c8dee2aaSAndroid Build Coastguard Worker span->dumpCoin();
793*c8dee2aaSAndroid Build Coastguard Worker }
794*c8dee2aaSAndroid Build Coastguard Worker
dumpCoin() const795*c8dee2aaSAndroid Build Coastguard Worker void SkOpSpan::dumpCoin() const {
796*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpan* coincident = fCoincident;
797*c8dee2aaSAndroid Build Coastguard Worker bool ok = debugCoinLoopCheck();
798*c8dee2aaSAndroid Build Coastguard Worker this->dump();
799*c8dee2aaSAndroid Build Coastguard Worker int loop = 0;
800*c8dee2aaSAndroid Build Coastguard Worker do {
801*c8dee2aaSAndroid Build Coastguard Worker coincident->dump();
802*c8dee2aaSAndroid Build Coastguard Worker if (!ok && ++loop > 10) {
803*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("*** abort loop ***\n");
804*c8dee2aaSAndroid Build Coastguard Worker break;
805*c8dee2aaSAndroid Build Coastguard Worker }
806*c8dee2aaSAndroid Build Coastguard Worker } while ((coincident = coincident->fCoincident) != this);
807*c8dee2aaSAndroid Build Coastguard Worker }
808*c8dee2aaSAndroid Build Coastguard Worker
dumpSpan() const809*c8dee2aaSAndroid Build Coastguard Worker bool SkOpSpan::dumpSpan() const {
810*c8dee2aaSAndroid Build Coastguard Worker SkOpSpan* coin = fCoincident;
811*c8dee2aaSAndroid Build Coastguard Worker if (this != coin) {
812*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" coinStart seg/span=%d/%d", coin->segment()->debugID(), coin->debugID());
813*c8dee2aaSAndroid Build Coastguard Worker }
814*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" windVal=%d", this->windValue());
815*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" windSum=");
816*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsDebug::WindingPrintf(this->windSum());
817*c8dee2aaSAndroid Build Coastguard Worker if (this->oppValue() != 0 || this->oppSum() != SK_MinS32) {
818*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" oppVal=%d", this->oppValue());
819*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" oppSum=");
820*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsDebug::WindingPrintf(this->oppSum());
821*c8dee2aaSAndroid Build Coastguard Worker }
822*c8dee2aaSAndroid Build Coastguard Worker if (this->done()) {
823*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" done");
824*c8dee2aaSAndroid Build Coastguard Worker }
825*c8dee2aaSAndroid Build Coastguard Worker return this != coin;
826*c8dee2aaSAndroid Build Coastguard Worker }
827*c8dee2aaSAndroid Build Coastguard Worker
debugAngle(int id) const828*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* SkOpSegment::debugAngle(int id) const {
829*c8dee2aaSAndroid Build Coastguard Worker return this->contour()->debugAngle(id);
830*c8dee2aaSAndroid Build Coastguard Worker }
831*c8dee2aaSAndroid Build Coastguard Worker
debugCoincidence() const832*c8dee2aaSAndroid Build Coastguard Worker const SkOpCoincidence* SkOpSegment::debugCoincidence() const {
833*c8dee2aaSAndroid Build Coastguard Worker return this->contour()->debugCoincidence();
834*c8dee2aaSAndroid Build Coastguard Worker }
835*c8dee2aaSAndroid Build Coastguard Worker
debugContour(int id) const836*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* SkOpSegment::debugContour(int id) const {
837*c8dee2aaSAndroid Build Coastguard Worker return this->contour()->debugContour(id);
838*c8dee2aaSAndroid Build Coastguard Worker }
839*c8dee2aaSAndroid Build Coastguard Worker
debugPtT(int id) const840*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* SkOpSegment::debugPtT(int id) const {
841*c8dee2aaSAndroid Build Coastguard Worker return this->contour()->debugPtT(id);
842*c8dee2aaSAndroid Build Coastguard Worker }
843*c8dee2aaSAndroid Build Coastguard Worker
debugSegment(int id) const844*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* SkOpSegment::debugSegment(int id) const {
845*c8dee2aaSAndroid Build Coastguard Worker return this->contour()->debugSegment(id);
846*c8dee2aaSAndroid Build Coastguard Worker }
847*c8dee2aaSAndroid Build Coastguard Worker
debugSpan(int id) const848*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* SkOpSegment::debugSpan(int id) const {
849*c8dee2aaSAndroid Build Coastguard Worker return this->contour()->debugSpan(id);
850*c8dee2aaSAndroid Build Coastguard Worker }
851*c8dee2aaSAndroid Build Coastguard Worker
dump() const852*c8dee2aaSAndroid Build Coastguard Worker void SkOpSegment::dump() const {
853*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%.*s", contour()->debugIndent(), " ");
854*c8dee2aaSAndroid Build Coastguard Worker this->dumpPts();
855*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* span = &fHead;
856*c8dee2aaSAndroid Build Coastguard Worker contour()->indentDump();
857*c8dee2aaSAndroid Build Coastguard Worker do {
858*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%.*s span=%d ", contour()->debugIndent(), " ", span->debugID());
859*c8dee2aaSAndroid Build Coastguard Worker span->ptT()->dumpBase();
860*c8dee2aaSAndroid Build Coastguard Worker span->dumpBase();
861*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
862*c8dee2aaSAndroid Build Coastguard Worker } while (!span->final() && (span = span->upCast()->next()));
863*c8dee2aaSAndroid Build Coastguard Worker contour()->outdentDump();
864*c8dee2aaSAndroid Build Coastguard Worker }
865*c8dee2aaSAndroid Build Coastguard Worker
dumpAll() const866*c8dee2aaSAndroid Build Coastguard Worker void SkOpSegment::dumpAll() const {
867*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%.*s", contour()->debugIndent(), " ");
868*c8dee2aaSAndroid Build Coastguard Worker this->dumpPts();
869*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* span = &fHead;
870*c8dee2aaSAndroid Build Coastguard Worker contour()->indentDump();
871*c8dee2aaSAndroid Build Coastguard Worker do {
872*c8dee2aaSAndroid Build Coastguard Worker span->dumpAll();
873*c8dee2aaSAndroid Build Coastguard Worker } while (!span->final() && (span = span->upCast()->next()));
874*c8dee2aaSAndroid Build Coastguard Worker contour()->outdentDump();
875*c8dee2aaSAndroid Build Coastguard Worker }
876*c8dee2aaSAndroid Build Coastguard Worker
dumpAngles() const877*c8dee2aaSAndroid Build Coastguard Worker void SkOpSegment::dumpAngles() const {
878*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("seg=%d\n", debugID());
879*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* span = &fHead;
880*c8dee2aaSAndroid Build Coastguard Worker do {
881*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* fAngle = span->fromAngle();
882*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* tAngle = span->final() ? nullptr : span->upCast()->toAngle();
883*c8dee2aaSAndroid Build Coastguard Worker if (fAngle) {
884*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" span=%d from=%d ", span->debugID(), fAngle->debugID());
885*c8dee2aaSAndroid Build Coastguard Worker fAngle->dumpTo(this, tAngle);
886*c8dee2aaSAndroid Build Coastguard Worker }
887*c8dee2aaSAndroid Build Coastguard Worker if (tAngle) {
888*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" span=%d to=%d ", span->debugID(), tAngle->debugID());
889*c8dee2aaSAndroid Build Coastguard Worker tAngle->dumpTo(this, fAngle);
890*c8dee2aaSAndroid Build Coastguard Worker }
891*c8dee2aaSAndroid Build Coastguard Worker } while (!span->final() && (span = span->upCast()->next()));
892*c8dee2aaSAndroid Build Coastguard Worker }
893*c8dee2aaSAndroid Build Coastguard Worker
dumpCoin() const894*c8dee2aaSAndroid Build Coastguard Worker void SkOpSegment::dumpCoin() const {
895*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpan* span = &fHead;
896*c8dee2aaSAndroid Build Coastguard Worker do {
897*c8dee2aaSAndroid Build Coastguard Worker span->dumpCoin();
898*c8dee2aaSAndroid Build Coastguard Worker } while ((span = span->next()->upCastable()));
899*c8dee2aaSAndroid Build Coastguard Worker }
900*c8dee2aaSAndroid Build Coastguard Worker
dumpPtsInner(const char * prefix) const901*c8dee2aaSAndroid Build Coastguard Worker void SkOpSegment::dumpPtsInner(const char* prefix) const {
902*c8dee2aaSAndroid Build Coastguard Worker int last = SkPathOpsVerbToPoints(fVerb);
903*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%s=%d {{", prefix, this->debugID());
904*c8dee2aaSAndroid Build Coastguard Worker if (fVerb == SkPath::kConic_Verb) {
905*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{");
906*c8dee2aaSAndroid Build Coastguard Worker }
907*c8dee2aaSAndroid Build Coastguard Worker int index = 0;
908*c8dee2aaSAndroid Build Coastguard Worker do {
909*c8dee2aaSAndroid Build Coastguard Worker SkDPoint::Dump(fPts[index]);
910*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", ");
911*c8dee2aaSAndroid Build Coastguard Worker } while (++index < last);
912*c8dee2aaSAndroid Build Coastguard Worker SkDPoint::Dump(fPts[index]);
913*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("}}");
914*c8dee2aaSAndroid Build Coastguard Worker if (fVerb == SkPath::kConic_Verb) {
915*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(", %1.9gf}", fWeight);
916*c8dee2aaSAndroid Build Coastguard Worker }
917*c8dee2aaSAndroid Build Coastguard Worker }
918*c8dee2aaSAndroid Build Coastguard Worker
dumpPts(const char * prefix) const919*c8dee2aaSAndroid Build Coastguard Worker void SkOpSegment::dumpPts(const char* prefix) const {
920*c8dee2aaSAndroid Build Coastguard Worker dumpPtsInner(prefix);
921*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
922*c8dee2aaSAndroid Build Coastguard Worker }
923*c8dee2aaSAndroid Build Coastguard Worker
dump() const924*c8dee2aaSAndroid Build Coastguard Worker void SkCoincidentSpans::dump() const {
925*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("- seg=%d span=%d ptT=%d ", fCoinPtTStart->segment()->debugID(),
926*c8dee2aaSAndroid Build Coastguard Worker fCoinPtTStart->span()->debugID(), fCoinPtTStart->debugID());
927*c8dee2aaSAndroid Build Coastguard Worker fCoinPtTStart->dumpBase();
928*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" span=%d ptT=%d ", fCoinPtTEnd->span()->debugID(), fCoinPtTEnd->debugID());
929*c8dee2aaSAndroid Build Coastguard Worker fCoinPtTEnd->dumpBase();
930*c8dee2aaSAndroid Build Coastguard Worker if (fCoinPtTStart->segment()->operand()) {
931*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" operand");
932*c8dee2aaSAndroid Build Coastguard Worker }
933*c8dee2aaSAndroid Build Coastguard Worker if (fCoinPtTStart->segment()->isXor()) {
934*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" xor");
935*c8dee2aaSAndroid Build Coastguard Worker }
936*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
937*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("+ seg=%d span=%d ptT=%d ", fOppPtTStart->segment()->debugID(),
938*c8dee2aaSAndroid Build Coastguard Worker fOppPtTStart->span()->debugID(), fOppPtTStart->debugID());
939*c8dee2aaSAndroid Build Coastguard Worker fOppPtTStart->dumpBase();
940*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" span=%d ptT=%d ", fOppPtTEnd->span()->debugID(), fOppPtTEnd->debugID());
941*c8dee2aaSAndroid Build Coastguard Worker fOppPtTEnd->dumpBase();
942*c8dee2aaSAndroid Build Coastguard Worker if (fOppPtTStart->segment()->operand()) {
943*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" operand");
944*c8dee2aaSAndroid Build Coastguard Worker }
945*c8dee2aaSAndroid Build Coastguard Worker if (fOppPtTStart->segment()->isXor()) {
946*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" xor");
947*c8dee2aaSAndroid Build Coastguard Worker }
948*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
949*c8dee2aaSAndroid Build Coastguard Worker }
950*c8dee2aaSAndroid Build Coastguard Worker
dump() const951*c8dee2aaSAndroid Build Coastguard Worker void SkOpCoincidence::dump() const {
952*c8dee2aaSAndroid Build Coastguard Worker SkCoincidentSpans* span = fHead;
953*c8dee2aaSAndroid Build Coastguard Worker while (span) {
954*c8dee2aaSAndroid Build Coastguard Worker span->dump();
955*c8dee2aaSAndroid Build Coastguard Worker span = span->next();
956*c8dee2aaSAndroid Build Coastguard Worker }
957*c8dee2aaSAndroid Build Coastguard Worker if (!fTop || fHead == fTop) {
958*c8dee2aaSAndroid Build Coastguard Worker return;
959*c8dee2aaSAndroid Build Coastguard Worker }
960*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("top:\n");
961*c8dee2aaSAndroid Build Coastguard Worker span = fTop;
962*c8dee2aaSAndroid Build Coastguard Worker int count = 0;
963*c8dee2aaSAndroid Build Coastguard Worker while (span) {
964*c8dee2aaSAndroid Build Coastguard Worker span->dump();
965*c8dee2aaSAndroid Build Coastguard Worker span = span->next();
966*c8dee2aaSAndroid Build Coastguard Worker SkCoincidentSpans* check = fTop;
967*c8dee2aaSAndroid Build Coastguard Worker ++count;
968*c8dee2aaSAndroid Build Coastguard Worker for (int index = 0; index < count; ++index) {
969*c8dee2aaSAndroid Build Coastguard Worker if (span == check) {
970*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("(loops to #%d)\n", index);
971*c8dee2aaSAndroid Build Coastguard Worker return;
972*c8dee2aaSAndroid Build Coastguard Worker }
973*c8dee2aaSAndroid Build Coastguard Worker check = check->next();
974*c8dee2aaSAndroid Build Coastguard Worker }
975*c8dee2aaSAndroid Build Coastguard Worker }
976*c8dee2aaSAndroid Build Coastguard Worker }
977*c8dee2aaSAndroid Build Coastguard Worker
dump() const978*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dump() const {
979*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("contour=%d count=%d op=%d xor=%d\n", this->debugID(), fCount, fOperand, fXor);
980*c8dee2aaSAndroid Build Coastguard Worker if (!fCount) {
981*c8dee2aaSAndroid Build Coastguard Worker return;
982*c8dee2aaSAndroid Build Coastguard Worker }
983*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = &fHead;
984*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fDebugIndent = 0);
985*c8dee2aaSAndroid Build Coastguard Worker this->indentDump();
986*c8dee2aaSAndroid Build Coastguard Worker do {
987*c8dee2aaSAndroid Build Coastguard Worker segment->dump();
988*c8dee2aaSAndroid Build Coastguard Worker } while ((segment = segment->next()));
989*c8dee2aaSAndroid Build Coastguard Worker this->outdentDump();
990*c8dee2aaSAndroid Build Coastguard Worker }
991*c8dee2aaSAndroid Build Coastguard Worker
dumpAll() const992*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpAll() const {
993*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("contour=%d count=%d op=%d xor=%d\n", this->debugID(), fCount, fOperand, fXor);
994*c8dee2aaSAndroid Build Coastguard Worker if (!fCount) {
995*c8dee2aaSAndroid Build Coastguard Worker return;
996*c8dee2aaSAndroid Build Coastguard Worker }
997*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = &fHead;
998*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fDebugIndent = 0);
999*c8dee2aaSAndroid Build Coastguard Worker this->indentDump();
1000*c8dee2aaSAndroid Build Coastguard Worker do {
1001*c8dee2aaSAndroid Build Coastguard Worker segment->dumpAll();
1002*c8dee2aaSAndroid Build Coastguard Worker } while ((segment = segment->next()));
1003*c8dee2aaSAndroid Build Coastguard Worker this->outdentDump();
1004*c8dee2aaSAndroid Build Coastguard Worker }
1005*c8dee2aaSAndroid Build Coastguard Worker
1006*c8dee2aaSAndroid Build Coastguard Worker
dumpAngles() const1007*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpAngles() const {
1008*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("contour=%d\n", this->debugID());
1009*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = &fHead;
1010*c8dee2aaSAndroid Build Coastguard Worker do {
1011*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" seg=%d ", segment->debugID());
1012*c8dee2aaSAndroid Build Coastguard Worker segment->dumpAngles();
1013*c8dee2aaSAndroid Build Coastguard Worker } while ((segment = segment->next()));
1014*c8dee2aaSAndroid Build Coastguard Worker }
1015*c8dee2aaSAndroid Build Coastguard Worker
dumpPt(int index) const1016*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpPt(int index) const {
1017*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = &fHead;
1018*c8dee2aaSAndroid Build Coastguard Worker do {
1019*c8dee2aaSAndroid Build Coastguard Worker if (segment->debugID() == index) {
1020*c8dee2aaSAndroid Build Coastguard Worker segment->dumpPts();
1021*c8dee2aaSAndroid Build Coastguard Worker }
1022*c8dee2aaSAndroid Build Coastguard Worker } while ((segment = segment->next()));
1023*c8dee2aaSAndroid Build Coastguard Worker }
1024*c8dee2aaSAndroid Build Coastguard Worker
dumpPts(const char * prefix) const1025*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpPts(const char* prefix) const {
1026*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("contour=%d\n", this->debugID());
1027*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = &fHead;
1028*c8dee2aaSAndroid Build Coastguard Worker do {
1029*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" %s=%d ", prefix, segment->debugID());
1030*c8dee2aaSAndroid Build Coastguard Worker segment->dumpPts(prefix);
1031*c8dee2aaSAndroid Build Coastguard Worker } while ((segment = segment->next()));
1032*c8dee2aaSAndroid Build Coastguard Worker }
1033*c8dee2aaSAndroid Build Coastguard Worker
dumpPtsX(const char * prefix) const1034*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpPtsX(const char* prefix) const {
1035*c8dee2aaSAndroid Build Coastguard Worker if (!this->fCount) {
1036*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("<empty>\n");
1037*c8dee2aaSAndroid Build Coastguard Worker return;
1038*c8dee2aaSAndroid Build Coastguard Worker }
1039*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = &fHead;
1040*c8dee2aaSAndroid Build Coastguard Worker do {
1041*c8dee2aaSAndroid Build Coastguard Worker segment->dumpPts(prefix);
1042*c8dee2aaSAndroid Build Coastguard Worker } while ((segment = segment->next()));
1043*c8dee2aaSAndroid Build Coastguard Worker }
1044*c8dee2aaSAndroid Build Coastguard Worker
dumpSegment(int index) const1045*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpSegment(int index) const {
1046*c8dee2aaSAndroid Build Coastguard Worker debugSegment(index)->dump();
1047*c8dee2aaSAndroid Build Coastguard Worker }
1048*c8dee2aaSAndroid Build Coastguard Worker
dumpSegments(const char * prefix,SkPathOp op) const1049*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpSegments(const char* prefix, SkPathOp op) const {
1050*c8dee2aaSAndroid Build Coastguard Worker bool firstOp = false;
1051*c8dee2aaSAndroid Build Coastguard Worker const SkOpContour* c = this;
1052*c8dee2aaSAndroid Build Coastguard Worker do {
1053*c8dee2aaSAndroid Build Coastguard Worker if (!firstOp && c->operand()) {
1054*c8dee2aaSAndroid Build Coastguard Worker #if DEBUG_ACTIVE_OP
1055*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("op %s\n", SkPathOpsDebug::kPathOpStr[op]);
1056*c8dee2aaSAndroid Build Coastguard Worker #endif
1057*c8dee2aaSAndroid Build Coastguard Worker firstOp = true;
1058*c8dee2aaSAndroid Build Coastguard Worker }
1059*c8dee2aaSAndroid Build Coastguard Worker c->dumpPtsX(prefix);
1060*c8dee2aaSAndroid Build Coastguard Worker } while ((c = c->next()));
1061*c8dee2aaSAndroid Build Coastguard Worker }
1062*c8dee2aaSAndroid Build Coastguard Worker
dumpSpan(int index) const1063*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpSpan(int index) const {
1064*c8dee2aaSAndroid Build Coastguard Worker debugSpan(index)->dump();
1065*c8dee2aaSAndroid Build Coastguard Worker }
1066*c8dee2aaSAndroid Build Coastguard Worker
dumpSpans() const1067*c8dee2aaSAndroid Build Coastguard Worker void SkOpContour::dumpSpans() const {
1068*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("contour=%d\n", this->debugID());
1069*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = &fHead;
1070*c8dee2aaSAndroid Build Coastguard Worker do {
1071*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" seg=%d ", segment->debugID());
1072*c8dee2aaSAndroid Build Coastguard Worker segment->dump();
1073*c8dee2aaSAndroid Build Coastguard Worker } while ((segment = segment->next()));
1074*c8dee2aaSAndroid Build Coastguard Worker }
1075*c8dee2aaSAndroid Build Coastguard Worker
dump() const1076*c8dee2aaSAndroid Build Coastguard Worker void SkOpCurve::dump() const {
1077*c8dee2aaSAndroid Build Coastguard Worker int count = SkPathOpsVerbToPoints(SkDEBUGRELEASE(fVerb, SkPath::kCubic_Verb));
1078*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{{");
1079*c8dee2aaSAndroid Build Coastguard Worker int index;
1080*c8dee2aaSAndroid Build Coastguard Worker for (index = 0; index <= count - 1; ++index) {
1081*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{%1.9gf,%1.9gf}, ", fPts[index].fX, fPts[index].fY);
1082*c8dee2aaSAndroid Build Coastguard Worker }
1083*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("{%1.9gf,%1.9gf}}}\n", fPts[index].fX, fPts[index].fY);
1084*c8dee2aaSAndroid Build Coastguard Worker }
1085*c8dee2aaSAndroid Build Coastguard Worker
1086*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
debugAngle(int id) const1087*c8dee2aaSAndroid Build Coastguard Worker const SkOpAngle* SkOpGlobalState::debugAngle(int id) const {
1088*c8dee2aaSAndroid Build Coastguard Worker const SkOpContour* contour = fContourHead;
1089*c8dee2aaSAndroid Build Coastguard Worker do {
1090*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = contour->first();
1091*c8dee2aaSAndroid Build Coastguard Worker while (segment) {
1092*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpan* span = segment->head();
1093*c8dee2aaSAndroid Build Coastguard Worker do {
1094*c8dee2aaSAndroid Build Coastguard Worker SkOpAngle* angle = span->fromAngle();
1095*c8dee2aaSAndroid Build Coastguard Worker if (angle && angle->debugID() == id) {
1096*c8dee2aaSAndroid Build Coastguard Worker return angle;
1097*c8dee2aaSAndroid Build Coastguard Worker }
1098*c8dee2aaSAndroid Build Coastguard Worker angle = span->toAngle();
1099*c8dee2aaSAndroid Build Coastguard Worker if (angle && angle->debugID() == id) {
1100*c8dee2aaSAndroid Build Coastguard Worker return angle;
1101*c8dee2aaSAndroid Build Coastguard Worker }
1102*c8dee2aaSAndroid Build Coastguard Worker } while ((span = span->next()->upCastable()));
1103*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* tail = segment->tail();
1104*c8dee2aaSAndroid Build Coastguard Worker SkOpAngle* angle = tail->fromAngle();
1105*c8dee2aaSAndroid Build Coastguard Worker if (angle && angle->debugID() == id) {
1106*c8dee2aaSAndroid Build Coastguard Worker return angle;
1107*c8dee2aaSAndroid Build Coastguard Worker }
1108*c8dee2aaSAndroid Build Coastguard Worker segment = segment->next();
1109*c8dee2aaSAndroid Build Coastguard Worker }
1110*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
1111*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1112*c8dee2aaSAndroid Build Coastguard Worker }
1113*c8dee2aaSAndroid Build Coastguard Worker
debugContour(int id) const1114*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* SkOpGlobalState::debugContour(int id) const {
1115*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = fContourHead;
1116*c8dee2aaSAndroid Build Coastguard Worker do {
1117*c8dee2aaSAndroid Build Coastguard Worker if (contour->debugID() == id) {
1118*c8dee2aaSAndroid Build Coastguard Worker return contour;
1119*c8dee2aaSAndroid Build Coastguard Worker }
1120*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
1121*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1122*c8dee2aaSAndroid Build Coastguard Worker }
1123*c8dee2aaSAndroid Build Coastguard Worker
debugPtT(int id) const1124*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* SkOpGlobalState::debugPtT(int id) const {
1125*c8dee2aaSAndroid Build Coastguard Worker const SkOpContour* contour = fContourHead;
1126*c8dee2aaSAndroid Build Coastguard Worker do {
1127*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = contour->first();
1128*c8dee2aaSAndroid Build Coastguard Worker while (segment) {
1129*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpan* span = segment->head();
1130*c8dee2aaSAndroid Build Coastguard Worker do {
1131*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* ptT = span->ptT();
1132*c8dee2aaSAndroid Build Coastguard Worker if (ptT->debugMatchID(id)) {
1133*c8dee2aaSAndroid Build Coastguard Worker return ptT;
1134*c8dee2aaSAndroid Build Coastguard Worker }
1135*c8dee2aaSAndroid Build Coastguard Worker } while ((span = span->next()->upCastable()));
1136*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* tail = segment->tail();
1137*c8dee2aaSAndroid Build Coastguard Worker const SkOpPtT* ptT = tail->ptT();
1138*c8dee2aaSAndroid Build Coastguard Worker if (ptT->debugMatchID(id)) {
1139*c8dee2aaSAndroid Build Coastguard Worker return ptT;
1140*c8dee2aaSAndroid Build Coastguard Worker }
1141*c8dee2aaSAndroid Build Coastguard Worker segment = segment->next();
1142*c8dee2aaSAndroid Build Coastguard Worker }
1143*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
1144*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1145*c8dee2aaSAndroid Build Coastguard Worker }
1146*c8dee2aaSAndroid Build Coastguard Worker
debugSegment(int id) const1147*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* SkOpGlobalState::debugSegment(int id) const {
1148*c8dee2aaSAndroid Build Coastguard Worker const SkOpContour* contour = fContourHead;
1149*c8dee2aaSAndroid Build Coastguard Worker do {
1150*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = contour->first();
1151*c8dee2aaSAndroid Build Coastguard Worker while (segment) {
1152*c8dee2aaSAndroid Build Coastguard Worker if (segment->debugID() == id) {
1153*c8dee2aaSAndroid Build Coastguard Worker return segment;
1154*c8dee2aaSAndroid Build Coastguard Worker }
1155*c8dee2aaSAndroid Build Coastguard Worker segment = segment->next();
1156*c8dee2aaSAndroid Build Coastguard Worker }
1157*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
1158*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1159*c8dee2aaSAndroid Build Coastguard Worker }
1160*c8dee2aaSAndroid Build Coastguard Worker
debugSpan(int id) const1161*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* SkOpGlobalState::debugSpan(int id) const {
1162*c8dee2aaSAndroid Build Coastguard Worker const SkOpContour* contour = fContourHead;
1163*c8dee2aaSAndroid Build Coastguard Worker do {
1164*c8dee2aaSAndroid Build Coastguard Worker const SkOpSegment* segment = contour->first();
1165*c8dee2aaSAndroid Build Coastguard Worker while (segment) {
1166*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpan* span = segment->head();
1167*c8dee2aaSAndroid Build Coastguard Worker do {
1168*c8dee2aaSAndroid Build Coastguard Worker if (span->debugID() == id) {
1169*c8dee2aaSAndroid Build Coastguard Worker return span;
1170*c8dee2aaSAndroid Build Coastguard Worker }
1171*c8dee2aaSAndroid Build Coastguard Worker } while ((span = span->next()->upCastable()));
1172*c8dee2aaSAndroid Build Coastguard Worker const SkOpSpanBase* tail = segment->tail();
1173*c8dee2aaSAndroid Build Coastguard Worker if (tail->debugID() == id) {
1174*c8dee2aaSAndroid Build Coastguard Worker return tail;
1175*c8dee2aaSAndroid Build Coastguard Worker }
1176*c8dee2aaSAndroid Build Coastguard Worker segment = segment->next();
1177*c8dee2aaSAndroid Build Coastguard Worker }
1178*c8dee2aaSAndroid Build Coastguard Worker } while ((contour = contour->next()));
1179*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1180*c8dee2aaSAndroid Build Coastguard Worker }
1181*c8dee2aaSAndroid Build Coastguard Worker #endif
1182*c8dee2aaSAndroid Build Coastguard Worker
dumpIsCoincidentStr() const1183*c8dee2aaSAndroid Build Coastguard Worker char SkTCoincident::dumpIsCoincidentStr() const {
1184*c8dee2aaSAndroid Build Coastguard Worker if (!!fMatch != fMatch) {
1185*c8dee2aaSAndroid Build Coastguard Worker return '?';
1186*c8dee2aaSAndroid Build Coastguard Worker }
1187*c8dee2aaSAndroid Build Coastguard Worker return fMatch ? '*' : 0;
1188*c8dee2aaSAndroid Build Coastguard Worker }
1189*c8dee2aaSAndroid Build Coastguard Worker
dump() const1190*c8dee2aaSAndroid Build Coastguard Worker void SkTCoincident::dump() const {
1191*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("t=%1.9g pt=(%1.9g,%1.9g)%s\n", fPerpT, fPerpPt.fX, fPerpPt.fY,
1192*c8dee2aaSAndroid Build Coastguard Worker fMatch ? " match" : "");
1193*c8dee2aaSAndroid Build Coastguard Worker }
1194*c8dee2aaSAndroid Build Coastguard Worker
1195*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
1196*c8dee2aaSAndroid Build Coastguard Worker
debugSpan(int id) const1197*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* SkTSect::debugSpan(int id) const {
1198*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* test = fHead;
1199*c8dee2aaSAndroid Build Coastguard Worker do {
1200*c8dee2aaSAndroid Build Coastguard Worker if (test->debugID() == id) {
1201*c8dee2aaSAndroid Build Coastguard Worker return test;
1202*c8dee2aaSAndroid Build Coastguard Worker }
1203*c8dee2aaSAndroid Build Coastguard Worker } while ((test = test->next()));
1204*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
1205*c8dee2aaSAndroid Build Coastguard Worker }
1206*c8dee2aaSAndroid Build Coastguard Worker
debugT(double t) const1207*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* SkTSect::debugT(double t) const {
1208*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* test = fHead;
1209*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* closest = nullptr;
1210*c8dee2aaSAndroid Build Coastguard Worker double bestDist = DBL_MAX;
1211*c8dee2aaSAndroid Build Coastguard Worker do {
1212*c8dee2aaSAndroid Build Coastguard Worker if (between(test->fStartT, t, test->fEndT)) {
1213*c8dee2aaSAndroid Build Coastguard Worker return test;
1214*c8dee2aaSAndroid Build Coastguard Worker }
1215*c8dee2aaSAndroid Build Coastguard Worker double testDist = std::min(fabs(test->fStartT - t), fabs(test->fEndT - t));
1216*c8dee2aaSAndroid Build Coastguard Worker if (bestDist > testDist) {
1217*c8dee2aaSAndroid Build Coastguard Worker bestDist = testDist;
1218*c8dee2aaSAndroid Build Coastguard Worker closest = test;
1219*c8dee2aaSAndroid Build Coastguard Worker }
1220*c8dee2aaSAndroid Build Coastguard Worker } while ((test = test->next()));
1221*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(closest);
1222*c8dee2aaSAndroid Build Coastguard Worker return closest;
1223*c8dee2aaSAndroid Build Coastguard Worker }
1224*c8dee2aaSAndroid Build Coastguard Worker
1225*c8dee2aaSAndroid Build Coastguard Worker #endif
1226*c8dee2aaSAndroid Build Coastguard Worker
dump() const1227*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dump() const {
1228*c8dee2aaSAndroid Build Coastguard Worker dumpCommon(fHead);
1229*c8dee2aaSAndroid Build Coastguard Worker }
1230*c8dee2aaSAndroid Build Coastguard Worker
1231*c8dee2aaSAndroid Build Coastguard Worker extern int gDumpTSectNum;
1232*c8dee2aaSAndroid Build Coastguard Worker
dumpBoth(SkTSect * opp) const1233*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpBoth(SkTSect* opp) const {
1234*c8dee2aaSAndroid Build Coastguard Worker #if DEBUG_T_SECT_DUMP <= 2
1235*c8dee2aaSAndroid Build Coastguard Worker #if DEBUG_T_SECT_DUMP == 2
1236*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%d ", ++gDumpTSectNum);
1237*c8dee2aaSAndroid Build Coastguard Worker #endif
1238*c8dee2aaSAndroid Build Coastguard Worker this->dump();
1239*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
1240*c8dee2aaSAndroid Build Coastguard Worker opp->dump();
1241*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
1242*c8dee2aaSAndroid Build Coastguard Worker #elif DEBUG_T_SECT_DUMP == 3
1243*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("<div id=\"sect%d\">\n", ++gDumpTSectNum);
1244*c8dee2aaSAndroid Build Coastguard Worker if (this->fHead) {
1245*c8dee2aaSAndroid Build Coastguard Worker this->dumpCurves();
1246*c8dee2aaSAndroid Build Coastguard Worker }
1247*c8dee2aaSAndroid Build Coastguard Worker if (opp->fHead) {
1248*c8dee2aaSAndroid Build Coastguard Worker opp->dumpCurves();
1249*c8dee2aaSAndroid Build Coastguard Worker }
1250*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("</div>\n\n");
1251*c8dee2aaSAndroid Build Coastguard Worker #endif
1252*c8dee2aaSAndroid Build Coastguard Worker }
1253*c8dee2aaSAndroid Build Coastguard Worker
dumpBounded(int id) const1254*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpBounded(int id) const {
1255*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
1256*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* bounded = debugSpan(id);
1257*c8dee2aaSAndroid Build Coastguard Worker if (!bounded) {
1258*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("no span matches %d\n", id);
1259*c8dee2aaSAndroid Build Coastguard Worker return;
1260*c8dee2aaSAndroid Build Coastguard Worker }
1261*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* test = bounded->debugOpp()->fHead;
1262*c8dee2aaSAndroid Build Coastguard Worker do {
1263*c8dee2aaSAndroid Build Coastguard Worker if (test->findOppSpan(bounded)) {
1264*c8dee2aaSAndroid Build Coastguard Worker test->dump();
1265*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" ");
1266*c8dee2aaSAndroid Build Coastguard Worker }
1267*c8dee2aaSAndroid Build Coastguard Worker } while ((test = test->next()));
1268*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("\n");
1269*c8dee2aaSAndroid Build Coastguard Worker #endif
1270*c8dee2aaSAndroid Build Coastguard Worker }
1271*c8dee2aaSAndroid Build Coastguard Worker
dumpBounds() const1272*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpBounds() const {
1273*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* test = fHead;
1274*c8dee2aaSAndroid Build Coastguard Worker do {
1275*c8dee2aaSAndroid Build Coastguard Worker test->dumpBounds();
1276*c8dee2aaSAndroid Build Coastguard Worker } while ((test = test->next()));
1277*c8dee2aaSAndroid Build Coastguard Worker }
1278*c8dee2aaSAndroid Build Coastguard Worker
dumpCoin() const1279*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpCoin() const {
1280*c8dee2aaSAndroid Build Coastguard Worker dumpCommon(fCoincident);
1281*c8dee2aaSAndroid Build Coastguard Worker }
1282*c8dee2aaSAndroid Build Coastguard Worker
dumpCoinCurves() const1283*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpCoinCurves() const {
1284*c8dee2aaSAndroid Build Coastguard Worker dumpCommonCurves(fCoincident);
1285*c8dee2aaSAndroid Build Coastguard Worker }
1286*c8dee2aaSAndroid Build Coastguard Worker
dumpCommon(const SkTSpan * test) const1287*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpCommon(const SkTSpan* test) const {
1288*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("id=%d", debugID());
1289*c8dee2aaSAndroid Build Coastguard Worker if (!test) {
1290*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" (empty)");
1291*c8dee2aaSAndroid Build Coastguard Worker return;
1292*c8dee2aaSAndroid Build Coastguard Worker }
1293*c8dee2aaSAndroid Build Coastguard Worker do {
1294*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" ");
1295*c8dee2aaSAndroid Build Coastguard Worker test->dump();
1296*c8dee2aaSAndroid Build Coastguard Worker } while ((test = test->next()));
1297*c8dee2aaSAndroid Build Coastguard Worker }
1298*c8dee2aaSAndroid Build Coastguard Worker
dumpCommonCurves(const SkTSpan * test) const1299*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpCommonCurves(const SkTSpan* test) const {
1300*c8dee2aaSAndroid Build Coastguard Worker #if DEBUG_T_SECT
1301*c8dee2aaSAndroid Build Coastguard Worker do {
1302*c8dee2aaSAndroid Build Coastguard Worker test->fPart->dumpID(test->debugID());
1303*c8dee2aaSAndroid Build Coastguard Worker } while ((test = test->next()));
1304*c8dee2aaSAndroid Build Coastguard Worker #endif
1305*c8dee2aaSAndroid Build Coastguard Worker }
1306*c8dee2aaSAndroid Build Coastguard Worker
dumpCurves() const1307*c8dee2aaSAndroid Build Coastguard Worker void SkTSect::dumpCurves() const {
1308*c8dee2aaSAndroid Build Coastguard Worker dumpCommonCurves(fHead);
1309*c8dee2aaSAndroid Build Coastguard Worker }
1310*c8dee2aaSAndroid Build Coastguard Worker
1311*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
1312*c8dee2aaSAndroid Build Coastguard Worker
debugSpan(int id) const1313*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* SkTSpan::debugSpan(int id) const {
1314*c8dee2aaSAndroid Build Coastguard Worker return fDebugSect->debugSpan(id);
1315*c8dee2aaSAndroid Build Coastguard Worker }
1316*c8dee2aaSAndroid Build Coastguard Worker
debugT(double t) const1317*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* SkTSpan::debugT(double t) const {
1318*c8dee2aaSAndroid Build Coastguard Worker return fDebugSect->debugT(t);
1319*c8dee2aaSAndroid Build Coastguard Worker }
1320*c8dee2aaSAndroid Build Coastguard Worker
1321*c8dee2aaSAndroid Build Coastguard Worker #endif
1322*c8dee2aaSAndroid Build Coastguard Worker
dumpAll() const1323*c8dee2aaSAndroid Build Coastguard Worker void SkTSpan::dumpAll() const {
1324*c8dee2aaSAndroid Build Coastguard Worker dumpID();
1325*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("=(%g,%g) [", fStartT, fEndT);
1326*c8dee2aaSAndroid Build Coastguard Worker const SkTSpanBounded* testBounded = fBounded;
1327*c8dee2aaSAndroid Build Coastguard Worker while (testBounded) {
1328*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* span = testBounded->fBounded;
1329*c8dee2aaSAndroid Build Coastguard Worker const SkTSpanBounded* next = testBounded->fNext;
1330*c8dee2aaSAndroid Build Coastguard Worker span->dumpID();
1331*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("=(%g,%g)", span->fStartT, span->fEndT);
1332*c8dee2aaSAndroid Build Coastguard Worker if (next) {
1333*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" ");
1334*c8dee2aaSAndroid Build Coastguard Worker }
1335*c8dee2aaSAndroid Build Coastguard Worker testBounded = next;
1336*c8dee2aaSAndroid Build Coastguard Worker }
1337*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("]\n");
1338*c8dee2aaSAndroid Build Coastguard Worker }
1339*c8dee2aaSAndroid Build Coastguard Worker
dump() const1340*c8dee2aaSAndroid Build Coastguard Worker void SkTSpan::dump() const {
1341*c8dee2aaSAndroid Build Coastguard Worker dumpID();
1342*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("=(%g,%g) [", fStartT, fEndT);
1343*c8dee2aaSAndroid Build Coastguard Worker const SkTSpanBounded* testBounded = fBounded;
1344*c8dee2aaSAndroid Build Coastguard Worker while (testBounded) {
1345*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* span = testBounded->fBounded;
1346*c8dee2aaSAndroid Build Coastguard Worker const SkTSpanBounded* next = testBounded->fNext;
1347*c8dee2aaSAndroid Build Coastguard Worker span->dumpID();
1348*c8dee2aaSAndroid Build Coastguard Worker if (next) {
1349*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(",");
1350*c8dee2aaSAndroid Build Coastguard Worker }
1351*c8dee2aaSAndroid Build Coastguard Worker testBounded = next;
1352*c8dee2aaSAndroid Build Coastguard Worker }
1353*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("]");
1354*c8dee2aaSAndroid Build Coastguard Worker }
1355*c8dee2aaSAndroid Build Coastguard Worker
dumpBounded(int id) const1356*c8dee2aaSAndroid Build Coastguard Worker void SkTSpan::dumpBounded(int id) const {
1357*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fDebugSect->dumpBounded(id));
1358*c8dee2aaSAndroid Build Coastguard Worker }
1359*c8dee2aaSAndroid Build Coastguard Worker
dumpBounds() const1360*c8dee2aaSAndroid Build Coastguard Worker void SkTSpan::dumpBounds() const {
1361*c8dee2aaSAndroid Build Coastguard Worker dumpID();
1362*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" bounds=(%1.9g,%1.9g, %1.9g,%1.9g) boundsMax=%1.9g%s\n",
1363*c8dee2aaSAndroid Build Coastguard Worker fBounds.fLeft, fBounds.fTop, fBounds.fRight, fBounds.fBottom, fBoundsMax,
1364*c8dee2aaSAndroid Build Coastguard Worker fCollapsed ? " collapsed" : "");
1365*c8dee2aaSAndroid Build Coastguard Worker }
1366*c8dee2aaSAndroid Build Coastguard Worker
dumpCoin() const1367*c8dee2aaSAndroid Build Coastguard Worker void SkTSpan::dumpCoin() const {
1368*c8dee2aaSAndroid Build Coastguard Worker dumpID();
1369*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" coinStart ");
1370*c8dee2aaSAndroid Build Coastguard Worker fCoinStart.dump();
1371*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(" coinEnd ");
1372*c8dee2aaSAndroid Build Coastguard Worker fCoinEnd.dump();
1373*c8dee2aaSAndroid Build Coastguard Worker }
1374*c8dee2aaSAndroid Build Coastguard Worker
dumpID() const1375*c8dee2aaSAndroid Build Coastguard Worker void SkTSpan::dumpID() const {
1376*c8dee2aaSAndroid Build Coastguard Worker char cS = fCoinStart.dumpIsCoincidentStr();
1377*c8dee2aaSAndroid Build Coastguard Worker if (cS) {
1378*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%c", cS);
1379*c8dee2aaSAndroid Build Coastguard Worker }
1380*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%d", debugID());
1381*c8dee2aaSAndroid Build Coastguard Worker char cE = fCoinEnd.dumpIsCoincidentStr();
1382*c8dee2aaSAndroid Build Coastguard Worker if (cE) {
1383*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%c", cE);
1384*c8dee2aaSAndroid Build Coastguard Worker }
1385*c8dee2aaSAndroid Build Coastguard Worker }
1386*c8dee2aaSAndroid Build Coastguard Worker
1387*c8dee2aaSAndroid Build Coastguard Worker #if DEBUG_T_SECT_DUMP > 1
1388*c8dee2aaSAndroid Build Coastguard Worker int gDumpTSectNum;
1389*c8dee2aaSAndroid Build Coastguard Worker #endif
1390*c8dee2aaSAndroid Build Coastguard Worker
1391*c8dee2aaSAndroid Build Coastguard Worker // global path dumps for msvs Visual Studio 17 to use from Immediate Window
Dump(const SkOpContour & contour)1392*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkOpContour& contour) {
1393*c8dee2aaSAndroid Build Coastguard Worker contour.dump();
1394*c8dee2aaSAndroid Build Coastguard Worker }
1395*c8dee2aaSAndroid Build Coastguard Worker
DumpAll(const SkOpContour & contour)1396*c8dee2aaSAndroid Build Coastguard Worker void DumpAll(const SkOpContour& contour) {
1397*c8dee2aaSAndroid Build Coastguard Worker contour.dumpAll();
1398*c8dee2aaSAndroid Build Coastguard Worker }
1399*c8dee2aaSAndroid Build Coastguard Worker
DumpAngles(const SkOpContour & contour)1400*c8dee2aaSAndroid Build Coastguard Worker void DumpAngles(const SkOpContour& contour) {
1401*c8dee2aaSAndroid Build Coastguard Worker contour.dumpAngles();
1402*c8dee2aaSAndroid Build Coastguard Worker }
1403*c8dee2aaSAndroid Build Coastguard Worker
DumpContours(const SkOpContour & contour)1404*c8dee2aaSAndroid Build Coastguard Worker void DumpContours(const SkOpContour& contour) {
1405*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContours();
1406*c8dee2aaSAndroid Build Coastguard Worker }
1407*c8dee2aaSAndroid Build Coastguard Worker
DumpContoursAll(const SkOpContour & contour)1408*c8dee2aaSAndroid Build Coastguard Worker void DumpContoursAll(const SkOpContour& contour) {
1409*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContoursAll();
1410*c8dee2aaSAndroid Build Coastguard Worker }
1411*c8dee2aaSAndroid Build Coastguard Worker
DumpContoursAngles(const SkOpContour & contour)1412*c8dee2aaSAndroid Build Coastguard Worker void DumpContoursAngles(const SkOpContour& contour) {
1413*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContoursAngles();
1414*c8dee2aaSAndroid Build Coastguard Worker }
1415*c8dee2aaSAndroid Build Coastguard Worker
DumpContoursPts(const SkOpContour & contour)1416*c8dee2aaSAndroid Build Coastguard Worker void DumpContoursPts(const SkOpContour& contour) {
1417*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContoursPts();
1418*c8dee2aaSAndroid Build Coastguard Worker }
1419*c8dee2aaSAndroid Build Coastguard Worker
DumpContoursPt(const SkOpContour & contour,int segmentID)1420*c8dee2aaSAndroid Build Coastguard Worker void DumpContoursPt(const SkOpContour& contour, int segmentID) {
1421*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContoursPt(segmentID);
1422*c8dee2aaSAndroid Build Coastguard Worker }
1423*c8dee2aaSAndroid Build Coastguard Worker
DumpContoursSegment(const SkOpContour & contour,int segmentID)1424*c8dee2aaSAndroid Build Coastguard Worker void DumpContoursSegment(const SkOpContour& contour, int segmentID) {
1425*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContoursSegment(segmentID);
1426*c8dee2aaSAndroid Build Coastguard Worker }
1427*c8dee2aaSAndroid Build Coastguard Worker
DumpContoursSpan(const SkOpContour & contour,int segmentID)1428*c8dee2aaSAndroid Build Coastguard Worker void DumpContoursSpan(const SkOpContour& contour, int segmentID) {
1429*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContoursSpan(segmentID);
1430*c8dee2aaSAndroid Build Coastguard Worker }
1431*c8dee2aaSAndroid Build Coastguard Worker
DumpContoursSpans(const SkOpContour & contour)1432*c8dee2aaSAndroid Build Coastguard Worker void DumpContoursSpans(const SkOpContour& contour) {
1433*c8dee2aaSAndroid Build Coastguard Worker contour.dumpContoursSpans();
1434*c8dee2aaSAndroid Build Coastguard Worker }
1435*c8dee2aaSAndroid Build Coastguard Worker
DumpPt(const SkOpContour & contour,int pt)1436*c8dee2aaSAndroid Build Coastguard Worker void DumpPt(const SkOpContour& contour, int pt) {
1437*c8dee2aaSAndroid Build Coastguard Worker contour.dumpPt(pt);
1438*c8dee2aaSAndroid Build Coastguard Worker }
1439*c8dee2aaSAndroid Build Coastguard Worker
DumpPts(const SkOpContour & contour,const char * prefix)1440*c8dee2aaSAndroid Build Coastguard Worker void DumpPts(const SkOpContour& contour, const char* prefix) {
1441*c8dee2aaSAndroid Build Coastguard Worker contour.dumpPts(prefix);
1442*c8dee2aaSAndroid Build Coastguard Worker }
1443*c8dee2aaSAndroid Build Coastguard Worker
DumpSegment(const SkOpContour & contour,int seg)1444*c8dee2aaSAndroid Build Coastguard Worker void DumpSegment(const SkOpContour& contour, int seg) {
1445*c8dee2aaSAndroid Build Coastguard Worker contour.dumpSegment(seg);
1446*c8dee2aaSAndroid Build Coastguard Worker }
1447*c8dee2aaSAndroid Build Coastguard Worker
DumpSegments(const SkOpContour & contour,const char * prefix,SkPathOp op)1448*c8dee2aaSAndroid Build Coastguard Worker void DumpSegments(const SkOpContour& contour, const char* prefix, SkPathOp op) {
1449*c8dee2aaSAndroid Build Coastguard Worker contour.dumpSegments(prefix, op);
1450*c8dee2aaSAndroid Build Coastguard Worker }
1451*c8dee2aaSAndroid Build Coastguard Worker
DumpSpan(const SkOpContour & contour,int span)1452*c8dee2aaSAndroid Build Coastguard Worker void DumpSpan(const SkOpContour& contour, int span) {
1453*c8dee2aaSAndroid Build Coastguard Worker contour.dumpSpan(span);
1454*c8dee2aaSAndroid Build Coastguard Worker }
1455*c8dee2aaSAndroid Build Coastguard Worker
DumpSpans(const SkOpContour & contour)1456*c8dee2aaSAndroid Build Coastguard Worker void DumpSpans(const SkOpContour& contour ) {
1457*c8dee2aaSAndroid Build Coastguard Worker contour.dumpSpans();
1458*c8dee2aaSAndroid Build Coastguard Worker }
1459*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkOpSegment & segment)1460*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkOpSegment& segment) {
1461*c8dee2aaSAndroid Build Coastguard Worker segment.dump();
1462*c8dee2aaSAndroid Build Coastguard Worker }
1463*c8dee2aaSAndroid Build Coastguard Worker
DumpAll(const SkOpSegment & segment)1464*c8dee2aaSAndroid Build Coastguard Worker void DumpAll(const SkOpSegment& segment) {
1465*c8dee2aaSAndroid Build Coastguard Worker segment.dumpAll();
1466*c8dee2aaSAndroid Build Coastguard Worker }
1467*c8dee2aaSAndroid Build Coastguard Worker
DumpAngles(const SkOpSegment & segment)1468*c8dee2aaSAndroid Build Coastguard Worker void DumpAngles(const SkOpSegment& segment) {
1469*c8dee2aaSAndroid Build Coastguard Worker segment.dumpAngles();
1470*c8dee2aaSAndroid Build Coastguard Worker }
1471*c8dee2aaSAndroid Build Coastguard Worker
DumpCoin(const SkOpSegment & segment)1472*c8dee2aaSAndroid Build Coastguard Worker void DumpCoin(const SkOpSegment& segment) {
1473*c8dee2aaSAndroid Build Coastguard Worker segment.dumpCoin();
1474*c8dee2aaSAndroid Build Coastguard Worker }
1475*c8dee2aaSAndroid Build Coastguard Worker
DumpPts(const SkOpSegment & segment,const char * prefix)1476*c8dee2aaSAndroid Build Coastguard Worker void DumpPts(const SkOpSegment& segment, const char* prefix) {
1477*c8dee2aaSAndroid Build Coastguard Worker segment.dumpPts(prefix);
1478*c8dee2aaSAndroid Build Coastguard Worker }
1479*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkOpPtT & ptT)1480*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkOpPtT& ptT) {
1481*c8dee2aaSAndroid Build Coastguard Worker ptT.dump();
1482*c8dee2aaSAndroid Build Coastguard Worker }
1483*c8dee2aaSAndroid Build Coastguard Worker
DumpAll(const SkOpPtT & ptT)1484*c8dee2aaSAndroid Build Coastguard Worker void DumpAll(const SkOpPtT& ptT) {
1485*c8dee2aaSAndroid Build Coastguard Worker ptT.dumpAll();
1486*c8dee2aaSAndroid Build Coastguard Worker }
1487*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkOpSpanBase & spanBase)1488*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkOpSpanBase& spanBase) {
1489*c8dee2aaSAndroid Build Coastguard Worker spanBase.dump();
1490*c8dee2aaSAndroid Build Coastguard Worker }
1491*c8dee2aaSAndroid Build Coastguard Worker
DumpCoin(const SkOpSpanBase & spanBase)1492*c8dee2aaSAndroid Build Coastguard Worker void DumpCoin(const SkOpSpanBase& spanBase) {
1493*c8dee2aaSAndroid Build Coastguard Worker spanBase.dumpCoin();
1494*c8dee2aaSAndroid Build Coastguard Worker }
1495*c8dee2aaSAndroid Build Coastguard Worker
DumpAll(const SkOpSpanBase & spanBase)1496*c8dee2aaSAndroid Build Coastguard Worker void DumpAll(const SkOpSpanBase& spanBase) {
1497*c8dee2aaSAndroid Build Coastguard Worker spanBase.dumpAll();
1498*c8dee2aaSAndroid Build Coastguard Worker }
1499*c8dee2aaSAndroid Build Coastguard Worker
DumpCoin(const SkOpSpan & span)1500*c8dee2aaSAndroid Build Coastguard Worker void DumpCoin(const SkOpSpan& span) {
1501*c8dee2aaSAndroid Build Coastguard Worker span.dumpCoin();
1502*c8dee2aaSAndroid Build Coastguard Worker }
1503*c8dee2aaSAndroid Build Coastguard Worker
DumpSpan(const SkOpSpan & span)1504*c8dee2aaSAndroid Build Coastguard Worker bool DumpSpan(const SkOpSpan& span) {
1505*c8dee2aaSAndroid Build Coastguard Worker return span.dumpSpan();
1506*c8dee2aaSAndroid Build Coastguard Worker }
1507*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkDConic & conic)1508*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkDConic& conic) {
1509*c8dee2aaSAndroid Build Coastguard Worker conic.dump();
1510*c8dee2aaSAndroid Build Coastguard Worker }
1511*c8dee2aaSAndroid Build Coastguard Worker
DumpID(const SkDConic & conic,int id)1512*c8dee2aaSAndroid Build Coastguard Worker void DumpID(const SkDConic& conic, int id) {
1513*c8dee2aaSAndroid Build Coastguard Worker conic.dumpID(id);
1514*c8dee2aaSAndroid Build Coastguard Worker }
1515*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkDCubic & cubic)1516*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkDCubic& cubic) {
1517*c8dee2aaSAndroid Build Coastguard Worker cubic.dump();
1518*c8dee2aaSAndroid Build Coastguard Worker }
1519*c8dee2aaSAndroid Build Coastguard Worker
DumpID(const SkDCubic & cubic,int id)1520*c8dee2aaSAndroid Build Coastguard Worker void DumpID(const SkDCubic& cubic, int id) {
1521*c8dee2aaSAndroid Build Coastguard Worker cubic.dumpID(id);
1522*c8dee2aaSAndroid Build Coastguard Worker }
1523*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkDLine & line)1524*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkDLine& line) {
1525*c8dee2aaSAndroid Build Coastguard Worker line.dump();
1526*c8dee2aaSAndroid Build Coastguard Worker }
1527*c8dee2aaSAndroid Build Coastguard Worker
DumpID(const SkDLine & line,int id)1528*c8dee2aaSAndroid Build Coastguard Worker void DumpID(const SkDLine& line, int id) {
1529*c8dee2aaSAndroid Build Coastguard Worker line.dumpID(id);
1530*c8dee2aaSAndroid Build Coastguard Worker }
1531*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkDQuad & quad)1532*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkDQuad& quad) {
1533*c8dee2aaSAndroid Build Coastguard Worker quad.dump();
1534*c8dee2aaSAndroid Build Coastguard Worker }
1535*c8dee2aaSAndroid Build Coastguard Worker
DumpID(const SkDQuad & quad,int id)1536*c8dee2aaSAndroid Build Coastguard Worker void DumpID(const SkDQuad& quad, int id) {
1537*c8dee2aaSAndroid Build Coastguard Worker quad.dumpID(id);
1538*c8dee2aaSAndroid Build Coastguard Worker }
1539*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkDPoint & point)1540*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkDPoint& point) {
1541*c8dee2aaSAndroid Build Coastguard Worker point.dump();
1542*c8dee2aaSAndroid Build Coastguard Worker }
1543*c8dee2aaSAndroid Build Coastguard Worker
Dump(const SkOpAngle & angle)1544*c8dee2aaSAndroid Build Coastguard Worker void Dump(const SkOpAngle& angle) {
1545*c8dee2aaSAndroid Build Coastguard Worker angle.dump();
1546*c8dee2aaSAndroid Build Coastguard Worker }
1547*c8dee2aaSAndroid Build Coastguard Worker
debugAddAngle(double startT,double endT)1548*c8dee2aaSAndroid Build Coastguard Worker void SkOpSegment::debugAddAngle(double startT, double endT) {
1549*c8dee2aaSAndroid Build Coastguard Worker SkOpPtT* startPtT = startT == 0 ? fHead.ptT() : startT == 1 ? fTail.ptT()
1550*c8dee2aaSAndroid Build Coastguard Worker : this->addT(startT);
1551*c8dee2aaSAndroid Build Coastguard Worker SkOpPtT* endPtT = endT == 0 ? fHead.ptT() : endT == 1 ? fTail.ptT()
1552*c8dee2aaSAndroid Build Coastguard Worker : this->addT(endT);
1553*c8dee2aaSAndroid Build Coastguard Worker SkOpAngle* angle = this->globalState()->allocator()->make<SkOpAngle>();
1554*c8dee2aaSAndroid Build Coastguard Worker SkOpSpanBase* startSpan = &fHead;
1555*c8dee2aaSAndroid Build Coastguard Worker while (startSpan->ptT() != startPtT) {
1556*c8dee2aaSAndroid Build Coastguard Worker startSpan = startSpan->upCast()->next();
1557*c8dee2aaSAndroid Build Coastguard Worker }
1558*c8dee2aaSAndroid Build Coastguard Worker SkOpSpanBase* endSpan = &fHead;
1559*c8dee2aaSAndroid Build Coastguard Worker while (endSpan->ptT() != endPtT) {
1560*c8dee2aaSAndroid Build Coastguard Worker endSpan = endSpan->upCast()->next();
1561*c8dee2aaSAndroid Build Coastguard Worker }
1562*c8dee2aaSAndroid Build Coastguard Worker angle->set(startSpan, endSpan);
1563*c8dee2aaSAndroid Build Coastguard Worker if (startT < endT) {
1564*c8dee2aaSAndroid Build Coastguard Worker startSpan->upCast()->setToAngle(angle);
1565*c8dee2aaSAndroid Build Coastguard Worker endSpan->setFromAngle(angle);
1566*c8dee2aaSAndroid Build Coastguard Worker } else {
1567*c8dee2aaSAndroid Build Coastguard Worker endSpan->upCast()->setToAngle(angle);
1568*c8dee2aaSAndroid Build Coastguard Worker startSpan->setFromAngle(angle);
1569*c8dee2aaSAndroid Build Coastguard Worker }
1570*c8dee2aaSAndroid Build Coastguard Worker }
1571