blob: bd27e7df2dd509575ae8fa696bf4cbd6a26509dc [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"
bungeman60e0fee2015-08-26 05:15:46 -070012
13#include <stdlib.h>
bungeman@google.comfab44db2013-10-11 18:50:45 +000014#include <stdio.h>
caryclark@google.com07393ca2013-04-08 11:47:37 +000015
16#ifdef SK_RELEASE
17#define FORCE_RELEASE 1
18#else
caryclark@google.comb3f09212013-04-17 15:49:16 +000019#define FORCE_RELEASE 1 // set force release to 1 for multiple thread -- no debugging
caryclark@google.com07393ca2013-04-08 11:47:37 +000020#endif
21
22#define ONE_OFF_DEBUG 0
23#define ONE_OFF_DEBUG_MATHEMATICA 0
24
caryclark@google.comdb60de72013-04-11 12:33:23 +000025#if defined(SK_BUILD_FOR_WIN) || defined(SK_BUILD_FOR_ANDROID)
caryclark@google.com07393ca2013-04-08 11:47:37 +000026 #define SK_RAND(seed) rand()
caryclark@google.com07393ca2013-04-08 11:47:37 +000027#else
28 #define SK_RAND(seed) rand_r(&seed)
caryclark@google.comdb60de72013-04-11 12:33:23 +000029#endif
30#ifdef SK_BUILD_FOR_WIN
31 #define SK_SNPRINTF _snprintf
32#else
skia.committer@gmail.com32840172013-04-09 07:01:27 +000033 #define SK_SNPRINTF snprintf
caryclark@google.com07393ca2013-04-08 11:47:37 +000034#endif
35
commit-bot@chromium.org4431e772014-04-14 17:08:59 +000036#define WIND_AS_STRING(x) char x##Str[12]; \
37 if (!SkPathOpsDebug::ValidWind(x)) strcpy(x##Str, "?"); \
38 else SK_SNPRINTF(x##Str, sizeof(x##Str), "%d", x)
39
caryclark@google.com07393ca2013-04-08 11:47:37 +000040#if FORCE_RELEASE
41
42#define DEBUG_ACTIVE_OP 0
43#define DEBUG_ACTIVE_SPANS 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000044#define DEBUG_ADD_INTERSECTING_TS 0
caryclark54359292015-03-26 07:52:43 -070045#define DEBUG_ADD_T 0
caryclark26ad22a2015-10-16 09:03:38 -070046#define DEBUG_ALIGNMENT 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000047#define DEBUG_ANGLE 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000048#define DEBUG_ASSEMBLE 0
caryclark26ad22a2015-10-16 09:03:38 -070049#define DEBUG_COINCIDENCE 0
commit-bot@chromium.org2db7fe72014-05-07 15:31:40 +000050#define DEBUG_CUBIC_BINARY_SEARCH 0
caryclark03b03ca2015-04-23 09:13:37 -070051#define DEBUG_CUBIC_SPLIT 0
caryclark624637c2015-05-11 07:21:27 -070052#define DEBUG_DUMP_SEGMENTS 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000053#define DEBUG_FLOW 0
commit-bot@chromium.org8cb1daa2014-04-25 12:59:11 +000054#define DEBUG_LIMIT_WIND_SUM 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000055#define DEBUG_MARK_DONE 0
56#define DEBUG_PATH_CONSTRUCTION 0
caryclark54359292015-03-26 07:52:43 -070057#define DEBUG_PERP 0
caryclark624637c2015-05-11 07:21:27 -070058#define DEBUG_SHOW_TEST_NAME 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000059#define DEBUG_SORT 0
caryclark54359292015-03-26 07:52:43 -070060#define DEBUG_T_SECT 0
61#define DEBUG_T_SECT_DUMP 0
caryclark26ad22a2015-10-16 09:03:38 -070062#define DEBUG_T_SECT_LOOP_COUNT 0
caryclark@google.com4fdbb222013-07-23 15:27:41 +000063#define DEBUG_VALIDATE 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000064#define DEBUG_WINDING 0
65#define DEBUG_WINDING_AT_T 0
66
caryclark26ad22a2015-10-16 09:03:38 -070067
caryclark@google.com07393ca2013-04-08 11:47:37 +000068#else
69
70#define DEBUG_ACTIVE_OP 1
71#define DEBUG_ACTIVE_SPANS 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000072#define DEBUG_ADD_INTERSECTING_TS 1
caryclark54359292015-03-26 07:52:43 -070073#define DEBUG_ADD_T 1
caryclark26ad22a2015-10-16 09:03:38 -070074#define DEBUG_ALIGNMENT 0
caryclark@google.com07393ca2013-04-08 11:47:37 +000075#define DEBUG_ANGLE 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000076#define DEBUG_ASSEMBLE 1
caryclarked0935a2015-10-22 07:23:52 -070077#define DEBUG_COINCIDENCE 0
caryclark65b427c2014-09-18 10:32:57 -070078#define DEBUG_CUBIC_BINARY_SEARCH 0
caryclark03b03ca2015-04-23 09:13:37 -070079#define DEBUG_CUBIC_SPLIT 1
80#define DEBUG_DUMP_SEGMENTS 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000081#define DEBUG_FLOW 1
caryclark54359292015-03-26 07:52:43 -070082#define DEBUG_LIMIT_WIND_SUM 5
caryclark@google.com07393ca2013-04-08 11:47:37 +000083#define DEBUG_MARK_DONE 1
84#define DEBUG_PATH_CONSTRUCTION 1
caryclark03b03ca2015-04-23 09:13:37 -070085#define DEBUG_PERP 1
caryclark@google.com03610322013-04-18 15:58:21 +000086#define DEBUG_SHOW_TEST_NAME 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000087#define DEBUG_SORT 1
caryclarked0935a2015-10-22 07:23:52 -070088#define DEBUG_T_SECT 0
89#define DEBUG_T_SECT_DUMP 0
90#define DEBUG_T_SECT_LOOP_COUNT 0
caryclark54359292015-03-26 07:52:43 -070091#define DEBUG_VALIDATE 1
caryclark@google.com07393ca2013-04-08 11:47:37 +000092#define DEBUG_WINDING 1
93#define DEBUG_WINDING_AT_T 1
94
95#endif
96
caryclark54359292015-03-26 07:52:43 -070097#ifdef SK_RELEASE
caryclark1049f122015-04-20 08:31:59 -070098 #define SkDEBUGRELEASE(a, b) b
99 #define SkDEBUGPARAMS(...)
100 #define SkDEBUGCODE_(...)
reed0dc4dd62015-03-24 13:55:33 -0700101#else
caryclark1049f122015-04-20 08:31:59 -0700102 #define SkDEBUGRELEASE(a, b) a
103 #define SkDEBUGPARAMS(...) , __VA_ARGS__
104 #define SkDEBUGCODE_(...) __VA_ARGS__ // temporary until SkDEBUGCODE is fixed
reed0dc4dd62015-03-24 13:55:33 -0700105#endif
caryclark54359292015-03-26 07:52:43 -0700106
caryclark27c8eb82015-07-06 11:38:33 -0700107#if DEBUG_VALIDATE == 0
108 #define PATH_OPS_DEBUG_VALIDATE_PARAMS(...)
109#else
110 #define PATH_OPS_DEBUG_VALIDATE_PARAMS(...) , __VA_ARGS__
111#endif
112
caryclark54359292015-03-26 07:52:43 -0700113#if DEBUG_T_SECT == 0
114 #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) b
115 #define PATH_OPS_DEBUG_T_SECT_PARAMS(...)
116 #define PATH_OPS_DEBUG_T_SECT_CODE(...)
117#else
118 #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) a
119 #define PATH_OPS_DEBUG_T_SECT_PARAMS(...) , __VA_ARGS__
120 #define PATH_OPS_DEBUG_T_SECT_CODE(...) __VA_ARGS__
121#endif
122
123#if DEBUG_T_SECT_DUMP > 1
124 extern int gDumpTSectNum;
125#endif
126
caryclark26ad22a2015-10-16 09:03:38 -0700127#if DEBUG_COINCIDENCE
128 #define DEBUG_COINCIDENCE_HEALTH(contourList, id) \
129 SkPathOpsDebug::CheckHealth(contourList, id)
130#else
131 #define DEBUG_COINCIDENCE_HEALTH(contourList, id)
132#endif
133
caryclark1049f122015-04-20 08:31:59 -0700134#define CUBIC_DEBUG_STR "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
135#define CONIC_DEBUG_STR "{{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}, %1.9g}"
136#define QUAD_DEBUG_STR "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
137#define LINE_DEBUG_STR "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
caryclark54359292015-03-26 07:52:43 -0700138#define PT_DEBUG_STR "{{%1.9g,%1.9g}}"
139
caryclark@google.com07393ca2013-04-08 11:47:37 +0000140#define T_DEBUG_STR(t, n) #t "[" #n "]=%1.9g"
141#define TX_DEBUG_STR(t) #t "[%d]=%1.9g"
142#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
caryclark1049f122015-04-20 08:31:59 -0700143#define CONIC_DEBUG_DATA(c, w) c[0].fX, c[0].fY, c[1].fX, c[1].fY, c[2].fX, c[2].fY, w
caryclark@google.com07393ca2013-04-08 11:47:37 +0000144#define QUAD_DEBUG_DATA(q) q[0].fX, q[0].fY, q[1].fX, q[1].fY, q[2].fX, q[2].fY
145#define LINE_DEBUG_DATA(l) l[0].fX, l[0].fY, l[1].fX, l[1].fY
caryclarkdac1d172014-06-17 05:15:38 -0700146#define PT_DEBUG_DATA(i, n) i.pt(n).asSkPoint().fX, i.pt(n).asSkPoint().fY
caryclark@google.com07393ca2013-04-08 11:47:37 +0000147
caryclark@google.com07e97fc2013-07-08 17:17:02 +0000148#ifndef DEBUG_TEST
149#define DEBUG_TEST 0
caryclark@google.coma5e55922013-05-07 18:51:31 +0000150#endif
151
caryclark@google.com570863f2013-09-16 15:55:01 +0000152#if DEBUG_SHOW_TEST_NAME
153#include "SkTLS.h"
154#endif
155
caryclark@google.com570863f2013-09-16 15:55:01 +0000156class SkPathOpsDebug {
157public:
caryclark@google.com570863f2013-09-16 15:55:01 +0000158 static const char* kLVerbStr[];
caryclark26ad22a2015-10-16 09:03:38 -0700159 struct GlitchLog;
commit-bot@chromium.org8cb1daa2014-04-25 12:59:11 +0000160
161#if defined(SK_DEBUG) || !FORCE_RELEASE
caryclark@google.com570863f2013-09-16 15:55:01 +0000162 static int gContourID;
163 static int gSegmentID;
commit-bot@chromium.org8cb1daa2014-04-25 12:59:11 +0000164#endif
caryclark@google.com570863f2013-09-16 15:55:01 +0000165
caryclark624637c2015-05-11 07:21:27 -0700166#if DEBUG_SORT
caryclark@google.com570863f2013-09-16 15:55:01 +0000167 static int gSortCountDefault;
168 static int gSortCount;
169#endif
170
171#if DEBUG_ACTIVE_OP
172 static const char* kPathOpStr[];
173#endif
174
caryclark26ad22a2015-10-16 09:03:38 -0700175 static void CoincidentHealth(class SkOpContourHead* contourList, const char* id);
caryclark@google.com570863f2013-09-16 15:55:01 +0000176 static void MathematicaIze(char* str, size_t bufferSize);
177 static bool ValidWind(int winding);
178 static void WindingPrintf(int winding);
179
180#if DEBUG_SHOW_TEST_NAME
181 static void* CreateNameStr();
182 static void DeleteNameStr(void* v);
183#define DEBUG_FILENAME_STRING_LENGTH 64
184#define DEBUG_FILENAME_STRING (reinterpret_cast<char* >(SkTLS::Get(SkPathOpsDebug::CreateNameStr, \
185 SkPathOpsDebug::DeleteNameStr)))
186 static void BumpTestName(char* );
caryclark@google.com570863f2013-09-16 15:55:01 +0000187#endif
caryclark03b03ca2015-04-23 09:13:37 -0700188 static const char* OpStr(SkPathOp );
caryclark19eb3b22014-07-18 05:08:14 -0700189 static void ShowOnePath(const SkPath& path, const char* name, bool includeDeclaration);
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000190 static void ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name);
caryclark54359292015-03-26 07:52:43 -0700191
192 static bool ChaseContains(const SkTDArray<class SkOpSpanBase*>& , const class SkOpSpanBase* );
193
caryclark26ad22a2015-10-16 09:03:38 -0700194 static void CheckHealth(class SkOpContourHead* contourList, const char* id);
195
caryclark54359292015-03-26 07:52:43 -0700196 static const struct SkOpAngle* DebugAngleAngle(const struct SkOpAngle*, int id);
197 static class SkOpContour* DebugAngleContour(struct SkOpAngle*, int id);
198 static const class SkOpPtT* DebugAnglePtT(const struct SkOpAngle*, int id);
199 static const class SkOpSegment* DebugAngleSegment(const struct SkOpAngle*, int id);
200 static const class SkOpSpanBase* DebugAngleSpan(const struct SkOpAngle*, int id);
201
202 static const struct SkOpAngle* DebugContourAngle(class SkOpContour*, int id);
203 static class SkOpContour* DebugContourContour(class SkOpContour*, int id);
204 static const class SkOpPtT* DebugContourPtT(class SkOpContour*, int id);
205 static const class SkOpSegment* DebugContourSegment(class SkOpContour*, int id);
206 static const class SkOpSpanBase* DebugContourSpan(class SkOpContour*, int id);
207
caryclark27c8eb82015-07-06 11:38:33 -0700208 static const struct SkOpAngle* DebugCoincidenceAngle(class SkOpCoincidence*, int id);
209 static class SkOpContour* DebugCoincidenceContour(class SkOpCoincidence*, int id);
210 static const class SkOpPtT* DebugCoincidencePtT(class SkOpCoincidence*, int id);
211 static const class SkOpSegment* DebugCoincidenceSegment(class SkOpCoincidence*, int id);
212 static const class SkOpSpanBase* DebugCoincidenceSpan(class SkOpCoincidence*, int id);
213
caryclark54359292015-03-26 07:52:43 -0700214 static const struct SkOpAngle* DebugPtTAngle(const class SkOpPtT*, int id);
215 static class SkOpContour* DebugPtTContour(class SkOpPtT*, int id);
216 static const class SkOpPtT* DebugPtTPtT(const class SkOpPtT*, int id);
217 static const class SkOpSegment* DebugPtTSegment(const class SkOpPtT*, int id);
218 static const class SkOpSpanBase* DebugPtTSpan(const class SkOpPtT*, int id);
219
220 static const struct SkOpAngle* DebugSegmentAngle(const class SkOpSegment*, int id);
221 static class SkOpContour* DebugSegmentContour(class SkOpSegment*, int id);
222 static const class SkOpPtT* DebugSegmentPtT(const class SkOpSegment*, int id);
223 static const class SkOpSegment* DebugSegmentSegment(const class SkOpSegment*, int id);
224 static const class SkOpSpanBase* DebugSegmentSpan(const class SkOpSegment*, int id);
225
226 static const struct SkOpAngle* DebugSpanAngle(const class SkOpSpanBase*, int id);
227 static class SkOpContour* DebugSpanContour(class SkOpSpanBase*, int id);
228 static const class SkOpPtT* DebugSpanPtT(const class SkOpSpanBase*, int id);
229 static const class SkOpSegment* DebugSpanSegment(const class SkOpSpanBase*, int id);
230 static const class SkOpSpanBase* DebugSpanSpan(const class SkOpSpanBase*, int id);
caryclark@google.com570863f2013-09-16 15:55:01 +0000231};
232
caryclark54359292015-03-26 07:52:43 -0700233struct SkDQuad;
caryclarkdac1d172014-06-17 05:15:38 -0700234
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000235// generates tools/path_sorter.htm and path_visualizer.htm compatible data
caryclark54359292015-03-26 07:52:43 -0700236void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo);
237void DumpT(const SkDQuad& quad, double t);
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000238
caryclark@google.com07393ca2013-04-08 11:47:37 +0000239#endif