blob: 11c968fc6d8e3f65a523ec6b37957d7d630d7550 [file] [log] [blame]
Mike Reed0ef539a2018-07-18 13:28:42 -04001/*
2 * Copyright 2018 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
8#ifndef SkOpPE_DEFINED
9#define SkOpPE_DEFINED
10
Mike Reedec9d0e82021-05-21 17:42:14 -040011#include "include/pathops/SkPathOps.h"
12#include "src/core/SkPathEffectBase.h"
Mike Reed0ef539a2018-07-18 13:28:42 -040013
Mike Reedec9d0e82021-05-21 17:42:14 -040014class SkOpPE : public SkPathEffectBase {
Mike Reed0ef539a2018-07-18 13:28:42 -040015public:
16 SkOpPE(sk_sp<SkPathEffect> one, sk_sp<SkPathEffect> two, SkPathOp op);
17
Mike Reed0ef539a2018-07-18 13:28:42 -040018
19protected:
20 void flatten(SkWriteBuffer&) const override;
Tyler Dennistonf8b7c1a2021-07-13 13:22:19 -040021 bool onFilterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*,
22 const SkMatrix&) const override;
Mike Reed0ef539a2018-07-18 13:28:42 -040023
24private:
Mike Klein4fee3232018-10-18 17:27:16 -040025 SK_FLATTENABLE_HOOKS(SkOpPE)
Mike Reed0ef539a2018-07-18 13:28:42 -040026
Michael Ludwig4e1c1a72021-05-11 11:39:36 -040027 bool computeFastBounds(SkRect* bounds) const override;
28
Mike Reed0ef539a2018-07-18 13:28:42 -040029 sk_sp<SkPathEffect> fOne;
30 sk_sp<SkPathEffect> fTwo;
31 SkPathOp fOp;
32
Mike Reedec9d0e82021-05-21 17:42:14 -040033 using INHERITED = SkPathEffectBase;
Mike Reed0ef539a2018-07-18 13:28:42 -040034};
35
Mike Reedec9d0e82021-05-21 17:42:14 -040036class SkMatrixPE : public SkPathEffectBase {
Mike Reed0ef539a2018-07-18 13:28:42 -040037public:
38 SkMatrixPE(const SkMatrix&);
39
Mike Reed0ef539a2018-07-18 13:28:42 -040040protected:
41 void flatten(SkWriteBuffer&) const override;
Tyler Dennistonf8b7c1a2021-07-13 13:22:19 -040042 bool onFilterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*,
43 const SkMatrix&) const override;
Mike Reed0ef539a2018-07-18 13:28:42 -040044
45private:
Mike Klein4fee3232018-10-18 17:27:16 -040046 SK_FLATTENABLE_HOOKS(SkMatrixPE)
Mike Reed0ef539a2018-07-18 13:28:42 -040047
Michael Ludwig4e1c1a72021-05-11 11:39:36 -040048 bool computeFastBounds(SkRect* bounds) const override {
49 if (bounds) {
50 fMatrix.mapRect(bounds);
51 }
52 return true;
53 }
54
Mike Reed0ef539a2018-07-18 13:28:42 -040055 SkMatrix fMatrix;
56
Mike Reedec9d0e82021-05-21 17:42:14 -040057 using INHERITED = SkPathEffectBase;
Mike Reed0ef539a2018-07-18 13:28:42 -040058};
59
Mike Reedec9d0e82021-05-21 17:42:14 -040060class SkStrokePE : public SkPathEffectBase {
Mike Reed0ef539a2018-07-18 13:28:42 -040061public:
62 SkStrokePE(SkScalar width, SkPaint::Join, SkPaint::Cap, SkScalar miter);
63
Mike Reed0ef539a2018-07-18 13:28:42 -040064protected:
65 void flatten(SkWriteBuffer&) const override;
Tyler Dennistonf8b7c1a2021-07-13 13:22:19 -040066 bool onFilterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*,
67 const SkMatrix&) const override;
Mike Reed0ef539a2018-07-18 13:28:42 -040068
69private:
Mike Klein4fee3232018-10-18 17:27:16 -040070 SK_FLATTENABLE_HOOKS(SkStrokePE)
Mike Reed0ef539a2018-07-18 13:28:42 -040071
Michael Ludwig4e1c1a72021-05-11 11:39:36 -040072 bool computeFastBounds(SkRect* bounds) const override;
73
Mike Reed0ef539a2018-07-18 13:28:42 -040074 SkScalar fWidth,
75 fMiter;
76 SkPaint::Join fJoin;
77 SkPaint::Cap fCap;
78
Mike Reedec9d0e82021-05-21 17:42:14 -040079 using INHERITED = SkPathEffectBase;
Mike Reed0ef539a2018-07-18 13:28:42 -040080};
81
Mike Reedec9d0e82021-05-21 17:42:14 -040082class SkStrokeAndFillPE : public SkPathEffectBase {
Mike Reed3e843122020-05-20 09:55:58 -040083public:
84 SkStrokeAndFillPE() {}
85
86protected:
87 void flatten(SkWriteBuffer&) const override;
Tyler Dennistonf8b7c1a2021-07-13 13:22:19 -040088 bool onFilterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*,
89 const SkMatrix&) const override;
Mike Reed3e843122020-05-20 09:55:58 -040090
91private:
92 SK_FLATTENABLE_HOOKS(SkStrokeAndFillPE)
93
Michael Ludwig4e1c1a72021-05-11 11:39:36 -040094 bool computeFastBounds(SkRect* bounds) const override {
95 // The effect's bounds depend on the StrokeRect that is not yet available
96 return false;
97 }
98
Mike Reedec9d0e82021-05-21 17:42:14 -040099 using INHERITED = SkPathEffectBase;
Mike Reed3e843122020-05-20 09:55:58 -0400100};
101
Mike Reed0ef539a2018-07-18 13:28:42 -0400102#endif