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
13class SkOpEdgeBuilder {
14public:
15    SkOpEdgeBuilder(const SkPathWriter& path, SkOpContourHead* contours2,
16            SkOpGlobalState* globalState)
17        : fGlobalState(globalState)
18        , fPath(path.nativePath())
19        , fContourBuilder(contours2)
20        , fContoursHead(contours2)
21        , fAllowOpenContours(true) {
22        init();
23    }
24
25    SkOpEdgeBuilder(const SkPath& path, SkOpContourHead* contours2, SkOpGlobalState* globalState)
26        : fGlobalState(globalState)
27        , fPath(&path)
28        , fContourBuilder(contours2)
29        , fContoursHead(contours2)
30        , fAllowOpenContours(false) {
31        init();
32    }
33
34    void addOperand(const SkPath& path);
35
36    void complete() {
37        fContourBuilder.flush();
38        SkOpContour* contour = fContourBuilder.contour();
39        if (contour && contour->count()) {
40            contour->complete();
41            fContourBuilder.setContour(nullptr);
42        }
43    }
44
45    bool finish();
46
47    const SkOpContour* head() const {
48        return fContoursHead;
49    }
50
51    void init();
52    bool unparseable() const { return fUnparseable; }
53    SkPathOpsMask xorMask() const { return fXorMask[fOperand]; }
54
55private:
56    void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart);
57    bool close();
58    int preFetch();
59    bool walk();
60
61    SkOpGlobalState* fGlobalState;
62    const SkPath* fPath;
63    SkTDArray<SkPoint> fPathPts;
64    SkTDArray<SkScalar> fWeights;
65    SkTDArray<uint8_t> fPathVerbs;
66    SkOpContourBuilder fContourBuilder;
67    SkOpContourHead* fContoursHead;
68    SkPathOpsMask fXorMask[2];
69    int fSecondHalf;
70    bool fOperand;
71    bool fAllowOpenContours;
72    bool fUnparseable;
73};
74
75#endif
76