| /* | |
| * Copyright 2012 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkOpEdgeBuilder_DEFINED | |
| #define SkOpEdgeBuilder_DEFINED | |
| #include "include/core/SkPoint.h" | |
| #include "include/core/SkScalar.h" | |
| #include "include/private/SkTDArray.h" | |
| #include "src/pathops/SkOpContour.h" | |
| #include "src/pathops/SkPathOpsTypes.h" | |
| #include "src/pathops/SkPathWriter.h" | |
| #include <array> | |
| #include <cstdint> | |
| class SkPath; | |
| class SkOpEdgeBuilder { | |
| public: | |
| SkOpEdgeBuilder(const SkPath& path, SkOpContourHead* contours2, SkOpGlobalState* globalState) | |
| : fGlobalState(globalState) | |
| , fPath(&path) | |
| , fContourBuilder(contours2) | |
| , fContoursHead(contours2) | |
| , fAllowOpenContours(false) { | |
| init(); | |
| } | |
| void addOperand(const SkPath& path); | |
| void complete() { | |
| fContourBuilder.flush(); | |
| SkOpContour* contour = fContourBuilder.contour(); | |
| if (contour && contour->count()) { | |
| contour->complete(); | |
| fContourBuilder.setContour(nullptr); | |
| } | |
| } | |
| bool finish(); | |
| const SkOpContour* head() const { | |
| return fContoursHead; | |
| } | |
| void init(); | |
| bool unparseable() const { return fUnparseable; } | |
| SkPathOpsMask xorMask() const { return fXorMask[fOperand]; } | |
| private: | |
| void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart); | |
| bool close(); | |
| int preFetch(); | |
| bool walk(); | |
| SkOpGlobalState* fGlobalState; | |
| const SkPath* fPath; | |
| SkTDArray<SkPoint> fPathPts; | |
| SkTDArray<SkScalar> fWeights; | |
| SkTDArray<uint8_t> fPathVerbs; | |
| SkOpContourBuilder fContourBuilder; | |
| SkOpContourHead* fContoursHead; | |
| std::array<SkPathOpsMask, 2> fXorMask; | |
| int fSecondHalf; | |
| bool fOperand; | |
| bool fAllowOpenContours; | |
| bool fUnparseable; | |
| }; | |
| #endif |