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