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 SkOpEdgeBuilder_DEFINED
      8 #define SkOpEdgeBuilder_DEFINED
      9 
     10 #include "SkOpContour.h"
     11 #include "SkPathWriter.h"
     12 #include "SkTArray.h"
     13 
     14 class SkOpEdgeBuilder {
     15 public:
     16     SkOpEdgeBuilder(const SkPathWriter& path, SkTArray<SkOpContour>& contours)
     17         : fPath(path.nativePath())
     18         , fContours(contours)
     19         , fAllowOpenContours(true) {
     20         init();
     21     }
     22 
     23     SkOpEdgeBuilder(const SkPath& path, SkTArray<SkOpContour>& contours)
     24         : fPath(&path)
     25         , fContours(contours)
     26         , fAllowOpenContours(false) {
     27         init();
     28     }
     29 
     30     void complete() {
     31         if (fCurrentContour && fCurrentContour->segments().count()) {
     32             fCurrentContour->complete();
     33             fCurrentContour = NULL;
     34         }
     35     }
     36 
     37     SkPathOpsMask xorMask() const {
     38         return fXorMask[fOperand];
     39     }
     40 
     41     void addOperand(const SkPath& path);
     42     bool finish();
     43     void init();
     44 
     45 private:
     46     void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart);
     47     bool close();
     48     int preFetch();
     49     bool walk();
     50 
     51     const SkPath* fPath;
     52     SkTArray<SkPoint, true> fPathPts;
     53     SkTArray<uint8_t, true> fPathVerbs;
     54     SkOpContour* fCurrentContour;
     55     SkTArray<SkOpContour>& fContours;
     56     SkPathOpsMask fXorMask[2];
     57     int fSecondHalf;
     58     bool fOperand;
     59     bool fAllowOpenContours;
     60     bool fUnparseable;
     61 };
     62 
     63 #endif
     64