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