1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkOpEdgeBuilder_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SkOpEdgeBuilder_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpContour.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathWriter.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class SkPath; 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class SkOpEdgeBuilder { 22*c8dee2aaSAndroid Build Coastguard Worker public: SkOpEdgeBuilder(const SkPathWriter & path,SkOpContourHead * contours2,SkOpGlobalState * globalState)23*c8dee2aaSAndroid Build Coastguard Worker SkOpEdgeBuilder(const SkPathWriter& path, SkOpContourHead* contours2, 24*c8dee2aaSAndroid Build Coastguard Worker SkOpGlobalState* globalState) 25*c8dee2aaSAndroid Build Coastguard Worker : fGlobalState(globalState) 26*c8dee2aaSAndroid Build Coastguard Worker , fPath(path.nativePath()) 27*c8dee2aaSAndroid Build Coastguard Worker , fContourBuilder(contours2) 28*c8dee2aaSAndroid Build Coastguard Worker , fContoursHead(contours2) 29*c8dee2aaSAndroid Build Coastguard Worker , fAllowOpenContours(true) { 30*c8dee2aaSAndroid Build Coastguard Worker init(); 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker SkOpEdgeBuilder(const SkPath & path,SkOpContourHead * contours2,SkOpGlobalState * globalState)33*c8dee2aaSAndroid Build Coastguard Worker SkOpEdgeBuilder(const SkPath& path, SkOpContourHead* contours2, SkOpGlobalState* globalState) 34*c8dee2aaSAndroid Build Coastguard Worker : fGlobalState(globalState) 35*c8dee2aaSAndroid Build Coastguard Worker , fPath(&path) 36*c8dee2aaSAndroid Build Coastguard Worker , fContourBuilder(contours2) 37*c8dee2aaSAndroid Build Coastguard Worker , fContoursHead(contours2) 38*c8dee2aaSAndroid Build Coastguard Worker , fAllowOpenContours(false) { 39*c8dee2aaSAndroid Build Coastguard Worker init(); 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker void addOperand(const SkPath& path); 43*c8dee2aaSAndroid Build Coastguard Worker complete()44*c8dee2aaSAndroid Build Coastguard Worker void complete() { 45*c8dee2aaSAndroid Build Coastguard Worker fContourBuilder.flush(); 46*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour = fContourBuilder.contour(); 47*c8dee2aaSAndroid Build Coastguard Worker if (contour && contour->count()) { 48*c8dee2aaSAndroid Build Coastguard Worker contour->complete(); 49*c8dee2aaSAndroid Build Coastguard Worker fContourBuilder.setContour(nullptr); 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker } 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker bool finish(); 54*c8dee2aaSAndroid Build Coastguard Worker head()55*c8dee2aaSAndroid Build Coastguard Worker const SkOpContour* head() const { 56*c8dee2aaSAndroid Build Coastguard Worker return fContoursHead; 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker void init(); unparseable()60*c8dee2aaSAndroid Build Coastguard Worker bool unparseable() const { return fUnparseable; } xorMask()61*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsMask xorMask() const { return fXorMask[fOperand]; } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker private: 64*c8dee2aaSAndroid Build Coastguard Worker void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart); 65*c8dee2aaSAndroid Build Coastguard Worker bool close(); 66*c8dee2aaSAndroid Build Coastguard Worker int preFetch(); 67*c8dee2aaSAndroid Build Coastguard Worker bool walk(); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker SkOpGlobalState* fGlobalState; 70*c8dee2aaSAndroid Build Coastguard Worker const SkPath* fPath; 71*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<SkPoint> fPathPts; 72*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<SkScalar> fWeights; 73*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<uint8_t> fPathVerbs; 74*c8dee2aaSAndroid Build Coastguard Worker SkOpContourBuilder fContourBuilder; 75*c8dee2aaSAndroid Build Coastguard Worker SkOpContourHead* fContoursHead; 76*c8dee2aaSAndroid Build Coastguard Worker SkPathOpsMask fXorMask[2]; 77*c8dee2aaSAndroid Build Coastguard Worker int fSecondHalf; 78*c8dee2aaSAndroid Build Coastguard Worker bool fOperand; 79*c8dee2aaSAndroid Build Coastguard Worker bool fAllowOpenContours; 80*c8dee2aaSAndroid Build Coastguard Worker bool fUnparseable; 81*c8dee2aaSAndroid Build Coastguard Worker }; 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker #endif 84