blob: 72a9ea528f65be7fec1ea1090035f4598957c7ed [file] [log] [blame]
caryclark@google.com07393ca2013-04-08 11:47:37 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#ifndef SkPathOpsDebug_DEFINED
8#define SkPathOpsDebug_DEFINED
9
caryclark@google.coma5e55922013-05-07 18:51:31 +000010#include "SkPathOps.h"
caryclark@google.com07393ca2013-04-08 11:47:37 +000011#include "SkTypes.h"
bungeman@google.comfab44db2013-10-11 18:50:45 +000012#include <stdio.h>
caryclark@google.com07393ca2013-04-08 11:47:37 +000013
14#ifdef SK_RELEASE
15#define FORCE_RELEASE 1
16#else
caryclark@google.comb3f09212013-04-17 15:49:16 +000017#define FORCE_RELEASE 1 // set force release to 1 for multiple thread -- no debugging
caryclark@google.com07393ca2013-04-08 11:47:37 +000018#endif
19
20#define ONE_OFF_DEBUG 0
21#define ONE_OFF_DEBUG_MATHEMATICA 0
22
caryclark@google.comdb60de72013-04-11 12:33:23 +000023#if defined(SK_BUILD_FOR_WIN) || defined(SK_BUILD_FOR_ANDROID)
caryclark@google.com07393ca2013-04-08 11:47:37 +000024 #define SK_RAND(seed) rand()
caryclark@google.com07393ca2013-04-08 11:47:37 +000025#else
26 #define SK_RAND(seed) rand_r(&seed)
caryclark@google.comdb60de72013-04-11 12:33:23 +000027#endif
28#ifdef SK_BUILD_FOR_WIN
29 #define SK_SNPRINTF _snprintf
30#else
skia.committer@gmail.com32840172013-04-09 07:01:27 +000031 #define SK_SNPRINTF snprintf
caryclark@google.com07393ca2013-04-08 11:47:37 +000032#endif
33
commit-bot@chromium.org4431e772014-04-14 17:08:59 +000034#define WIND_AS_STRING(x) char x##Str[12]; \
35 if (!SkPathOpsDebug::ValidWind(x)) strcpy(x##Str, "?"); \
36 else SK_SNPRINTF(x##Str, sizeof(x##Str), "%d", x)
37
caryclark@google.com07393ca2013-04-08 11:47:37 +000038#if FORCE_RELEASE
39
40#define DEBUG_ACTIVE_OP 0
41#define DEBUG_ACTIVE_SPANS 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000042#define DEBUG_ADD_INTERSECTING_TS 0
caryclark54359292015-03-26 07:52:43 -070043#define DEBUG_ADD_T 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000044#define DEBUG_ANGLE 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000045#define DEBUG_ASSEMBLE 0
commit-bot@chromium.org2db7fe72014-05-07 15:31:40 +000046#define DEBUG_CUBIC_BINARY_SEARCH 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000047#define DEBUG_FLOW 0
commit-bot@chromium.org8cb1daa2014-04-25 12:59:11 +000048#define DEBUG_LIMIT_WIND_SUM 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000049#define DEBUG_MARK_DONE 0
50#define DEBUG_PATH_CONSTRUCTION 0
caryclark54359292015-03-26 07:52:43 -070051#define DEBUG_PERP 0
caryclark@google.com03610322013-04-18 15:58:21 +000052#define DEBUG_SHOW_TEST_NAME 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000053#define DEBUG_SORT 0
54#define DEBUG_SWAP_TOP 0
caryclark54359292015-03-26 07:52:43 -070055#define DEBUG_T_SECT 0
56#define DEBUG_T_SECT_DUMP 0
caryclark@google.com4fdbb222013-07-23 15:27:41 +000057#define DEBUG_VALIDATE 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000058#define DEBUG_WINDING 0
59#define DEBUG_WINDING_AT_T 0
60
61#else
62
63#define DEBUG_ACTIVE_OP 1
64#define DEBUG_ACTIVE_SPANS 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000065#define DEBUG_ADD_INTERSECTING_TS 1
caryclark54359292015-03-26 07:52:43 -070066#define DEBUG_ADD_T 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000067#define DEBUG_ANGLE 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000068#define DEBUG_ASSEMBLE 1
caryclark65b427c2014-09-18 10:32:57 -070069#define DEBUG_CUBIC_BINARY_SEARCH 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000070#define DEBUG_FLOW 1
caryclark54359292015-03-26 07:52:43 -070071#define DEBUG_LIMIT_WIND_SUM 5
caryclark@google.com07393ca2013-04-08 11:47:37 +000072#define DEBUG_MARK_DONE 1
73#define DEBUG_PATH_CONSTRUCTION 1
caryclark54359292015-03-26 07:52:43 -070074#define DEBUG_PERP 0
caryclark@google.com03610322013-04-18 15:58:21 +000075#define DEBUG_SHOW_TEST_NAME 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000076#define DEBUG_SORT 1
77#define DEBUG_SWAP_TOP 1
caryclark54359292015-03-26 07:52:43 -070078#define DEBUG_T_SECT 1
79#define DEBUG_T_SECT_DUMP 02
80#define DEBUG_VALIDATE 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000081#define DEBUG_WINDING 1
82#define DEBUG_WINDING_AT_T 1
83
84#endif
85
caryclark54359292015-03-26 07:52:43 -070086#ifdef SK_RELEASE
87 #define PATH_OPS_DEBUG_RELEASE(a, b) b
88 #define PATH_OPS_DEBUG_CODE(...)
89 #define PATH_OPS_DEBUG_PARAMS(...)
reed0dc4dd62015-03-24 13:55:33 -070090#else
caryclark54359292015-03-26 07:52:43 -070091 #define PATH_OPS_DEBUG_RELEASE(a, b) a
92 #define PATH_OPS_DEBUG_CODE(...) __VA_ARGS__
93 #define PATH_OPS_DEBUG_PARAMS(...) , __VA_ARGS__
reed0dc4dd62015-03-24 13:55:33 -070094#endif
caryclark54359292015-03-26 07:52:43 -070095
96#if DEBUG_T_SECT == 0
97 #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) b
98 #define PATH_OPS_DEBUG_T_SECT_PARAMS(...)
99 #define PATH_OPS_DEBUG_T_SECT_CODE(...)
100#else
101 #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) a
102 #define PATH_OPS_DEBUG_T_SECT_PARAMS(...) , __VA_ARGS__
103 #define PATH_OPS_DEBUG_T_SECT_CODE(...) __VA_ARGS__
104#endif
105
106#if DEBUG_T_SECT_DUMP > 1
107 extern int gDumpTSectNum;
108#endif
109
110#define CUBIC_DEBUG_STR "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
111#define QUAD_DEBUG_STR "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
112#define LINE_DEBUG_STR "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
113#define PT_DEBUG_STR "{{%1.9g,%1.9g}}"
114
caryclark@google.com07393ca2013-04-08 11:47:37 +0000115#define T_DEBUG_STR(t, n) #t "[" #n "]=%1.9g"
116#define TX_DEBUG_STR(t) #t "[%d]=%1.9g"
117#define CUBIC_DEBUG_DATA(c) c[0].fX, c[0].fY, c[1].fX, c[1].fY, c[2].fX, c[2].fY, c[3].fX, c[3].fY
118#define QUAD_DEBUG_DATA(q) q[0].fX, q[0].fY, q[1].fX, q[1].fY, q[2].fX, q[2].fY
119#define LINE_DEBUG_DATA(l) l[0].fX, l[0].fY, l[1].fX, l[1].fY
caryclarkdac1d172014-06-17 05:15:38 -0700120#define PT_DEBUG_DATA(i, n) i.pt(n).asSkPoint().fX, i.pt(n).asSkPoint().fY
caryclark@google.com07393ca2013-04-08 11:47:37 +0000121
caryclark@google.com07e97fc2013-07-08 17:17:02 +0000122#ifndef DEBUG_TEST
123#define DEBUG_TEST 0
caryclark@google.coma5e55922013-05-07 18:51:31 +0000124#endif
125
caryclark@google.com570863f2013-09-16 15:55:01 +0000126#if DEBUG_SHOW_TEST_NAME
127#include "SkTLS.h"
128#endif
129
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000130#include "SkTDArray.h"
caryclark@google.com570863f2013-09-16 15:55:01 +0000131
132class SkPathOpsDebug {
133public:
caryclark@google.com570863f2013-09-16 15:55:01 +0000134 static const char* kLVerbStr[];
commit-bot@chromium.org8cb1daa2014-04-25 12:59:11 +0000135
136#if defined(SK_DEBUG) || !FORCE_RELEASE
caryclark@google.com570863f2013-09-16 15:55:01 +0000137 static int gContourID;
138 static int gSegmentID;
commit-bot@chromium.org8cb1daa2014-04-25 12:59:11 +0000139#endif
caryclark@google.com570863f2013-09-16 15:55:01 +0000140
141#if DEBUG_SORT || DEBUG_SWAP_TOP
142 static int gSortCountDefault;
143 static int gSortCount;
144#endif
145
146#if DEBUG_ACTIVE_OP
147 static const char* kPathOpStr[];
148#endif
149
150 static void MathematicaIze(char* str, size_t bufferSize);
151 static bool ValidWind(int winding);
152 static void WindingPrintf(int winding);
153
154#if DEBUG_SHOW_TEST_NAME
155 static void* CreateNameStr();
156 static void DeleteNameStr(void* v);
157#define DEBUG_FILENAME_STRING_LENGTH 64
158#define DEBUG_FILENAME_STRING (reinterpret_cast<char* >(SkTLS::Get(SkPathOpsDebug::CreateNameStr, \
159 SkPathOpsDebug::DeleteNameStr)))
160 static void BumpTestName(char* );
caryclark@google.com570863f2013-09-16 15:55:01 +0000161#endif
caryclark19eb3b22014-07-18 05:08:14 -0700162 static void ShowOnePath(const SkPath& path, const char* name, bool includeDeclaration);
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000163 static void ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name);
caryclark54359292015-03-26 07:52:43 -0700164
165 static bool ChaseContains(const SkTDArray<class SkOpSpanBase*>& , const class SkOpSpanBase* );
166
167 static const struct SkOpAngle* DebugAngleAngle(const struct SkOpAngle*, int id);
168 static class SkOpContour* DebugAngleContour(struct SkOpAngle*, int id);
169 static const class SkOpPtT* DebugAnglePtT(const struct SkOpAngle*, int id);
170 static const class SkOpSegment* DebugAngleSegment(const struct SkOpAngle*, int id);
171 static const class SkOpSpanBase* DebugAngleSpan(const struct SkOpAngle*, int id);
172
173 static const struct SkOpAngle* DebugContourAngle(class SkOpContour*, int id);
174 static class SkOpContour* DebugContourContour(class SkOpContour*, int id);
175 static const class SkOpPtT* DebugContourPtT(class SkOpContour*, int id);
176 static const class SkOpSegment* DebugContourSegment(class SkOpContour*, int id);
177 static const class SkOpSpanBase* DebugContourSpan(class SkOpContour*, int id);
178
179 static const struct SkOpAngle* DebugPtTAngle(const class SkOpPtT*, int id);
180 static class SkOpContour* DebugPtTContour(class SkOpPtT*, int id);
181 static const class SkOpPtT* DebugPtTPtT(const class SkOpPtT*, int id);
182 static const class SkOpSegment* DebugPtTSegment(const class SkOpPtT*, int id);
183 static const class SkOpSpanBase* DebugPtTSpan(const class SkOpPtT*, int id);
184
185 static const struct SkOpAngle* DebugSegmentAngle(const class SkOpSegment*, int id);
186 static class SkOpContour* DebugSegmentContour(class SkOpSegment*, int id);
187 static const class SkOpPtT* DebugSegmentPtT(const class SkOpSegment*, int id);
188 static const class SkOpSegment* DebugSegmentSegment(const class SkOpSegment*, int id);
189 static const class SkOpSpanBase* DebugSegmentSpan(const class SkOpSegment*, int id);
190
191 static const struct SkOpAngle* DebugSpanAngle(const class SkOpSpanBase*, int id);
192 static class SkOpContour* DebugSpanContour(class SkOpSpanBase*, int id);
193 static const class SkOpPtT* DebugSpanPtT(const class SkOpSpanBase*, int id);
194 static const class SkOpSegment* DebugSpanSegment(const class SkOpSpanBase*, int id);
195 static const class SkOpSpanBase* DebugSpanSpan(const class SkOpSpanBase*, int id);
196
197 static void DumpContours(SkTDArray<class SkOpContour* >* contours);
198 static void DumpContoursAll(SkTDArray<class SkOpContour* >* contours);
199 static void DumpContoursAngles(const SkTDArray<class SkOpContour* >* contours);
200 static void DumpContoursPt(const SkTDArray<class SkOpContour* >* contours, int id);
201 static void DumpContoursPts(const SkTDArray<class SkOpContour* >* contours);
202 static void DumpContoursSegment(const SkTDArray<class SkOpContour* >* contours, int id);
203 static void DumpContoursSpan(const SkTDArray<class SkOpContour* >* contours, int id);
204 static void DumpContoursSpans(const SkTDArray<class SkOpContour* >* contours);
caryclark@google.com570863f2013-09-16 15:55:01 +0000205};
206
caryclark@google.com7eaa53d2013-10-02 14:49:34 +0000207// shorthand for calling from debugger
caryclark54359292015-03-26 07:52:43 -0700208template<typename TCurve> class SkTSect;
209template<typename TCurve> class SkTSpan;
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000210
caryclark54359292015-03-26 07:52:43 -0700211struct SkDQuad;
212struct SkDCubic;
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000213
caryclark54359292015-03-26 07:52:43 -0700214const SkTSpan<SkDCubic>* DebugSpan(const SkTSect<SkDCubic>* , int id);
215const SkTSpan<SkDQuad>* DebugSpan(const SkTSect<SkDQuad>* , int id);
216const SkTSpan<SkDCubic>* DebugT(const SkTSect<SkDCubic>* , double t);
217const SkTSpan<SkDQuad>* DebugT(const SkTSect<SkDQuad>* , double t);
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000218
caryclark54359292015-03-26 07:52:43 -0700219const SkTSpan<SkDCubic>* DebugSpan(const SkTSpan<SkDCubic>* , int id);
220const SkTSpan<SkDQuad>* DebugSpan(const SkTSpan<SkDQuad>* , int id);
221const SkTSpan<SkDCubic>* DebugT(const SkTSpan<SkDCubic>* , double t);
222const SkTSpan<SkDQuad>* DebugT(const SkTSpan<SkDQuad>* , double t);
caryclarkdac1d172014-06-17 05:15:38 -0700223
caryclark54359292015-03-26 07:52:43 -0700224void Dump(const SkTSect<SkDCubic>* );
225void Dump(const SkTSect<SkDQuad>* );
226void Dump(const SkTSpan<SkDCubic>* , const SkTSect<SkDCubic>* = NULL);
227void Dump(const SkTSpan<SkDQuad>* , const SkTSect<SkDQuad>* = NULL);
228void DumpBoth(SkTSect<SkDCubic>* sect1, SkTSect<SkDCubic>* sect2);
229void DumpBoth(SkTSect<SkDQuad>* sect1, SkTSect<SkDQuad>* sect2);
230void DumpCoin(SkTSect<SkDCubic>* sect1);
231void DumpCoin(SkTSect<SkDQuad>* sect1);
232void DumpCoinCurves(SkTSect<SkDCubic>* sect1);
233void DumpCoinCurves(SkTSect<SkDQuad>* sect1);
234void DumpCurves(const SkTSpan<SkDCubic>* );
235void DumpCurves(const SkTSpan<SkDQuad>* );
caryclarkdac1d172014-06-17 05:15:38 -0700236
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000237// generates tools/path_sorter.htm and path_visualizer.htm compatible data
caryclark54359292015-03-26 07:52:43 -0700238void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo);
239void DumpT(const SkDQuad& quad, double t);
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000240
caryclark54359292015-03-26 07:52:43 -0700241const struct SkOpAngle* DebugAngle(const SkTDArray<class SkOpContour* >* contours, int id);
242class SkOpContour* DebugContour(const SkTDArray<class SkOpContour* >* contours, int id);
243const class SkOpPtT* DebugPtT(const SkTDArray<class SkOpContour* >* contours, int id);
244const class SkOpSegment* DebugSegment(const SkTDArray<class SkOpContour* >* contours, int id);
245const class SkOpSpanBase* DebugSpan(const SkTDArray<class SkOpContour* >* contours, int id);
caryclark@google.com570863f2013-09-16 15:55:01 +0000246
caryclark54359292015-03-26 07:52:43 -0700247void Dump(const SkTDArray<class SkOpContour* >* contours);
248void DumpAll(SkTDArray<class SkOpContour* >* contours);
249void DumpAngles(const SkTDArray<class SkOpContour* >* contours);
250void DumpCoin(const SkTDArray<class SkOpContour* >* contours);
251void DumpPt(const SkTDArray<class SkOpContour* >* contours, int segmentID);
252void DumpPts(const SkTDArray<class SkOpContour* >* contours);
253void DumpSegment(const SkTDArray<class SkOpContour* >* contours, int segmentID);
254void DumpSpan(const SkTDArray<class SkOpContour* >* contours, int spanID);
255void DumpSpans(const SkTDArray<class SkOpContour* >* contours);
caryclark@google.com07393ca2013-04-08 11:47:37 +0000256#endif