blob: b827a2a009414559c34f48b6bfb58b86fb3ea564 [file] [log] [blame]
caryclark@google.com07393ca2013-04-08 11:47:37 +00001/*
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#include "SkTDArray.h"
14
15class SkOpEdgeBuilder {
16public:
17 SkOpEdgeBuilder(const SkPathWriter& path, SkTArray<SkOpContour>& contours)
18 : fPath(path.nativePath())
caryclark@google.com66560ca2013-04-26 19:51:16 +000019 , fContours(contours)
20 , fAllowOpenContours(true) {
caryclark@google.com07393ca2013-04-08 11:47:37 +000021 init();
22 }
23
24 SkOpEdgeBuilder(const SkPath& path, SkTArray<SkOpContour>& contours)
25 : fPath(&path)
caryclark@google.com66560ca2013-04-26 19:51:16 +000026 , fContours(contours)
27 , fAllowOpenContours(false) {
caryclark@google.com07393ca2013-04-08 11:47:37 +000028 init();
29 }
30
31 void complete() {
32 if (fCurrentContour && fCurrentContour->segments().count()) {
33 fCurrentContour->complete();
34 fCurrentContour = NULL;
35 }
36 }
37
38 SkPathOpsMask xorMask() const {
39 return fXorMask[fOperand];
40 }
41
42 void addOperand(const SkPath& path);
caryclark@google.com66560ca2013-04-26 19:51:16 +000043 bool finish();
caryclark@google.com07393ca2013-04-08 11:47:37 +000044 void init();
45
46private:
caryclark@google.com66560ca2013-04-26 19:51:16 +000047 bool close();
caryclark@google.com07393ca2013-04-08 11:47:37 +000048 int preFetch();
caryclark@google.com66560ca2013-04-26 19:51:16 +000049 bool walk();
caryclark@google.com07393ca2013-04-08 11:47:37 +000050
51 const SkPath* fPath;
caryclark@google.com66560ca2013-04-26 19:51:16 +000052 SkTDArray<SkPoint> fPathPts;
53 SkTDArray<uint8_t> fPathVerbs;
caryclark@google.com07393ca2013-04-08 11:47:37 +000054 SkOpContour* fCurrentContour;
55 SkTArray<SkOpContour>& fContours;
56 SkTDArray<SkPoint> fReducePts; // segments created on the fly
57 SkTDArray<int> fExtra; // -1 marks new contour, > 0 offsets into contour
58 SkPathOpsMask fXorMask[2];
caryclark@google.com66560ca2013-04-26 19:51:16 +000059 const SkPoint* fFinalCurveStart;
60 const SkPoint* fFinalCurveEnd;
caryclark@google.com07393ca2013-04-08 11:47:37 +000061 int fSecondHalf;
62 bool fOperand;
caryclark@google.com66560ca2013-04-26 19:51:16 +000063 bool fAllowOpenContours;
64 bool fUnparseable;
caryclark@google.com07393ca2013-04-08 11:47:37 +000065};
66
67#endif