xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrBlurUtils.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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