| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrBlurUtils_DEFINED |
| #define GrBlurUtils_DEFINED |
| |
| #include "include/core/SkRefCnt.h" |
| #include "include/core/SkScalar.h" |
| #include "src/gpu/SkBackingFit.h" |
| |
| #include <memory> |
| |
| class GrClip; |
| class GrPaint; |
| class GrRecordingContext; |
| class GrStyledShape; |
| class GrSurfaceProxyView; |
| class SkColorSpace; |
| class SkMaskFilter; |
| class SkMatrix; |
| class SkPaint; |
| class SkRRect; |
| enum SkAlphaType : int; |
| enum class GrColorType; |
| enum class SkTileMode; |
| namespace skgpu { namespace ganesh { class SurfaceDrawContext; } } |
| struct SkIRect; |
| struct SkISize; |
| |
| /** |
| * Blur utilities. |
| */ |
| namespace GrBlurUtils { |
| |
| static constexpr int kBlurRRectMaxDivisions = 6; |
| |
| /** |
| * This method computes all the parameters for drawing a partially occluded nine-patched |
| * blurred rrect mask: |
| * rrectToDraw - the integerized rrect to draw in the mask |
| * widthHeight - how large to make the mask (rrectToDraw will be centered in this coord system). |
| * rectXs, rectYs - the x & y coordinates of the covering geometry lattice |
| * texXs, texYs - the texture coordinate at each point in rectXs & rectYs |
| * It returns true if 'devRRect' is nine-patchable |
| */ |
| bool ComputeBlurredRRectParams(const SkRRect& srcRRect, |
| const SkRRect& devRRect, |
| SkScalar sigma, |
| SkScalar xformedSigma, |
| SkRRect* rrectToDraw, |
| SkISize* widthHeight, |
| SkScalar rectXs[kBlurRRectMaxDivisions], |
| SkScalar rectYs[kBlurRRectMaxDivisions], |
| SkScalar texXs[kBlurRRectMaxDivisions], |
| SkScalar texYs[kBlurRRectMaxDivisions]); |
| |
| /** |
| * Draw a shape handling the mask filter if present. |
| */ |
| void DrawShapeWithMaskFilter(GrRecordingContext*, |
| skgpu::ganesh::SurfaceDrawContext*, |
| const GrClip*, |
| const SkPaint&, |
| const SkMatrix&, |
| const GrStyledShape&); |
| |
| /** |
| * Draw a shape handling the mask filter. The mask filter is not optional. |
| * The GrPaint will be modified after return. |
| */ |
| void DrawShapeWithMaskFilter(GrRecordingContext*, |
| skgpu::ganesh::SurfaceDrawContext*, |
| const GrClip*, |
| const GrStyledShape&, |
| GrPaint&&, |
| const SkMatrix& viewMatrix, |
| const SkMaskFilter*); |
| |
| /** |
| * Applies a 2D Gaussian blur to a given texture. The blurred result is returned |
| * as a surfaceDrawContext in case the caller wishes to draw into the result. |
| * The GrSurfaceOrigin of the result will watch the GrSurfaceOrigin of srcView. The output |
| * color type, color space, and alpha type will be the same as the src. |
| * |
| * Note: one of sigmaX and sigmaY should be non-zero! |
| * @param context The GPU context |
| * @param srcView The source to be blurred. |
| * @param srcColorType The colorType of srcProxy |
| * @param srcAlphaType The alphaType of srcProxy |
| * @param srcColorSpace Color space of the source. |
| * @param dstBounds The destination bounds, relative to the source texture. |
| * @param srcBounds The source bounds, relative to the source texture's offset. No pixels |
| * will be sampled outside of this rectangle. |
| * @param sigmaX The blur's standard deviation in X. |
| * @param sigmaY The blur's standard deviation in Y. |
| * @param tileMode The mode to handle samples outside bounds. |
| * @param fit backing fit for the returned render target context |
| * @return The surfaceDrawContext containing the blurred result. |
| */ |
| std::unique_ptr<skgpu::ganesh::SurfaceDrawContext> GaussianBlur( |
| GrRecordingContext*, |
| GrSurfaceProxyView srcView, |
| GrColorType srcColorType, |
| SkAlphaType srcAlphaType, |
| sk_sp<SkColorSpace> srcColorSpace, |
| SkIRect dstBounds, |
| SkIRect srcBounds, |
| float sigmaX, |
| float sigmaY, |
| SkTileMode mode, |
| SkBackingFit fit = SkBackingFit::kApprox); |
| |
| } // namespace GrBlurUtils |
| |
| #endif |