xref: /aosp_15_r20/external/skia/src/core/SkBlurMaskFilterImpl.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2023 Google LLC
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 SkBlurMaskFilterImpl_DEFINED
9 #define SkBlurMaskFilterImpl_DEFINED
10 
11 #include "include/core/SkFlattenable.h"
12 #include "include/core/SkRefCnt.h"
13 #include "include/core/SkScalar.h"
14 #include "src/core/SkMask.h"
15 #include "src/core/SkMaskFilterBase.h"
16 
17 class SkImageFilter;
18 class SkMatrix;
19 class SkRRect;
20 class SkReadBuffer;
21 class SkWriteBuffer;
22 enum SkBlurStyle : int;
23 struct SkIPoint;
24 struct SkIRect;
25 struct SkRect;
26 template<typename T> class SkTLazy;
27 
28 class SkBlurMaskFilterImpl : public SkMaskFilterBase {
29 public:
30     SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, bool respectCTM);
31 
32     // From SkMaskFilterBase.h
33     SkMask::Format getFormat() const override;
34     bool filterMask(SkMaskBuilder* dst, const SkMask& src, const SkMatrix&,
35                     SkIPoint* margin) const override;
type()36     SkMaskFilterBase::Type type() const override { return SkMaskFilterBase::Type::kBlur; }
37 
38     void computeFastBounds(const SkRect&, SkRect*) const override;
39     bool asABlur(BlurRec*) const override;
40     sk_sp<SkImageFilter> asImageFilter(const SkMatrix& ctm) const override;
41 
42 
43     SkScalar computeXformedSigma(const SkMatrix& ctm) const;
blurStyle()44     SkBlurStyle blurStyle() const {return fBlurStyle;}
sigma()45     SkScalar sigma() const {return fSigma;}
ignoreXform()46     bool ignoreXform() const { return !fRespectCTM; }
47 
48 private:
49     FilterReturn filterRectsToNine(const SkRect[], int count, const SkMatrix&,
50                                    const SkIRect& clipBounds,
51                                    SkTLazy<NinePatch>*) const override;
52 
53     FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&,
54                                    const SkIRect& clipBounds,
55                                    SkTLazy<NinePatch>*) const override;
56 
57     bool filterRectMask(SkMaskBuilder* dstM, const SkRect& r, const SkMatrix& matrix,
58                         SkIPoint* margin, SkMaskBuilder::CreateMode createMode) const;
59     bool filterRRectMask(SkMaskBuilder* dstM, const SkRRect& r, const SkMatrix& matrix,
60                         SkIPoint* margin, SkMaskBuilder::CreateMode createMode) const;
61 
62     SK_FLATTENABLE_HOOKS(SkBlurMaskFilterImpl)
63 
64     SkScalar    fSigma;
65     SkBlurStyle fBlurStyle;
66     bool        fRespectCTM;
67 
68     SkBlurMaskFilterImpl(SkReadBuffer&);
69     void flatten(SkWriteBuffer&) const override;
70 
71     friend class SkBlurMaskFilter;
72 
73     friend void sk_register_blur_maskfilter_createproc();
74 };
75 
76 #endif
77