blob: 67dff910dcae4b334dd410614214dc5102a29889 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "src/pathops/SkOpContour.h"
11#include "src/pathops/SkPathWriter.h"
caryclark@google.com07393ca2013-04-08 11:47:37 +000012
13class SkOpEdgeBuilder {
14public:
caryclarkeed356d2016-09-14 07:18:20 -070015 SkOpEdgeBuilder(const SkPathWriter& path, SkOpContourHead* contours2,
16 SkOpGlobalState* globalState)
caryclark55888e42016-07-18 10:01:36 -070017 : fGlobalState(globalState)
caryclark54359292015-03-26 07:52:43 -070018 , fPath(path.nativePath())
Cary Clarkff114282016-12-14 11:56:16 -050019 , fContourBuilder(contours2)
caryclark54359292015-03-26 07:52:43 -070020 , 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
caryclarkeed356d2016-09-14 07:18:20 -070025 SkOpEdgeBuilder(const SkPath& path, SkOpContourHead* contours2, SkOpGlobalState* globalState)
caryclark55888e42016-07-18 10:01:36 -070026 : fGlobalState(globalState)
caryclark54359292015-03-26 07:52:43 -070027 , fPath(&path)
Cary Clarkff114282016-12-14 11:56:16 -050028 , fContourBuilder(contours2)
caryclark54359292015-03-26 07:52:43 -070029 , fContoursHead(contours2)
caryclark@google.com66560ca2013-04-26 19:51:16 +000030 , fAllowOpenContours(false) {
caryclark@google.com07393ca2013-04-08 11:47:37 +000031 init();
32 }
33
caryclarkd751ac02014-10-03 05:36:27 -070034 void addOperand(const SkPath& path);
35
caryclark@google.com07393ca2013-04-08 11:47:37 +000036 void complete() {
Cary Clarkff114282016-12-14 11:56:16 -050037 fContourBuilder.flush();
38 SkOpContour* contour = fContourBuilder.contour();
39 if (contour && contour->count()) {
40 contour->complete();
41 fContourBuilder.setContour(nullptr);
caryclark@google.com07393ca2013-04-08 11:47:37 +000042 }
43 }
44
caryclark55888e42016-07-18 10:01:36 -070045 bool finish();
caryclark54359292015-03-26 07:52:43 -070046
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();
caryclark55888e42016-07-18 10:01:36 -070059 bool walk();
caryclark@google.com07393ca2013-04-08 11:47:37 +000060
caryclark54359292015-03-26 07:52:43 -070061 SkOpGlobalState* fGlobalState;
caryclark@google.com07393ca2013-04-08 11:47:37 +000062 const SkPath* fPath;
caryclark54359292015-03-26 07:52:43 -070063 SkTDArray<SkPoint> fPathPts;
caryclark1049f122015-04-20 08:31:59 -070064 SkTDArray<SkScalar> fWeights;
caryclark54359292015-03-26 07:52:43 -070065 SkTDArray<uint8_t> fPathVerbs;
Cary Clarkff114282016-12-14 11:56:16 -050066 SkOpContourBuilder fContourBuilder;
caryclarkeed356d2016-09-14 07:18:20 -070067 SkOpContourHead* fContoursHead;
caryclark@google.com07393ca2013-04-08 11:47:37 +000068 SkPathOpsMask fXorMask[2];
69 int fSecondHalf;
70 bool fOperand;
caryclark@google.com66560ca2013-04-26 19:51:16 +000071 bool fAllowOpenContours;
72 bool fUnparseable;
caryclark@google.com07393ca2013-04-08 11:47:37 +000073};
74
75#endif