• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "include/core/SkSpan.h"
15 #include "src/core/SkMask.h"
16 #include "src/core/SkMaskFilterBase.h"
17 
18 #include <optional>
19 
20 class SkImageFilter;
21 class SkMatrix;
22 class SkRRect;
23 class SkReadBuffer;
24 class SkWriteBuffer;
25 enum SkBlurStyle : int;
26 struct SkIPoint;
27 struct SkIRect;
28 struct SkRect;
29 
30 class SkBlurMaskFilterImpl : public SkMaskFilterBase {
31 public:
32     SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, bool respectCTM);
33 
34     // From SkMaskFilterBase.h
35     SkMask::Format getFormat() const override;
36     bool filterMask(SkMaskBuilder* dst, const SkMask& src, const SkMatrix&,
37                     SkIPoint* margin) const override;
type()38     SkMaskFilterBase::Type type() const override { return SkMaskFilterBase::Type::kBlur; }
39 
40     void computeFastBounds(const SkRect&, SkRect*) const override;
41     bool asABlur(BlurRec*) const override;
42     sk_sp<SkImageFilter> asImageFilter(const SkMatrix& ctm) const override;
43 
44 
45     SkScalar computeXformedSigma(const SkMatrix& ctm) const;
blurStyle()46     SkBlurStyle blurStyle() const {return fBlurStyle;}
sigma()47     SkScalar sigma() const {return fSigma;}
ignoreXform()48     bool ignoreXform() const { return !fRespectCTM; }
49 
50 private:
51     FilterReturn filterRectsToNine(SkSpan<const SkRect>,
52                                    const SkMatrix&,
53                                    const SkIRect& clipBounds,
54                                    std::optional<NinePatch>*) const override;
55 
56     std::optional<NinePatch> filterRRectToNine(const SkRRect&,
57                                                const SkMatrix&,
58                                                const SkIRect& clipBounds) const override;
59 
60     bool filterRectMask(SkMaskBuilder* dstM,
61                         const SkRect& r,
62                         const SkMatrix& matrix,
63                         SkIPoint* margin,
64                         SkMaskBuilder::CreateMode createMode) const;
65 
66     SK_FLATTENABLE_HOOKS(SkBlurMaskFilterImpl)
67 
68     SkScalar    fSigma;
69     SkBlurStyle fBlurStyle;
70     bool        fRespectCTM;
71 
72     SkBlurMaskFilterImpl(SkReadBuffer&);
73     void flatten(SkWriteBuffer&) const override;
74 
75     friend class SkBlurMaskFilter;
76 
77     friend void sk_register_blur_maskfilter_createproc();
78 };
79 
80 #endif
81