Home | History | Annotate | Download | only in pathops
      1 /*
      2  * Copyright 2012 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 SkOpAngle_DEFINED
      8 #define SkOpAngle_DEFINED
      9 
     10 #include "SkLineParameters.h"
     11 #include "SkPathOpsCurve.h"
     12 #if DEBUG_ANGLE
     13 #include "SkString.h"
     14 #endif
     15 
     16 class SkOpContour;
     17 class SkOpPtT;
     18 class SkOpSegment;
     19 class SkOpSpanBase;
     20 class SkOpSpan;
     21 
     22 struct SkOpAngle {
     23     enum IncludeType {
     24         kUnaryWinding,
     25         kUnaryXor,
     26         kBinarySingle,
     27         kBinaryOpp,
     28     };
     29 
     30     bool after(SkOpAngle* test);
     31     int allOnOneSide(const SkOpAngle* test);
     32     bool checkCrossesZero() const;
     33     void checkNearCoincidence();
     34     bool checkParallel(SkOpAngle* );
     35     bool computeSector();
     36     int convexHullOverlaps(const SkOpAngle* ) const;
     37 
     38     const SkOpAngle* debugAngle(int id) const;
     39     SkOpContour* debugContour(int id);
     40 
     41     int debugID() const {
     42         return SkDEBUGRELEASE(fID, -1);
     43     }
     44 
     45 #if DEBUG_SORT
     46     void debugLoop() const;
     47 #endif
     48 
     49 #if DEBUG_ANGLE
     50     SkString debugPart() const;
     51 #endif
     52     const SkOpPtT* debugPtT(int id) const;
     53     const SkOpSegment* debugSegment(int id) const;
     54     int debugSign() const;
     55     const SkOpSpanBase* debugSpan(int id) const;
     56     void debugValidate() const;
     57     void debugValidateNext() const;  // in debug builds, verify that angle loop is uncorrupted
     58     double distEndRatio(double dist) const;
     59     // available to testing only
     60     void dump() const;
     61     void dumpCurves() const;
     62     void dumpLoop() const;
     63     void dumpOne(bool functionHeader) const;
     64     void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
     65     void dumpTest() const;
     66 
     67     SkOpSpanBase* end() const {
     68         return fEnd;
     69     }
     70 
     71     bool endsIntersect(SkOpAngle* );
     72     bool endToSide(const SkOpAngle* rh, bool* inside) const;
     73     int findSector(SkPath::Verb verb, double x, double y) const;
     74     SkOpGlobalState* globalState() const;
     75     void insert(SkOpAngle* );
     76     SkOpSpanBase* lastMarked() const;
     77     bool loopContains(const SkOpAngle* ) const;
     78     int loopCount() const;
     79     bool merge(SkOpAngle* );
     80     double midT() const;
     81     bool midToSide(const SkOpAngle* rh, bool* inside) const;
     82 
     83     SkOpAngle* next() const {
     84         return fNext;
     85     }
     86 
     87     bool oppositePlanes(const SkOpAngle* rh) const;
     88     bool orderable(SkOpAngle* rh);  // false == this < rh ; true == this > rh
     89     SkOpAngle* previous() const;
     90 
     91     int sectorEnd() const {
     92         return fSectorEnd;
     93     }
     94 
     95     int sectorStart() const {
     96         return fSectorStart;
     97     }
     98 
     99     SkOpSegment* segment() const;
    100 
    101     void set(SkOpSpanBase* start, SkOpSpanBase* end);
    102     void setCurveHullSweep();
    103 
    104     void setID(int id) {
    105         SkDEBUGCODE(fID = id);
    106     }
    107 
    108     void setLastMarked(SkOpSpanBase* marked) {
    109         fLastMarked = marked;
    110     }
    111 
    112     void setSector();
    113     void setSpans();
    114 
    115     SkOpSpanBase* start() const {
    116         return fStart;
    117     }
    118 
    119     SkOpSpan* starter();
    120     bool tangentsDiverge(const SkOpAngle* rh, double s0xt0) const;
    121 
    122     bool unorderable() const {
    123         return fUnorderable;
    124     }
    125 
    126     SkDCurve fCurvePart;  // the curve from start to end
    127     double fSide;
    128     SkLineParameters fTangentHalf;  // used only to sort a pair of lines or line-like sections
    129     SkOpAngle* fNext;
    130     SkOpSpanBase* fLastMarked;
    131     SkDVector fSweep[2];
    132     SkOpSpanBase* fStart;
    133     SkOpSpanBase* fEnd;
    134     SkOpSpanBase* fComputedEnd;
    135     int fSectorMask;
    136     int8_t fSectorStart;  // in 32nds of a circle
    137     int8_t fSectorEnd;
    138     bool fIsCurve;
    139     bool fUnorderable;
    140     bool fUnorderedSweep;  // set when a cubic's first control point between the sweep vectors
    141     bool fComputeSector;
    142     bool fComputedSector;
    143     bool fCheckCoincidence;
    144     SkDEBUGCODE(int fID);
    145 
    146 };
    147 
    148 
    149 
    150 #endif
    151