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
14class SkOpEdgeBuilder {
15public:
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
45private:
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