1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrBlurUtils_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrBlurUtils_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class GrClip; 18*c8dee2aaSAndroid Build Coastguard Worker class GrPaint; 19*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 20*c8dee2aaSAndroid Build Coastguard Worker class GrStyledShape; 21*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView; 22*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace; 23*c8dee2aaSAndroid Build Coastguard Worker class SkMaskFilter; 24*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 25*c8dee2aaSAndroid Build Coastguard Worker class SkPaint; 26*c8dee2aaSAndroid Build Coastguard Worker class SkRRect; 27*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int; 28*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType; 29*c8dee2aaSAndroid Build Coastguard Worker enum class SkTileMode; 30*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { namespace ganesh { class SurfaceDrawContext; } } 31*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect; 32*c8dee2aaSAndroid Build Coastguard Worker struct SkISize; 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker /** 35*c8dee2aaSAndroid Build Coastguard Worker * Blur utilities. 36*c8dee2aaSAndroid Build Coastguard Worker */ 37*c8dee2aaSAndroid Build Coastguard Worker namespace GrBlurUtils { 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kBlurRRectMaxDivisions = 6; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker /** 42*c8dee2aaSAndroid Build Coastguard Worker * This method computes all the parameters for drawing a partially occluded nine-patched 43*c8dee2aaSAndroid Build Coastguard Worker * blurred rrect mask: 44*c8dee2aaSAndroid Build Coastguard Worker * rrectToDraw - the integerized rrect to draw in the mask 45*c8dee2aaSAndroid Build Coastguard Worker * widthHeight - how large to make the mask (rrectToDraw will be centered in this coord system). 46*c8dee2aaSAndroid Build Coastguard Worker * rectXs, rectYs - the x & y coordinates of the covering geometry lattice 47*c8dee2aaSAndroid Build Coastguard Worker * texXs, texYs - the texture coordinate at each point in rectXs & rectYs 48*c8dee2aaSAndroid Build Coastguard Worker * It returns true if 'devRRect' is nine-patchable 49*c8dee2aaSAndroid Build Coastguard Worker */ 50*c8dee2aaSAndroid Build Coastguard Worker bool ComputeBlurredRRectParams(const SkRRect& srcRRect, 51*c8dee2aaSAndroid Build Coastguard Worker const SkRRect& devRRect, 52*c8dee2aaSAndroid Build Coastguard Worker SkScalar sigma, 53*c8dee2aaSAndroid Build Coastguard Worker SkScalar xformedSigma, 54*c8dee2aaSAndroid Build Coastguard Worker SkRRect* rrectToDraw, 55*c8dee2aaSAndroid Build Coastguard Worker SkISize* widthHeight, 56*c8dee2aaSAndroid Build Coastguard Worker SkScalar rectXs[kBlurRRectMaxDivisions], 57*c8dee2aaSAndroid Build Coastguard Worker SkScalar rectYs[kBlurRRectMaxDivisions], 58*c8dee2aaSAndroid Build Coastguard Worker SkScalar texXs[kBlurRRectMaxDivisions], 59*c8dee2aaSAndroid Build Coastguard Worker SkScalar texYs[kBlurRRectMaxDivisions]); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker /** 62*c8dee2aaSAndroid Build Coastguard Worker * Draw a shape handling the mask filter if present. 63*c8dee2aaSAndroid Build Coastguard Worker */ 64*c8dee2aaSAndroid Build Coastguard Worker void DrawShapeWithMaskFilter(GrRecordingContext*, 65*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SurfaceDrawContext*, 66*c8dee2aaSAndroid Build Coastguard Worker const GrClip*, 67*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&, 68*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix&, 69*c8dee2aaSAndroid Build Coastguard Worker const GrStyledShape&); 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker /** 72*c8dee2aaSAndroid Build Coastguard Worker * Draw a shape handling the mask filter. The mask filter is not optional. 73*c8dee2aaSAndroid Build Coastguard Worker * The GrPaint will be modified after return. 74*c8dee2aaSAndroid Build Coastguard Worker */ 75*c8dee2aaSAndroid Build Coastguard Worker void DrawShapeWithMaskFilter(GrRecordingContext*, 76*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SurfaceDrawContext*, 77*c8dee2aaSAndroid Build Coastguard Worker const GrClip*, 78*c8dee2aaSAndroid Build Coastguard Worker const GrStyledShape&, 79*c8dee2aaSAndroid Build Coastguard Worker GrPaint&&, 80*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 81*c8dee2aaSAndroid Build Coastguard Worker const SkMaskFilter*); 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker /** 84*c8dee2aaSAndroid Build Coastguard Worker * Applies a 2D Gaussian blur to a given texture. The blurred result is returned 85*c8dee2aaSAndroid Build Coastguard Worker * as a surfaceDrawContext in case the caller wishes to draw into the result. 86*c8dee2aaSAndroid Build Coastguard Worker * The GrSurfaceOrigin of the result will watch the GrSurfaceOrigin of srcView. The output 87*c8dee2aaSAndroid Build Coastguard Worker * color type, color space, and alpha type will be the same as the src. 88*c8dee2aaSAndroid Build Coastguard Worker * 89*c8dee2aaSAndroid Build Coastguard Worker * Note: one of sigmaX and sigmaY should be non-zero! 90*c8dee2aaSAndroid Build Coastguard Worker * @param context The GPU context 91*c8dee2aaSAndroid Build Coastguard Worker * @param srcView The source to be blurred. 92*c8dee2aaSAndroid Build Coastguard Worker * @param srcColorType The colorType of srcProxy 93*c8dee2aaSAndroid Build Coastguard Worker * @param srcAlphaType The alphaType of srcProxy 94*c8dee2aaSAndroid Build Coastguard Worker * @param srcColorSpace Color space of the source. 95*c8dee2aaSAndroid Build Coastguard Worker * @param dstBounds The destination bounds, relative to the source texture. 96*c8dee2aaSAndroid Build Coastguard Worker * @param srcBounds The source bounds, relative to the source texture's offset. No pixels 97*c8dee2aaSAndroid Build Coastguard Worker * will be sampled outside of this rectangle. 98*c8dee2aaSAndroid Build Coastguard Worker * @param sigmaX The blur's standard deviation in X. 99*c8dee2aaSAndroid Build Coastguard Worker * @param sigmaY The blur's standard deviation in Y. 100*c8dee2aaSAndroid Build Coastguard Worker * @param tileMode The mode to handle samples outside bounds. 101*c8dee2aaSAndroid Build Coastguard Worker * @param fit backing fit for the returned render target context 102*c8dee2aaSAndroid Build Coastguard Worker * @return The surfaceDrawContext containing the blurred result. 103*c8dee2aaSAndroid Build Coastguard Worker */ 104*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<skgpu::ganesh::SurfaceDrawContext> GaussianBlur( 105*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext*, 106*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView srcView, 107*c8dee2aaSAndroid Build Coastguard Worker GrColorType srcColorType, 108*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType srcAlphaType, 109*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> srcColorSpace, 110*c8dee2aaSAndroid Build Coastguard Worker SkIRect dstBounds, 111*c8dee2aaSAndroid Build Coastguard Worker SkIRect srcBounds, 112*c8dee2aaSAndroid Build Coastguard Worker float sigmaX, 113*c8dee2aaSAndroid Build Coastguard Worker float sigmaY, 114*c8dee2aaSAndroid Build Coastguard Worker SkTileMode mode, 115*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit = SkBackingFit::kApprox); 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker } // namespace GrBlurUtils 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker #endif 120