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