• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
10 #include "SkPathOps.h"
11 #include "SkTypes.h"
12 
13 #include <stdlib.h>
14 #include <stdio.h>
15 
16 #ifdef SK_RELEASE
17 #define FORCE_RELEASE 1
18 #else
19 #define FORCE_RELEASE 1  // set force release to 1 for multiple thread -- no debugging
20 #endif
21 
22 #define ONE_OFF_DEBUG 0
23 #define ONE_OFF_DEBUG_MATHEMATICA 0
24 
25 #if defined(SK_BUILD_FOR_WIN) || defined(SK_BUILD_FOR_ANDROID)
26     #define SK_RAND(seed) rand()
27 #else
28     #define SK_RAND(seed) rand_r(&seed)
29 #endif
30 #ifdef SK_BUILD_FOR_WIN
31     #define SK_SNPRINTF _snprintf
32 #else
33     #define SK_SNPRINTF snprintf
34 #endif
35 
36 #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 
40 #if FORCE_RELEASE
41 
42 #define DEBUG_ACTIVE_OP 0
43 #define DEBUG_ACTIVE_SPANS 0
44 #define DEBUG_ADD_INTERSECTING_TS 0
45 #define DEBUG_ADD_T 0
46 #define DEBUG_ALIGNMENT 0
47 #define DEBUG_ANGLE 0
48 #define DEBUG_ASSEMBLE 0
49 #define DEBUG_COINCIDENCE 0
50 #define DEBUG_CUBIC_BINARY_SEARCH 0
51 #define DEBUG_CUBIC_SPLIT 0
52 #define DEBUG_DUMP_SEGMENTS 0
53 #define DEBUG_FLOW 0
54 #define DEBUG_LIMIT_WIND_SUM 0
55 #define DEBUG_MARK_DONE 0
56 #define DEBUG_PATH_CONSTRUCTION 0
57 #define DEBUG_PERP 0
58 #define DEBUG_SHOW_TEST_NAME 0
59 #define DEBUG_SORT 0
60 #define DEBUG_T_SECT 0
61 #define DEBUG_T_SECT_DUMP 0
62 #define DEBUG_T_SECT_LOOP_COUNT 0
63 #define DEBUG_VALIDATE 0
64 #define DEBUG_WINDING 0
65 #define DEBUG_WINDING_AT_T 0
66 
67 
68 #else
69 
70 #define DEBUG_ACTIVE_OP 1
71 #define DEBUG_ACTIVE_SPANS 1
72 #define DEBUG_ADD_INTERSECTING_TS 1
73 #define DEBUG_ADD_T 1
74 #define DEBUG_ALIGNMENT 0
75 #define DEBUG_ANGLE 1
76 #define DEBUG_ASSEMBLE 1
77 #define DEBUG_COINCIDENCE 0
78 #define DEBUG_CUBIC_BINARY_SEARCH 0
79 #define DEBUG_CUBIC_SPLIT 1
80 #define DEBUG_DUMP_SEGMENTS 1
81 #define DEBUG_FLOW 1
82 #define DEBUG_LIMIT_WIND_SUM 5
83 #define DEBUG_MARK_DONE 1
84 #define DEBUG_PATH_CONSTRUCTION 1
85 #define DEBUG_PERP 1
86 #define DEBUG_SHOW_TEST_NAME 1
87 #define DEBUG_SORT 1
88 #define DEBUG_T_SECT 0
89 #define DEBUG_T_SECT_DUMP 0
90 #define DEBUG_T_SECT_LOOP_COUNT 0
91 #define DEBUG_VALIDATE 1
92 #define DEBUG_WINDING 1
93 #define DEBUG_WINDING_AT_T 1
94 
95 #endif
96 
97 #ifdef SK_RELEASE
98     #define SkDEBUGRELEASE(a, b) b
99     #define SkDEBUGPARAMS(...)
100     #define SkDEBUGCODE_(...)
101 #else
102     #define SkDEBUGRELEASE(a, b) a
103     #define SkDEBUGPARAMS(...) , __VA_ARGS__
104     #define SkDEBUGCODE_(...) __VA_ARGS__  // temporary until SkDEBUGCODE is fixed
105 #endif
106 
107 #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 
113 #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 
127 #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 
134 #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}}}"
138 #define PT_DEBUG_STR "{{%1.9g,%1.9g}}"
139 
140 #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
143 #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
144 #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
146 #define PT_DEBUG_DATA(i, n) i.pt(n).asSkPoint().fX, i.pt(n).asSkPoint().fY
147 
148 #ifndef DEBUG_TEST
149 #define DEBUG_TEST 0
150 #endif
151 
152 #if DEBUG_SHOW_TEST_NAME
153 #include "SkTLS.h"
154 #endif
155 
156 class SkPathOpsDebug {
157 public:
158     static const char* kLVerbStr[];
159     struct GlitchLog;
160 
161 #if defined(SK_DEBUG) || !FORCE_RELEASE
162     static int gContourID;
163     static int gSegmentID;
164 #endif
165 
166 #if DEBUG_SORT
167     static int gSortCountDefault;
168     static int gSortCount;
169 #endif
170 
171 #if DEBUG_ACTIVE_OP
172     static const char* kPathOpStr[];
173 #endif
174 
175     static void CoincidentHealth(class SkOpContourHead* contourList, const char* id);
176     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* );
187 #endif
188     static const char* OpStr(SkPathOp );
189     static void ShowOnePath(const SkPath& path, const char* name, bool includeDeclaration);
190     static void ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name);
191 
192     static bool ChaseContains(const SkTDArray<class SkOpSpanBase*>& , const class SkOpSpanBase* );
193 
194     static void CheckHealth(class SkOpContourHead* contourList, const char* id);
195 
196     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 
208     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 
214     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);
231 };
232 
233 struct SkDQuad;
234 
235 // generates tools/path_sorter.htm and path_visualizer.htm compatible data
236 void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo);
237 void DumpT(const SkDQuad& quad, double t);
238 
239 #endif
240