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