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 "SkPath.h"
     12 #include "SkPathOpsCubic.h"
     13 
     14 class SkOpSegment;
     15 
     16 // sorting angles
     17 // given angles of {dx dy ddx ddy dddx dddy} sort them
     18 class SkOpAngle {
     19 public:
     20     enum { kStackBasedCount = 8 }; // FIXME: determine what this should be
     21 
     22     bool operator<(const SkOpAngle& rh) const;
     23 
     24     bool calcSlop(double x, double y, double rx, double ry, bool* result) const;
     25 
     26     double dx() const {
     27         return fTangent1.dx();
     28     }
     29 
     30     double dy() const {
     31         return fTangent1.dy();
     32     }
     33 
     34     int end() const {
     35         return fEnd;
     36     }
     37 
     38     bool isHorizontal() const;
     39 
     40     void set(const SkOpSegment* segment, int start, int end);
     41 
     42     SkOpSegment* segment() const {
     43         return const_cast<SkOpSegment*>(fSegment);
     44     }
     45 
     46     int sign() const {
     47         return SkSign32(fStart - fEnd);
     48     }
     49 
     50     int start() const {
     51         return fStart;
     52     }
     53 
     54     bool unorderable() const {
     55         return fUnorderable;
     56     }
     57 
     58     bool unsortable() const {
     59         return fUnsortable;
     60     }
     61 
     62 #if DEBUG_ANGLE
     63     void debugShow(const SkPoint& a) const {
     64         SkDebugf("    d=(%1.9g,%1.9g) side=%1.9g\n", dx(), dy(), fSide);
     65     }
     66 
     67     void setID(int id) {
     68         fID = id;
     69     }
     70 #endif
     71 
     72 private:
     73     bool lengthen(const SkOpAngle& );
     74     void setSpans();
     75 
     76     SkDCubic fCurvePart;
     77     double fSide;
     78     SkLineParameters fTangent1;
     79     const SkOpSegment* fSegment;
     80     int fStart;
     81     int fEnd;
     82     bool fComputed; // tangent is computed, may contain some error
     83     // if subdividing a quad or cubic causes the tangent to go from the maximum angle to the
     84     // minimum, mark it unorderable. It still can be sorted, which is good enough for find-top
     85     // but can't be ordered, and therefore can't be used to compute winding
     86     bool fUnorderable;
     87     mutable bool fUnsortable;  // this alone is editable by the less than operator
     88 #if DEBUG_ANGLE
     89     int fID;
     90 #endif
     91 };
     92 
     93 #endif
     94