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 #include <stdio.h>
13 
14 #ifdef SK_RELEASE
15 #define FORCE_RELEASE 1
16 #else
17 #define FORCE_RELEASE 1  // set force release to 1 for multiple thread -- no debugging
18 #endif
19 
20 #define ONE_OFF_DEBUG 0
21 #define ONE_OFF_DEBUG_MATHEMATICA 0
22 
23 #if defined(SK_BUILD_FOR_WIN) || defined(SK_BUILD_FOR_ANDROID)
24     #define SK_RAND(seed) rand()
25 #else
26     #define SK_RAND(seed) rand_r(&seed)
27 #endif
28 #ifdef SK_BUILD_FOR_WIN
29     #define SK_SNPRINTF _snprintf
30 #else
31     #define SK_SNPRINTF snprintf
32 #endif
33 
34 #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 
38 #if FORCE_RELEASE
39 
40 #define DEBUG_ACTIVE_OP 0
41 #define DEBUG_ACTIVE_SPANS 0
42 #define DEBUG_ADD_INTERSECTING_TS 0
43 #define DEBUG_ADD_T 0
44 #define DEBUG_ANGLE 0
45 #define DEBUG_ASSEMBLE 0
46 #define DEBUG_CUBIC_BINARY_SEARCH 0
47 #define DEBUG_CUBIC_SPLIT 0
48 #define DEBUG_DUMP_SEGMENTS 0
49 #define DEBUG_FLOW 0
50 #define DEBUG_LIMIT_WIND_SUM 0
51 #define DEBUG_MARK_DONE 0
52 #define DEBUG_PATH_CONSTRUCTION 0
53 #define DEBUG_PERP 0
54 #define DEBUG_SHOW_TEST_NAME 0
55 #define DEBUG_SORT 0
56 #define DEBUG_T_SECT 0
57 #define DEBUG_T_SECT_DUMP 0
58 #define DEBUG_VALIDATE 0
59 #define DEBUG_WINDING 0
60 #define DEBUG_WINDING_AT_T 0
61 
62 #else
63 
64 #define DEBUG_ACTIVE_OP 1
65 #define DEBUG_ACTIVE_SPANS 1
66 #define DEBUG_ADD_INTERSECTING_TS 1
67 #define DEBUG_ADD_T 1
68 #define DEBUG_ANGLE 1
69 #define DEBUG_ASSEMBLE 1
70 #define DEBUG_CUBIC_BINARY_SEARCH 0
71 #define DEBUG_CUBIC_SPLIT 1
72 #define DEBUG_DUMP_SEGMENTS 1
73 #define DEBUG_FLOW 1
74 #define DEBUG_LIMIT_WIND_SUM 5
75 #define DEBUG_MARK_DONE 1
76 #define DEBUG_PATH_CONSTRUCTION 1
77 #define DEBUG_PERP 1
78 #define DEBUG_SHOW_TEST_NAME 1
79 #define DEBUG_SORT 1
80 #define DEBUG_T_SECT 0
81 #define DEBUG_T_SECT_DUMP 0
82 #define DEBUG_VALIDATE 1
83 #define DEBUG_WINDING 1
84 #define DEBUG_WINDING_AT_T 1
85 
86 #endif
87 
88 #ifdef SK_RELEASE
89     #define SkDEBUGRELEASE(a, b) b
90     #define SkDEBUGPARAMS(...)
91     #define SkDEBUGCODE_(...)
92 #else
93     #define SkDEBUGRELEASE(a, b) a
94     #define SkDEBUGPARAMS(...) , __VA_ARGS__
95     #define SkDEBUGCODE_(...) __VA_ARGS__  // temporary until SkDEBUGCODE is fixed
96 #endif
97 
98 #if DEBUG_T_SECT == 0
99     #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) b
100     #define PATH_OPS_DEBUG_T_SECT_PARAMS(...)
101     #define PATH_OPS_DEBUG_T_SECT_CODE(...)
102 #else
103     #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) a
104     #define PATH_OPS_DEBUG_T_SECT_PARAMS(...) , __VA_ARGS__
105     #define PATH_OPS_DEBUG_T_SECT_CODE(...) __VA_ARGS__
106 #endif
107 
108 #if DEBUG_T_SECT_DUMP > 1
109     extern int gDumpTSectNum;
110 #endif
111 
112 #define CUBIC_DEBUG_STR  "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
113 #define CONIC_DEBUG_STR "{{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}, %1.9g}"
114 #define QUAD_DEBUG_STR   "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
115 #define LINE_DEBUG_STR   "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
116 #define PT_DEBUG_STR "{{%1.9g,%1.9g}}"
117 
118 #define T_DEBUG_STR(t, n) #t "[" #n "]=%1.9g"
119 #define TX_DEBUG_STR(t) #t "[%d]=%1.9g"
120 #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
121 #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
122 #define QUAD_DEBUG_DATA(q)  q[0].fX, q[0].fY, q[1].fX, q[1].fY, q[2].fX, q[2].fY
123 #define LINE_DEBUG_DATA(l)  l[0].fX, l[0].fY, l[1].fX, l[1].fY
124 #define PT_DEBUG_DATA(i, n) i.pt(n).asSkPoint().fX, i.pt(n).asSkPoint().fY
125 
126 #ifndef DEBUG_TEST
127 #define DEBUG_TEST 0
128 #endif
129 
130 #if DEBUG_SHOW_TEST_NAME
131 #include "SkTLS.h"
132 #endif
133 
134 class SkPathOpsDebug {
135 public:
136     static const char* kLVerbStr[];
137 
138 #if defined(SK_DEBUG) || !FORCE_RELEASE
139     static int gContourID;
140     static int gSegmentID;
141 #endif
142 
143 #if DEBUG_SORT
144     static int gSortCountDefault;
145     static int gSortCount;
146 #endif
147 
148 #if DEBUG_ACTIVE_OP
149     static const char* kPathOpStr[];
150 #endif
151 
152     static void MathematicaIze(char* str, size_t bufferSize);
153     static bool ValidWind(int winding);
154     static void WindingPrintf(int winding);
155 
156 #if DEBUG_SHOW_TEST_NAME
157     static void* CreateNameStr();
158     static void DeleteNameStr(void* v);
159 #define DEBUG_FILENAME_STRING_LENGTH 64
160 #define DEBUG_FILENAME_STRING (reinterpret_cast<char* >(SkTLS::Get(SkPathOpsDebug::CreateNameStr, \
161         SkPathOpsDebug::DeleteNameStr)))
162     static void BumpTestName(char* );
163 #endif
164     static const char* OpStr(SkPathOp );
165     static void ShowOnePath(const SkPath& path, const char* name, bool includeDeclaration);
166     static void ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name);
167 
168     static bool ChaseContains(const SkTDArray<class SkOpSpanBase*>& , const class SkOpSpanBase* );
169 
170     static const struct SkOpAngle* DebugAngleAngle(const struct SkOpAngle*, int id);
171     static class SkOpContour* DebugAngleContour(struct SkOpAngle*, int id);
172     static const class SkOpPtT* DebugAnglePtT(const struct SkOpAngle*, int id);
173     static const class SkOpSegment* DebugAngleSegment(const struct SkOpAngle*, int id);
174     static const class SkOpSpanBase* DebugAngleSpan(const struct SkOpAngle*, int id);
175 
176     static const struct SkOpAngle* DebugContourAngle(class SkOpContour*, int id);
177     static class SkOpContour* DebugContourContour(class SkOpContour*, int id);
178     static const class SkOpPtT* DebugContourPtT(class SkOpContour*, int id);
179     static const class SkOpSegment* DebugContourSegment(class SkOpContour*, int id);
180     static const class SkOpSpanBase* DebugContourSpan(class SkOpContour*, int id);
181 
182     static const struct SkOpAngle* DebugPtTAngle(const class SkOpPtT*, int id);
183     static class SkOpContour* DebugPtTContour(class SkOpPtT*, int id);
184     static const class SkOpPtT* DebugPtTPtT(const class SkOpPtT*, int id);
185     static const class SkOpSegment* DebugPtTSegment(const class SkOpPtT*, int id);
186     static const class SkOpSpanBase* DebugPtTSpan(const class SkOpPtT*, int id);
187 
188     static const struct SkOpAngle* DebugSegmentAngle(const class SkOpSegment*, int id);
189     static class SkOpContour* DebugSegmentContour(class SkOpSegment*, int id);
190     static const class SkOpPtT* DebugSegmentPtT(const class SkOpSegment*, int id);
191     static const class SkOpSegment* DebugSegmentSegment(const class SkOpSegment*, int id);
192     static const class SkOpSpanBase* DebugSegmentSpan(const class SkOpSegment*, int id);
193 
194     static const struct SkOpAngle* DebugSpanAngle(const class SkOpSpanBase*, int id);
195     static class SkOpContour* DebugSpanContour(class SkOpSpanBase*, int id);
196     static const class SkOpPtT* DebugSpanPtT(const class SkOpSpanBase*, int id);
197     static const class SkOpSegment* DebugSpanSegment(const class SkOpSpanBase*, int id);
198     static const class SkOpSpanBase* DebugSpanSpan(const class SkOpSpanBase*, int id);
199 };
200 
201 struct SkDQuad;
202 
203 // generates tools/path_sorter.htm and path_visualizer.htm compatible data
204 void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo);
205 void DumpT(const SkDQuad& quad, double t);
206 
207 #endif
208