Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2014 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 PathOpsTSectDebug_DEFINED
      8 #define PathOpsTSectDebug_DEFINED
      9 
     10 #include "SkPathOpsTSect.h"
     11 
     12 template<typename TCurve, typename OppCurve>
     13 char SkTCoincident<TCurve, OppCurve>::dumpIsCoincidentStr() const {
     14     if (!!fMatch != fMatch) {
     15         return '?';
     16     }
     17     return fMatch ? '*' : 0;
     18 }
     19 
     20 template<typename TCurve, typename OppCurve>
     21 void SkTCoincident<TCurve, OppCurve>::dump() const {
     22     SkDebugf("t=%1.9g pt=(%1.9g,%1.9g)%s\n", fPerpT, fPerpPt.fX, fPerpPt.fY,
     23             fMatch ? " match" : "");
     24 }
     25 
     26 template<typename TCurve, typename OppCurve>
     27 const SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::debugSpan(int id) const {
     28     const SkTSpan<TCurve, OppCurve>* test = fHead;
     29     do {
     30         if (test->debugID() == id) {
     31             return test;
     32         }
     33     } while ((test = test->next()));
     34     return nullptr;
     35 }
     36 
     37 template<typename TCurve, typename OppCurve>
     38 const SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::debugT(double t) const {
     39     const SkTSpan<TCurve, OppCurve>* test = fHead;
     40     const SkTSpan<TCurve, OppCurve>* closest = nullptr;
     41     double bestDist = DBL_MAX;
     42     do {
     43         if (between(test->fStartT, t, test->fEndT)) {
     44             return test;
     45         }
     46         double testDist = SkTMin(fabs(test->fStartT - t), fabs(test->fEndT - t));
     47         if (bestDist > testDist) {
     48             bestDist = testDist;
     49             closest = test;
     50         }
     51     } while ((test = test->next()));
     52     SkASSERT(closest);
     53     return closest;
     54 }
     55 
     56 template<typename TCurve, typename OppCurve>
     57 void SkTSect<TCurve, OppCurve>::dump() const {
     58     dumpCommon(fHead);
     59 }
     60 
     61 extern int gDumpTSectNum;
     62 
     63 template<typename TCurve, typename OppCurve>
     64 void SkTSect<TCurve, OppCurve>::dumpBoth(SkTSect<OppCurve, TCurve>* opp) const {
     65 #if DEBUG_T_SECT_DUMP <= 2
     66 #if DEBUG_T_SECT_DUMP == 2
     67     SkDebugf("%d ", ++gDumpTSectNum);
     68 #endif
     69     this->dump();
     70     SkDebugf(" ");
     71     opp->dump();
     72     SkDebugf("\n");
     73 #elif DEBUG_T_SECT_DUMP == 3
     74     SkDebugf("<div id=\"sect%d\">\n", ++gDumpTSectNum);
     75     if (this->fHead) {
     76         this->dumpCurves();
     77     }
     78     if (opp->fHead) {
     79         opp->dumpCurves();
     80     }
     81     SkDebugf("</div>\n\n");
     82 #endif
     83 }
     84 
     85 template<typename TCurve, typename OppCurve>
     86 void SkTSect<TCurve, OppCurve>::dumpBounded(int id) const {
     87     const SkTSpan<TCurve, OppCurve>* bounded = debugSpan(id);
     88     if (!bounded) {
     89         SkDebugf("no span matches %d\n", id);
     90         return;
     91     }
     92     const SkTSpan<OppCurve, TCurve>* test = bounded->debugOpp()->fHead;
     93     do {
     94         if (test->findOppSpan(bounded)) {
     95             test->dump();
     96             SkDebugf(" ");
     97         }
     98     } while ((test = test->next()));
     99     SkDebugf("\n");
    100 }
    101 
    102 template<typename TCurve, typename OppCurve>
    103 void SkTSect<TCurve, OppCurve>::dumpBounds() const {
    104     const SkTSpan<TCurve, OppCurve>* test = fHead;
    105     do {
    106         test->dumpBounds();
    107     } while ((test = test->next()));
    108 }
    109 
    110 template<typename TCurve, typename OppCurve>
    111 void SkTSect<TCurve, OppCurve>::dumpCoin() const {
    112     dumpCommon(fCoincident);
    113 }
    114 
    115 template<typename TCurve, typename OppCurve>
    116 void SkTSect<TCurve, OppCurve>::dumpCoinCurves() const {
    117     dumpCommonCurves(fCoincident);
    118 }
    119 
    120 template<typename TCurve, typename OppCurve>
    121 void SkTSect<TCurve, OppCurve>::dumpCommon(const SkTSpan<TCurve, OppCurve>* test) const {
    122     SkDebugf("id=%d", debugID());
    123     if (!test) {
    124         SkDebugf(" (empty)");
    125         return;
    126     }
    127     do {
    128         SkDebugf(" ");
    129         test->dump();
    130     } while ((test = test->next()));
    131 }
    132 
    133 template<typename TCurve, typename OppCurve>
    134 void SkTSect<TCurve, OppCurve>::dumpCommonCurves(const SkTSpan<TCurve, OppCurve>* test) const {
    135     do {
    136         test->fPart.dumpID(test->debugID());
    137     } while ((test = test->next()));
    138 }
    139 
    140 template<typename TCurve, typename OppCurve>
    141 void SkTSect<TCurve, OppCurve>::dumpCurves() const {
    142     dumpCommonCurves(fHead);
    143 }
    144 
    145 template<typename TCurve, typename OppCurve>
    146 const SkTSpan<TCurve, OppCurve>* SkTSpan<TCurve, OppCurve>::debugSpan(int id) const {
    147     return SkDEBUGRELEASE(fDebugSect->debugSpan(id), nullptr);
    148 }
    149 
    150 template<typename TCurve, typename OppCurve>
    151 const SkTSpan<TCurve, OppCurve>* SkTSpan<TCurve, OppCurve>::debugT(double t) const {
    152     return SkDEBUGRELEASE(fDebugSect->debugT(t), nullptr);
    153 }
    154 
    155 template<typename TCurve, typename OppCurve>
    156 void SkTSpan<TCurve, OppCurve>::dumpAll() const {
    157     dumpID();
    158     SkDebugf("=(%g,%g) [", fStartT, fEndT);
    159     const SkTSpanBounded<OppCurve, TCurve>* testBounded = fBounded;
    160     while (testBounded) {
    161         const SkTSpan<OppCurve, TCurve>* span = testBounded->fBounded;
    162         const SkTSpanBounded<OppCurve, TCurve>* next = testBounded->fNext;
    163         span->dumpID();
    164         SkDebugf("=(%g,%g)", span->fStartT, span->fEndT);
    165         if (next) {
    166             SkDebugf(" ");
    167         }
    168         testBounded = next;
    169     }
    170     SkDebugf("]\n");
    171 }
    172 
    173 template<typename TCurve, typename OppCurve>
    174 void SkTSpan<TCurve, OppCurve>::dump() const {
    175     dumpID();
    176     SkDebugf("=(%g,%g) [", fStartT, fEndT);
    177     const SkTSpanBounded<OppCurve, TCurve>* testBounded = fBounded;
    178     while (testBounded) {
    179         const SkTSpan<OppCurve, TCurve>* span = testBounded->fBounded;
    180         const SkTSpanBounded<OppCurve, TCurve>* next = testBounded->fNext;
    181         span->dumpID();
    182         if (next) {
    183             SkDebugf(",");
    184         }
    185         testBounded = next;
    186     }
    187     SkDebugf("]");
    188 }
    189 
    190 template<typename TCurve, typename OppCurve>
    191 void SkTSpan<TCurve, OppCurve>::dumpBounded(int id) const {
    192     SkDEBUGCODE(fDebugSect->dumpBounded(id));
    193 }
    194 
    195 template<typename TCurve, typename OppCurve>
    196 void SkTSpan<TCurve, OppCurve>::dumpBounds() const {
    197     dumpID();
    198     SkDebugf(" bounds=(%1.9g,%1.9g, %1.9g,%1.9g) boundsMax=%1.9g%s\n",
    199             fBounds.fLeft, fBounds.fTop, fBounds.fRight, fBounds.fBottom, fBoundsMax,
    200             fCollapsed ? " collapsed" : "");
    201 }
    202 
    203 template<typename TCurve, typename OppCurve>
    204 void SkTSpan<TCurve, OppCurve>::dumpCoin() const {
    205     dumpID();
    206     SkDebugf(" coinStart ");
    207     fCoinStart.dump();
    208     SkDebugf(" coinEnd ");
    209     fCoinEnd.dump();
    210 }
    211 
    212 template<typename TCurve, typename OppCurve>
    213 void SkTSpan<TCurve, OppCurve>::dumpID() const {
    214     char cS = fCoinStart.dumpIsCoincidentStr();
    215     if (cS) {
    216         SkDebugf("%c", cS);
    217     }
    218     SkDebugf("%d", debugID());
    219     char cE = fCoinEnd.dumpIsCoincidentStr();
    220     if (cE) {
    221         SkDebugf("%c", cE);
    222     }
    223 }
    224 #endif  // PathOpsTSectDebug_DEFINED
    225