Home | History | Annotate | Download | only in pathops
      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 #ifndef SkPathOpsDebug_DEFINED
      8 #define SkPathOpsDebug_DEFINED
      9 
     10 #include "SkPathOps.h"
     11 #include "SkTypes.h"
     12 
     13 #include <stdlib.h>
     14 #include <stdio.h>
     15 
     16 #ifdef SK_RELEASE
     17 #define FORCE_RELEASE 1
     18 #else
     19 #define FORCE_RELEASE 1  // set force release to 1 for multiple thread -- no debugging
     20 #endif
     21 
     22 #define ONE_OFF_DEBUG 0
     23 #define ONE_OFF_DEBUG_MATHEMATICA 0
     24 
     25 #if defined(SK_BUILD_FOR_WIN) || defined(SK_BUILD_FOR_ANDROID)
     26     #define SK_RAND(seed) rand()
     27 #else
     28     #define SK_RAND(seed) rand_r(&seed)
     29 #endif
     30 #ifdef SK_BUILD_FOR_WIN
     31     #define SK_SNPRINTF _snprintf
     32 #else
     33     #define SK_SNPRINTF snprintf
     34 #endif
     35 
     36 #define WIND_AS_STRING(x) char x##Str[12]; \
     37         if (!SkPathOpsDebug::ValidWind(x)) strcpy(x##Str, "?"); \
     38         else SK_SNPRINTF(x##Str, sizeof(x##Str), "%d", x)
     39 
     40 #if FORCE_RELEASE
     41 
     42 #define DEBUG_ACTIVE_OP 0
     43 #define DEBUG_ACTIVE_SPANS 0
     44 #define DEBUG_ADD_INTERSECTING_TS 0
     45 #define DEBUG_ADD_T 0
     46 #define DEBUG_ALIGNMENT 0
     47 #define DEBUG_ANGLE 0
     48 #define DEBUG_ASSEMBLE 0
     49 #define DEBUG_COINCIDENCE 0
     50 #define DEBUG_CUBIC_BINARY_SEARCH 0
     51 #define DEBUG_CUBIC_SPLIT 0
     52 #define DEBUG_DUMP_SEGMENTS 0
     53 #define DEBUG_FLOW 0
     54 #define DEBUG_LIMIT_WIND_SUM 0
     55 #define DEBUG_MARK_DONE 0
     56 #define DEBUG_PATH_CONSTRUCTION 0
     57 #define DEBUG_PERP 0
     58 #define DEBUG_SHOW_TEST_NAME 0
     59 #define DEBUG_SORT 0
     60 #define DEBUG_T_SECT 0
     61 #define DEBUG_T_SECT_DUMP 0
     62 #define DEBUG_T_SECT_LOOP_COUNT 0
     63 #define DEBUG_VALIDATE 0
     64 #define DEBUG_WINDING 0
     65 #define DEBUG_WINDING_AT_T 0
     66 
     67 
     68 #else
     69 
     70 #define DEBUG_ACTIVE_OP 1
     71 #define DEBUG_ACTIVE_SPANS 1
     72 #define DEBUG_ADD_INTERSECTING_TS 1
     73 #define DEBUG_ADD_T 1
     74 #define DEBUG_ALIGNMENT 0
     75 #define DEBUG_ANGLE 1
     76 #define DEBUG_ASSEMBLE 1
     77 #define DEBUG_COINCIDENCE 0
     78 #define DEBUG_CUBIC_BINARY_SEARCH 0
     79 #define DEBUG_CUBIC_SPLIT 1
     80 #define DEBUG_DUMP_SEGMENTS 1
     81 #define DEBUG_FLOW 1
     82 #define DEBUG_LIMIT_WIND_SUM 5
     83 #define DEBUG_MARK_DONE 1
     84 #define DEBUG_PATH_CONSTRUCTION 1
     85 #define DEBUG_PERP 1
     86 #define DEBUG_SHOW_TEST_NAME 1
     87 #define DEBUG_SORT 1
     88 #define DEBUG_T_SECT 0
     89 #define DEBUG_T_SECT_DUMP 0
     90 #define DEBUG_T_SECT_LOOP_COUNT 0
     91 #define DEBUG_VALIDATE 1
     92 #define DEBUG_WINDING 1
     93 #define DEBUG_WINDING_AT_T 1
     94 
     95 #endif
     96 
     97 #ifdef SK_RELEASE
     98     #define SkDEBUGRELEASE(a, b) b
     99     #define SkDEBUGPARAMS(...)
    100     #define SkDEBUGCODE_(...)
    101 #else
    102     #define SkDEBUGRELEASE(a, b) a
    103     #define SkDEBUGPARAMS(...) , __VA_ARGS__
    104     #define SkDEBUGCODE_(...) __VA_ARGS__  // temporary until SkDEBUGCODE is fixed
    105 #endif
    106 
    107 #if DEBUG_VALIDATE == 0
    108     #define PATH_OPS_DEBUG_VALIDATE_PARAMS(...)
    109 #else
    110     #define PATH_OPS_DEBUG_VALIDATE_PARAMS(...) , __VA_ARGS__
    111 #endif
    112 
    113 #if DEBUG_T_SECT == 0
    114     #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) b
    115     #define PATH_OPS_DEBUG_T_SECT_PARAMS(...)
    116     #define PATH_OPS_DEBUG_T_SECT_CODE(...)
    117 #else
    118     #define PATH_OPS_DEBUG_T_SECT_RELEASE(a, b) a
    119     #define PATH_OPS_DEBUG_T_SECT_PARAMS(...) , __VA_ARGS__
    120     #define PATH_OPS_DEBUG_T_SECT_CODE(...) __VA_ARGS__
    121 #endif
    122 
    123 #if DEBUG_T_SECT_DUMP > 1
    124     extern int gDumpTSectNum;
    125 #endif
    126 
    127 #if DEBUG_COINCIDENCE
    128     #define DEBUG_COINCIDENCE_HEALTH(contourList, id) \
    129             SkPathOpsDebug::CheckHealth(contourList, id)
    130 #else
    131     #define DEBUG_COINCIDENCE_HEALTH(contourList, id)
    132 #endif
    133 
    134 #define CUBIC_DEBUG_STR  "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
    135 #define CONIC_DEBUG_STR "{{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}, %1.9g}"
    136 #define QUAD_DEBUG_STR   "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
    137 #define LINE_DEBUG_STR   "{{{%1.9g,%1.9g}, {%1.9g,%1.9g}}}"
    138 #define PT_DEBUG_STR "{{%1.9g,%1.9g}}"
    139 
    140 #define T_DEBUG_STR(t, n) #t "[" #n "]=%1.9g"
    141 #define TX_DEBUG_STR(t) #t "[%d]=%1.9g"
    142 #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
    143 #define CONIC_DEBUG_DATA(c, w) c[0].fX, c[0].fY, c[1].fX, c[1].fY, c[2].fX, c[2].fY, w
    144 #define QUAD_DEBUG_DATA(q)  q[0].fX, q[0].fY, q[1].fX, q[1].fY, q[2].fX, q[2].fY
    145 #define LINE_DEBUG_DATA(l)  l[0].fX, l[0].fY, l[1].fX, l[1].fY
    146 #define PT_DEBUG_DATA(i, n) i.pt(n).asSkPoint().fX, i.pt(n).asSkPoint().fY
    147 
    148 #ifndef DEBUG_TEST
    149 #define DEBUG_TEST 0
    150 #endif
    151 
    152 #if DEBUG_SHOW_TEST_NAME
    153 #include "SkTLS.h"
    154 #endif
    155 
    156 class SkPathOpsDebug {
    157 public:
    158     static const char* kLVerbStr[];
    159     struct GlitchLog;
    160 
    161 #if defined(SK_DEBUG) || !FORCE_RELEASE
    162     static int gContourID;
    163     static int gSegmentID;
    164 #endif
    165 
    166 #if DEBUG_SORT
    167     static int gSortCountDefault;
    168     static int gSortCount;
    169 #endif
    170 
    171 #if DEBUG_ACTIVE_OP
    172     static const char* kPathOpStr[];
    173 #endif
    174 
    175     static void CoincidentHealth(class SkOpContourHead* contourList, const char* id);
    176     static void MathematicaIze(char* str, size_t bufferSize);
    177     static bool ValidWind(int winding);
    178     static void WindingPrintf(int winding);
    179 
    180 #if DEBUG_SHOW_TEST_NAME
    181     static void* CreateNameStr();
    182     static void DeleteNameStr(void* v);
    183 #define DEBUG_FILENAME_STRING_LENGTH 64
    184 #define DEBUG_FILENAME_STRING (reinterpret_cast<char* >(SkTLS::Get(SkPathOpsDebug::CreateNameStr, \
    185         SkPathOpsDebug::DeleteNameStr)))
    186     static void BumpTestName(char* );
    187 #endif
    188     static const char* OpStr(SkPathOp );
    189     static void ShowOnePath(const SkPath& path, const char* name, bool includeDeclaration);
    190     static void ShowPath(const SkPath& one, const SkPath& two, SkPathOp op, const char* name);
    191 
    192     static bool ChaseContains(const SkTDArray<class SkOpSpanBase*>& , const class SkOpSpanBase* );
    193 
    194     static void CheckHealth(class SkOpContourHead* contourList, const char* id);
    195 
    196     static const struct SkOpAngle* DebugAngleAngle(const struct SkOpAngle*, int id);
    197     static class SkOpContour* DebugAngleContour(struct SkOpAngle*, int id);
    198     static const class SkOpPtT* DebugAnglePtT(const struct SkOpAngle*, int id);
    199     static const class SkOpSegment* DebugAngleSegment(const struct SkOpAngle*, int id);
    200     static const class SkOpSpanBase* DebugAngleSpan(const struct SkOpAngle*, int id);
    201 
    202     static const struct SkOpAngle* DebugContourAngle(class SkOpContour*, int id);
    203     static class SkOpContour* DebugContourContour(class SkOpContour*, int id);
    204     static const class SkOpPtT* DebugContourPtT(class SkOpContour*, int id);
    205     static const class SkOpSegment* DebugContourSegment(class SkOpContour*, int id);
    206     static const class SkOpSpanBase* DebugContourSpan(class SkOpContour*, int id);
    207 
    208     static const struct SkOpAngle* DebugCoincidenceAngle(class SkOpCoincidence*, int id);
    209     static class SkOpContour* DebugCoincidenceContour(class SkOpCoincidence*, int id);
    210     static const class SkOpPtT* DebugCoincidencePtT(class SkOpCoincidence*, int id);
    211     static const class SkOpSegment* DebugCoincidenceSegment(class SkOpCoincidence*, int id);
    212     static const class SkOpSpanBase* DebugCoincidenceSpan(class SkOpCoincidence*, int id);
    213 
    214     static const struct SkOpAngle* DebugPtTAngle(const class SkOpPtT*, int id);
    215     static class SkOpContour* DebugPtTContour(class SkOpPtT*, int id);
    216     static const class SkOpPtT* DebugPtTPtT(const class SkOpPtT*, int id);
    217     static const class SkOpSegment* DebugPtTSegment(const class SkOpPtT*, int id);
    218     static const class SkOpSpanBase* DebugPtTSpan(const class SkOpPtT*, int id);
    219 
    220     static const struct SkOpAngle* DebugSegmentAngle(const class SkOpSegment*, int id);
    221     static class SkOpContour* DebugSegmentContour(class SkOpSegment*, int id);
    222     static const class SkOpPtT* DebugSegmentPtT(const class SkOpSegment*, int id);
    223     static const class SkOpSegment* DebugSegmentSegment(const class SkOpSegment*, int id);
    224     static const class SkOpSpanBase* DebugSegmentSpan(const class SkOpSegment*, int id);
    225 
    226     static const struct SkOpAngle* DebugSpanAngle(const class SkOpSpanBase*, int id);
    227     static class SkOpContour* DebugSpanContour(class SkOpSpanBase*, int id);
    228     static const class SkOpPtT* DebugSpanPtT(const class SkOpSpanBase*, int id);
    229     static const class SkOpSegment* DebugSpanSegment(const class SkOpSpanBase*, int id);
    230     static const class SkOpSpanBase* DebugSpanSpan(const class SkOpSpanBase*, int id);
    231 };
    232 
    233 struct SkDQuad;
    234 
    235 // generates tools/path_sorter.htm and path_visualizer.htm compatible data
    236 void DumpQ(const SkDQuad& quad1, const SkDQuad& quad2, int testNo);
    237 void DumpT(const SkDQuad& quad, double t);
    238 
    239 #endif
    240