SkPathOpsDebug.cpp revision 7eaa53d8f7e48fd17d02b5e3bd91f90e9c1899ef
107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* 207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2013 Google Inc. 307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * 407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be 507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * found in the LICENSE file. 607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com */ 707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsDebug.h" 9a5e55925ea03e76885804bda77408a1d6f04c335caryclark@google.com#include "SkPath.h" 1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 1107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#if defined SK_DEBUG || !FORCE_RELEASE 1207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 13570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comint SkPathOpsDebug::gMaxWindSum = SK_MaxS32; 14570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comint SkPathOpsDebug::gMaxWindValue = SK_MaxS32; 1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 16570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comconst char* SkPathOpsDebug::kLVerbStr[] = {"", "line", "quad", "cubic"}; 17570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comint SkPathOpsDebug::gContourID; 18570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comint SkPathOpsDebug::gSegmentID; 19570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com 20570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#if DEBUG_SORT || DEBUG_SWAP_TOP 21570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comint SkPathOpsDebug::gSortCountDefault = SK_MaxS32; 22570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comint SkPathOpsDebug::gSortCount; 23570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#endif 24570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com 25570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#if DEBUG_ACTIVE_OP 26570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comconst char* SkPathOpsDebug::kPathOpStr[] = {"diff", "sect", "union", "xor"}; 27570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#endif 28570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com 29570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comvoid SkPathOpsDebug::MathematicaIze(char* str, size_t bufferLen) { 3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com size_t len = strlen(str); 3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bool num = false; 3207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (size_t idx = 0; idx < len; ++idx) { 3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (num && str[idx] == 'e') { 3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (len + 2 >= bufferLen) { 3507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return; 3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 3707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com memmove(&str[idx + 2], &str[idx + 1], len - idx); 3807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com str[idx] = '*'; 3907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com str[idx + 1] = '^'; 4007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com ++len; 4107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com num = str[idx] >= '0' && str[idx] <= '9'; 4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 46570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool SkPathOpsDebug::ValidWind(int wind) { 4707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF; 4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 4907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 50570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comvoid SkPathOpsDebug::WindingPrintf(int wind) { 5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (wind == SK_MinS32) { 5207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDebugf("?"); 5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } else { 5407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDebugf("%d", wind); 5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 57a5e55925ea03e76885804bda77408a1d6f04c335caryclark@google.com 5807e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com#if DEBUG_SHOW_TEST_NAME 59570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comvoid* SkPathOpsDebug::CreateNameStr() { 6007e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com return SkNEW_ARRAY(char, DEBUG_FILENAME_STRING_LENGTH); 61cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com} 62cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com 63570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comvoid SkPathOpsDebug::DeleteNameStr(void* v) { 6407e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com SkDELETE_ARRAY(reinterpret_cast<char* >(v)); 65a5e55925ea03e76885804bda77408a1d6f04c335caryclark@google.com} 66a5e55925ea03e76885804bda77408a1d6f04c335caryclark@google.com 67570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comvoid SkPathOpsDebug::BumpTestName(char* test) { 6807e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com char* num = test + strlen(test); 6907e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com while (num[-1] >= '0' && num[-1] <= '9') { 7007e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com --num; 7107e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com } 7207e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com if (num[0] == '\0') { 7307e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com return; 7407e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com } 7507e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com int dec = atoi(num); 7607e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com if (dec == 0) { 7707e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com return; 7807e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com } 7907e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com ++dec; 8007e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com SK_SNPRINTF(num, DEBUG_FILENAME_STRING_LENGTH - (num - test), "%d", dec); 81a5e55925ea03e76885804bda77408a1d6f04c335caryclark@google.com} 82a5e55925ea03e76885804bda77408a1d6f04c335caryclark@google.com#endif 83570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com 84570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#include "SkOpSegment.h" 85570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com 86570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comvoid SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle, true>& angles) { 87570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com int count = angles.count(); 88570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com for (int index = 0; index < count; ++index) { 89570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com angles[index].dump(); 90570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 91570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com} 927eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com 937eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comvoid SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle* , true>& angles) { 947eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com int count = angles.count(); 957eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com for (int index = 0; index < count; ++index) { 967eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com angles[index]->dump(); 977eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com } 987eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com} 99570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#endif // SK_DEBUG || !FORCE_RELEASE 100570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com 101570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#ifdef SK_DEBUG 102570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comvoid SkOpSpan::dump() const { 103570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf("t="); 104570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com DebugDumpDouble(fT); 105570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" pt="); 106570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDPoint::DumpSkPoint(fPt); 107570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" other.fID=%d", fOther->debugID()); 108570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" [%d] otherT=", fOtherIndex); 109570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com DebugDumpDouble(fOtherT); 110570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" windSum="); 111570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkPathOpsDebug::WindingPrintf(fWindSum); 112570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) { 113570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" oppSum="); 114570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkPathOpsDebug::WindingPrintf(fOppSum); 115570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 116570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" windValue=%d", fWindValue); 117570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) { 118570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" oppValue=%d", fOppValue); 119570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 120570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (fDone) { 121570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" done"); 122570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 123570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (fUnsortableStart) { 124570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" unsortable-start"); 125570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 126570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (fUnsortableEnd) { 127570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" unsortable-end"); 128570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 129570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (fTiny) { 130570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" tiny"); 131570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } else if (fSmall) { 132570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" small"); 133570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 134570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (fLoop) { 135570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" loop"); 136570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 137570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com if (fNear) { 138570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf(" near"); 139570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com } 140570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com SkDebugf("\n"); 141570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com} 1427eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com 1437eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comvoid Dump(const SkTArray<class SkOpAngle, true>& angles) { 1447eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com SkPathOpsDebug::DumpAngles(angles); 1457eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com} 1467eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com 1477eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comvoid Dump(const SkTArray<class SkOpAngle* , true>& angles) { 1487eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com SkPathOpsDebug::DumpAngles(angles); 1497eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com} 1507eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com 1517eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comvoid Dump(const SkTArray<class SkOpAngle, true>* angles) { 1527eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com SkPathOpsDebug::DumpAngles(*angles); 1537eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com} 1547eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com 1557eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comvoid Dump(const SkTArray<class SkOpAngle* , true>* angles) { 1567eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com SkPathOpsDebug::DumpAngles(*angles); 1577eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com} 1587eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com 159570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com#endif 1607eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com 161