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 8 #include "SkPathOpsDebug.h" 9 #include "SkPath.h" 10 11 #if defined SK_DEBUG || !FORCE_RELEASE 12 13 int SkPathOpsDebug::gMaxWindSum = SK_MaxS32; 14 int SkPathOpsDebug::gMaxWindValue = SK_MaxS32; 15 16 const char* SkPathOpsDebug::kLVerbStr[] = {"", "line", "quad", "cubic"}; 17 int SkPathOpsDebug::gContourID; 18 int SkPathOpsDebug::gSegmentID; 19 20 #if DEBUG_SORT || DEBUG_SWAP_TOP 21 int SkPathOpsDebug::gSortCountDefault = SK_MaxS32; 22 int SkPathOpsDebug::gSortCount; 23 #endif 24 25 #if DEBUG_ACTIVE_OP 26 const char* SkPathOpsDebug::kPathOpStr[] = {"diff", "sect", "union", "xor"}; 27 #endif 28 29 void SkPathOpsDebug::MathematicaIze(char* str, size_t bufferLen) { 30 size_t len = strlen(str); 31 bool num = false; 32 for (size_t idx = 0; idx < len; ++idx) { 33 if (num && str[idx] == 'e') { 34 if (len + 2 >= bufferLen) { 35 return; 36 } 37 memmove(&str[idx + 2], &str[idx + 1], len - idx); 38 str[idx] = '*'; 39 str[idx + 1] = '^'; 40 ++len; 41 } 42 num = str[idx] >= '0' && str[idx] <= '9'; 43 } 44 } 45 46 bool SkPathOpsDebug::ValidWind(int wind) { 47 return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF; 48 } 49 50 void SkPathOpsDebug::WindingPrintf(int wind) { 51 if (wind == SK_MinS32) { 52 SkDebugf("?"); 53 } else { 54 SkDebugf("%d", wind); 55 } 56 } 57 58 #if DEBUG_SHOW_TEST_NAME 59 void* SkPathOpsDebug::CreateNameStr() { 60 return SkNEW_ARRAY(char, DEBUG_FILENAME_STRING_LENGTH); 61 } 62 63 void SkPathOpsDebug::DeleteNameStr(void* v) { 64 SkDELETE_ARRAY(reinterpret_cast<char* >(v)); 65 } 66 67 void SkPathOpsDebug::BumpTestName(char* test) { 68 char* num = test + strlen(test); 69 while (num[-1] >= '0' && num[-1] <= '9') { 70 --num; 71 } 72 if (num[0] == '\0') { 73 return; 74 } 75 int dec = atoi(num); 76 if (dec == 0) { 77 return; 78 } 79 ++dec; 80 SK_SNPRINTF(num, DEBUG_FILENAME_STRING_LENGTH - (num - test), "%d", dec); 81 } 82 #endif 83 84 #include "SkOpSegment.h" 85 86 void SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle, true>& angles) { 87 int count = angles.count(); 88 for (int index = 0; index < count; ++index) { 89 angles[index].dump(); 90 } 91 } 92 93 void SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle* , true>& angles) { 94 int count = angles.count(); 95 for (int index = 0; index < count; ++index) { 96 angles[index]->dump(); 97 } 98 } 99 #endif // SK_DEBUG || !FORCE_RELEASE 100 101 #ifdef SK_DEBUG 102 void SkOpSpan::dump() const { 103 SkDebugf("t="); 104 DebugDumpDouble(fT); 105 SkDebugf(" pt="); 106 SkDPoint::dump(fPt); 107 SkDebugf(" other.fID=%d", fOther->debugID()); 108 SkDebugf(" [%d] otherT=", fOtherIndex); 109 DebugDumpDouble(fOtherT); 110 SkDebugf(" windSum="); 111 SkPathOpsDebug::WindingPrintf(fWindSum); 112 if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) { 113 SkDebugf(" oppSum="); 114 SkPathOpsDebug::WindingPrintf(fOppSum); 115 } 116 SkDebugf(" windValue=%d", fWindValue); 117 if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) { 118 SkDebugf(" oppValue=%d", fOppValue); 119 } 120 if (fDone) { 121 SkDebugf(" done"); 122 } 123 if (fUnsortableStart) { 124 SkDebugf(" unsortable-start"); 125 } 126 if (fUnsortableEnd) { 127 SkDebugf(" unsortable-end"); 128 } 129 if (fTiny) { 130 SkDebugf(" tiny"); 131 } else if (fSmall) { 132 SkDebugf(" small"); 133 } 134 if (fLoop) { 135 SkDebugf(" loop"); 136 } 137 SkDebugf("\n"); 138 } 139 140 void Dump(const SkTArray<class SkOpAngle, true>& angles) { 141 SkPathOpsDebug::DumpAngles(angles); 142 } 143 144 void Dump(const SkTArray<class SkOpAngle* , true>& angles) { 145 SkPathOpsDebug::DumpAngles(angles); 146 } 147 148 void Dump(const SkTArray<class SkOpAngle, true>* angles) { 149 SkPathOpsDebug::DumpAngles(*angles); 150 } 151 152 void Dump(const SkTArray<class SkOpAngle* , true>* angles) { 153 SkPathOpsDebug::DumpAngles(*angles); 154 } 155 156 #endif 157 158 #if !FORCE_RELEASE && 0 // enable when building without extended test 159 void SkPathOpsDebug::ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name) { 160 } 161 #endif 162