17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2013 Google Inc.
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#ifndef SkPathOpsDebug_DEFINED
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define SkPathOpsDebug_DEFINED
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkPathOps.h"
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTypes.h"
120a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include <stdio.h>
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#ifdef SK_RELEASE
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define FORCE_RELEASE 1
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#else
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define FORCE_RELEASE 1  // set force release to 1 for multiple thread -- no debugging
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define ONE_OFF_DEBUG 0
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define ONE_OFF_DEBUG_MATHEMATICA 0
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#if defined(SK_BUILD_FOR_WIN) || defined(SK_BUILD_FOR_ANDROID)
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    #define SK_RAND(seed) rand()
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#else
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    #define SK_RAND(seed) rand_r(&seed)
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#ifdef SK_BUILD_FOR_WIN
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    #define SK_SNPRINTF _snprintf
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#else
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    #define SK_SNPRINTF snprintf
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#if FORCE_RELEASE
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ACTIVE_OP 0
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ACTIVE_SPANS 0
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ACTIVE_SPANS_FIRST_ONLY 0
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ACTIVE_SPANS_SHORT_FORM 1
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ADD_INTERSECTING_TS 0
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ADD_T_PAIR 0
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ANGLE 0
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_AS_C_CODE 1
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ASSEMBLE 0
450a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_CHECK_ENDS 0
460a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_CHECK_TINY 0
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_CONCIDENT 0
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_CROSS 0
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_FLAT_QUADS 0
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_FLOW 0
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_MARK_DONE 0
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_PATH_CONSTRUCTION 0
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SHOW_TEST_NAME 0
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SHOW_TEST_PROGRESS 0
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SHOW_WINDING 0
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SORT 0
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define DEBUG_SORT_COMPACT 0
580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_SORT_RAW 0
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SORT_SINGLE 0
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SWAP_TOP 0
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_UNSORTABLE 0
6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define DEBUG_VALIDATE 0
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_WIND_BUMP 0
647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_WINDING 0
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_WINDING_AT_T 0
667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#else
687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ACTIVE_OP 1
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ACTIVE_SPANS 1
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ACTIVE_SPANS_FIRST_ONLY 0
7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define DEBUG_ACTIVE_SPANS_SHORT_FORM 1
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ADD_INTERSECTING_TS 1
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ADD_T_PAIR 1
757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ANGLE 1
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_AS_C_CODE 1
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_ASSEMBLE 1
780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_CHECK_ENDS 1
790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_CHECK_TINY 1
807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_CONCIDENT 1
810a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_CROSS 01
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_FLAT_QUADS 0
837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_FLOW 1
847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_MARK_DONE 1
857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_PATH_CONSTRUCTION 1
867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SHOW_TEST_NAME 1
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SHOW_TEST_PROGRESS 1
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SHOW_WINDING 0
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SORT 1
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define DEBUG_SORT_COMPACT 0
910a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_SORT_RAW 0
927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SORT_SINGLE 0
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_SWAP_TOP 1
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_UNSORTABLE 1
9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define DEBUG_VALIDATE 1
967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_WIND_BUMP 0
977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_WINDING 1
987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DEBUG_WINDING_AT_T 1
997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#if DEBUG_AS_C_CODE
10358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define CUBIC_DEBUG_STR "{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}"
10458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define QUAD_DEBUG_STR  "{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}"
10558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define LINE_DEBUG_STR  "{{%1.9g,%1.9g}, {%1.9g,%1.9g}}"
10658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define PT_DEBUG_STR "{{%1.9g,%1.9g}}"
1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#else
1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define CUBIC_DEBUG_STR "(%1.9g,%1.9g %1.9g,%1.9g %1.9g,%1.9g %1.9g,%1.9g)"
1097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define QUAD_DEBUG_STR  "(%1.9g,%1.9g %1.9g,%1.9g %1.9g,%1.9g)"
1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define LINE_DEBUG_STR  "(%1.9g,%1.9g %1.9g,%1.9g)"
1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define PT_DEBUG_STR "(%1.9g,%1.9g)"
1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define T_DEBUG_STR(t, n) #t "[" #n "]=%1.9g"
1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define TX_DEBUG_STR(t) #t "[%d]=%1.9g"
1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#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
1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define QUAD_DEBUG_DATA(q)  q[0].fX, q[0].fY, q[1].fX, q[1].fY, q[2].fX, q[2].fY
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define LINE_DEBUG_DATA(l)  l[0].fX, l[0].fY, l[1].fX, l[1].fY
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define PT_DEBUG_DATA(i, n) i.pt(n).fX, i.pt(n).fY
1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#ifndef DEBUG_TEST
1210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_TEST 0
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1240a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#if defined SK_DEBUG || !FORCE_RELEASE
1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#if DEBUG_SHOW_TEST_NAME
1270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkTLS.h"
1280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#endif
1290a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1300a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkTArray.h"
1310a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1320a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerclass SkPathOpsDebug {
1330a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerpublic:
1340a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static int gMaxWindSum;
1350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static int gMaxWindValue;
1360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1370a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static const char* kLVerbStr[];
1380a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static int gContourID;
1390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static int gSegmentID;
1400a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#if DEBUG_SORT || DEBUG_SWAP_TOP
1420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static int gSortCountDefault;
1430a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static int gSortCount;
1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#if DEBUG_ACTIVE_OP
1470a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static const char* kPathOpStr[];
1487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
1497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1500a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void MathematicaIze(char* str, size_t bufferSize);
1510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static bool ValidWind(int winding);
1520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void WindingPrintf(int winding);
15358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#if DEBUG_SHOW_TEST_NAME
1550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void* CreateNameStr();
1560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void DeleteNameStr(void* v);
15758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define DEBUG_FILENAME_STRING_LENGTH 64
1580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_FILENAME_STRING (reinterpret_cast<char* >(SkTLS::Get(SkPathOpsDebug::CreateNameStr, \
1590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkPathOpsDebug::DeleteNameStr)))
1600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void BumpTestName(char* );
1610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name);
1627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
1630a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void DumpAngles(const SkTArray<class SkOpAngle, true>& angles);
1640a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static void DumpAngles(const SkTArray<class SkOpAngle* , true>& angles);
1650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger};
1667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger// shorthand for calling from debugger
1680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid Dump(const SkTArray<class SkOpAngle, true>& angles);
1690a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid Dump(const SkTArray<class SkOpAngle* , true>& angles);
1700a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid Dump(const SkTArray<class SkOpAngle, true>* angles);
1710a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid Dump(const SkTArray<class SkOpAngle* , true>* angles);
1720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1730a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#endif  // SK_DEBUG || !FORCE_RELEASE
1747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
176