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