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