SkPathOpsDebug.cpp revision 866f4e34a943c115ac372c22123a1520aa5f9b06
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
13int SkPathOpsDebug::gMaxWindSum = SK_MaxS32;
14int SkPathOpsDebug::gMaxWindValue = SK_MaxS32;
15
16const char* SkPathOpsDebug::kLVerbStr[] = {"", "line", "quad", "cubic"};
17int SkPathOpsDebug::gContourID;
18int SkPathOpsDebug::gSegmentID;
19
20#if DEBUG_SORT || DEBUG_SWAP_TOP
21int SkPathOpsDebug::gSortCountDefault = SK_MaxS32;
22int SkPathOpsDebug::gSortCount;
23#endif
24
25#if DEBUG_ACTIVE_OP
26const char* SkPathOpsDebug::kPathOpStr[] = {"diff", "sect", "union", "xor"};
27#endif
28
29void 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
46bool SkPathOpsDebug::ValidWind(int wind) {
47    return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF;
48}
49
50void 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
59void* SkPathOpsDebug::CreateNameStr() {
60    return SkNEW_ARRAY(char, DEBUG_FILENAME_STRING_LENGTH);
61}
62
63void SkPathOpsDebug::DeleteNameStr(void* v) {
64    SkDELETE_ARRAY(reinterpret_cast<char* >(v));
65}
66
67void 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
86void 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
93void 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
102void 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
140void Dump(const SkTArray<class SkOpAngle, true>& angles) {
141    SkPathOpsDebug::DumpAngles(angles);
142}
143
144void Dump(const SkTArray<class SkOpAngle* , true>& angles) {
145    SkPathOpsDebug::DumpAngles(angles);
146}
147
148void Dump(const SkTArray<class SkOpAngle, true>* angles) {
149    SkPathOpsDebug::DumpAngles(*angles);
150}
151
152void 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
159void SkPathOpsDebug::ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name) {
160}
161#endif
162