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 #ifdef SKIA_OHOS 49 bool directFilterRRectMaskGPU(GrRecordingContext* context, 50 skgpu::ganesh::SurfaceDrawContext* sdc, 51 GrPaint&& paint, 52 const GrClip* clip, 53 const SkMatrix& viewMatrix, 54 const GrStyledShape& shape, 55 const SkRRect& srcRRect) const override; 56 57 bool quick_check_gpu_draw(const SkMatrix& viewMatrix, 58 SkIRect& devSpaceShapeBounds) const override; 59 60 #endif // SKIA_OHOS 61 62 private: 63 FilterReturn filterRectsToNine(const SkRect[], int count, const SkMatrix&, 64 const SkIRect& clipBounds, 65 SkTLazy<NinePatch>*) const override; 66 67 FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, 68 const SkIRect& clipBounds, 69 SkTLazy<NinePatch>*) const override; 70 71 bool filterRectMask(SkMaskBuilder* dstM, const SkRect& r, const SkMatrix& matrix, 72 SkIPoint* margin, SkMaskBuilder::CreateMode createMode) const; 73 bool filterRRectMask(SkMaskBuilder* dstM, const SkRRect& r, const SkMatrix& matrix, 74 SkIPoint* margin, SkMaskBuilder::CreateMode createMode) const; 75 76 SK_FLATTENABLE_HOOKS(SkBlurMaskFilterImpl) 77 78 SkScalar fSigma; 79 SkBlurStyle fBlurStyle; 80 bool fRespectCTM; 81 82 SkBlurMaskFilterImpl(SkReadBuffer&); 83 void flatten(SkWriteBuffer&) const override; 84 85 friend class SkBlurMaskFilter; 86 87 friend void sk_register_blur_maskfilter_createproc(); 88 }; 89 90 #endif 91