/* * 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 = …; /** * 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