blob: f11e0e4c89934bec436c462be9a5fcd9ac482a7c [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"
caryclark@google.com07393ca2013-04-08 11:47:37 +000012
13class SkOpEdgeBuilder {
14public:
caryclark54359292015-03-26 07:52:43 -070015 SkOpEdgeBuilder(const SkPathWriter& path, SkOpContour* contours2, SkChunkAlloc* allocator,
16 SkOpGlobalState* globalState)
17 : fAllocator(allocator) // FIXME: replace with const, tune this
18 , fGlobalState(globalState)
19 , fPath(path.nativePath())
20 , fContoursHead(contours2)
caryclark@google.com66560ca2013-04-26 19:51:16 +000021 , fAllowOpenContours(true) {
caryclark@google.com07393ca2013-04-08 11:47:37 +000022 init();
23 }
24
caryclark54359292015-03-26 07:52:43 -070025 SkOpEdgeBuilder(const SkPath& path, SkOpContour* contours2, SkChunkAlloc* allocator,
26 SkOpGlobalState* globalState)
27 : fAllocator(allocator)
28 , fGlobalState(globalState)
29 , fPath(&path)
30 , fContoursHead(contours2)
caryclark@google.com66560ca2013-04-26 19:51:16 +000031 , fAllowOpenContours(false) {
caryclark@google.com07393ca2013-04-08 11:47:37 +000032 init();
33 }
34
caryclarkd751ac02014-10-03 05:36:27 -070035 void addOperand(const SkPath& path);
36
caryclark@google.com07393ca2013-04-08 11:47:37 +000037 void complete() {
caryclark54359292015-03-26 07:52:43 -070038 if (fCurrentContour && fCurrentContour->count()) {
caryclark@google.com07393ca2013-04-08 11:47:37 +000039 fCurrentContour->complete();
Tom Hudson2880df22015-10-29 09:55:42 -040040 fCurrentContour = nullptr;
caryclark@google.com07393ca2013-04-08 11:47:37 +000041 }
42 }
43
caryclark54359292015-03-26 07:52:43 -070044 int count() const;
45 bool finish(SkChunkAlloc* );
46
47 const SkOpContour* head() const {
48 return fContoursHead;
49 }
50
caryclark@google.com07393ca2013-04-08 11:47:37 +000051 void init();
caryclarkd751ac02014-10-03 05:36:27 -070052 bool unparseable() const { return fUnparseable; }
53 SkPathOpsMask xorMask() const { return fXorMask[fOperand]; }
caryclark@google.com07393ca2013-04-08 11:47:37 +000054
55private:
caryclark@google.com07e97fc2013-07-08 17:17:02 +000056 void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart);
caryclark@google.com66560ca2013-04-26 19:51:16 +000057 bool close();
caryclark@google.com07393ca2013-04-08 11:47:37 +000058 int preFetch();
caryclark54359292015-03-26 07:52:43 -070059 bool walk(SkChunkAlloc* );
caryclark@google.com07393ca2013-04-08 11:47:37 +000060
caryclark54359292015-03-26 07:52:43 -070061 SkChunkAlloc* fAllocator;
62 SkOpGlobalState* fGlobalState;
caryclark@google.com07393ca2013-04-08 11:47:37 +000063 const SkPath* fPath;
caryclark54359292015-03-26 07:52:43 -070064 SkTDArray<SkPoint> fPathPts;
caryclark1049f122015-04-20 08:31:59 -070065 SkTDArray<SkScalar> fWeights;
caryclark54359292015-03-26 07:52:43 -070066 SkTDArray<uint8_t> fPathVerbs;
caryclark@google.com07393ca2013-04-08 11:47:37 +000067 SkOpContour* fCurrentContour;
caryclark54359292015-03-26 07:52:43 -070068 SkOpContour* fContoursHead;
caryclark@google.com07393ca2013-04-08 11:47:37 +000069 SkPathOpsMask fXorMask[2];
70 int fSecondHalf;
71 bool fOperand;
caryclark@google.com66560ca2013-04-26 19:51:16 +000072 bool fAllowOpenContours;
73 bool fUnparseable;
caryclark@google.com07393ca2013-04-08 11:47:37 +000074};
75
76#endif