1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC
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 skgpu_BlurUtils_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_BlurUtils_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkBlurEngine.h"
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard Worker #include <array>
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap;
18*c8dee2aaSAndroid Build Coastguard Worker class SkRRect;
19*c8dee2aaSAndroid Build Coastguard Worker class SkRuntimeEffect;
20*c8dee2aaSAndroid Build Coastguard Worker struct SkV4;
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker // TODO: Remove functions that just wrap SkBlurEngine utilities once calling code is updated to
25*c8dee2aaSAndroid Build Coastguard Worker // use SkBlurEngine directly or is deleted entirely in favor of SkShaderBlurAlgorithm.
BlurKernelWidth(int radius)26*c8dee2aaSAndroid Build Coastguard Worker constexpr int BlurKernelWidth(int radius) { return SkShaderBlurAlgorithm::KernelWidth(radius); }
BlurLinearKernelWidth(int radius)27*c8dee2aaSAndroid Build Coastguard Worker constexpr int BlurLinearKernelWidth(int radius) {
28*c8dee2aaSAndroid Build Coastguard Worker return SkShaderBlurAlgorithm::LinearKernelWidth(radius);
29*c8dee2aaSAndroid Build Coastguard Worker }
BlurIsEffectivelyIdentity(float sigma)30*c8dee2aaSAndroid Build Coastguard Worker constexpr bool BlurIsEffectivelyIdentity(float sigma) {
31*c8dee2aaSAndroid Build Coastguard Worker return SkBlurEngine::IsEffectivelyIdentity(sigma);
32*c8dee2aaSAndroid Build Coastguard Worker }
BlurSigmaRadius(float sigma)33*c8dee2aaSAndroid Build Coastguard Worker inline int BlurSigmaRadius(float sigma) { return SkBlurEngine::SigmaToRadius(sigma); }
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kMaxBlurSamples = SkShaderBlurAlgorithm::kMaxSamples;
36*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kMaxLinearBlurSigma = SkShaderBlurAlgorithm::kMaxLinearSigma;
37*c8dee2aaSAndroid Build Coastguard Worker
GetBlur2DEffect(const SkISize & radii)38*c8dee2aaSAndroid Build Coastguard Worker inline const SkRuntimeEffect* GetBlur2DEffect(const SkISize& radii) {
39*c8dee2aaSAndroid Build Coastguard Worker return SkShaderBlurAlgorithm::GetBlur2DEffect(radii);
40*c8dee2aaSAndroid Build Coastguard Worker }
41*c8dee2aaSAndroid Build Coastguard Worker
GetLinearBlur1DEffect(int radius)42*c8dee2aaSAndroid Build Coastguard Worker inline const SkRuntimeEffect* GetLinearBlur1DEffect(int radius) {
43*c8dee2aaSAndroid Build Coastguard Worker return SkShaderBlurAlgorithm::GetLinearBlur1DEffect(radius);
44*c8dee2aaSAndroid Build Coastguard Worker }
45*c8dee2aaSAndroid Build Coastguard Worker
Compute2DBlurKernel(SkSize sigma,SkISize radius,SkSpan<float> kernel)46*c8dee2aaSAndroid Build Coastguard Worker inline void Compute2DBlurKernel(SkSize sigma, SkISize radius, SkSpan<float> kernel) {
47*c8dee2aaSAndroid Build Coastguard Worker SkShaderBlurAlgorithm::Compute2DBlurKernel(sigma, radius, kernel);
48*c8dee2aaSAndroid Build Coastguard Worker }
49*c8dee2aaSAndroid Build Coastguard Worker
Compute2DBlurKernel(SkSize sigma,SkISize radius,std::array<SkV4,kMaxBlurSamples/4> & kernel)50*c8dee2aaSAndroid Build Coastguard Worker inline void Compute2DBlurKernel(SkSize sigma,
51*c8dee2aaSAndroid Build Coastguard Worker SkISize radius,
52*c8dee2aaSAndroid Build Coastguard Worker std::array<SkV4, kMaxBlurSamples/4>& kernel) {
53*c8dee2aaSAndroid Build Coastguard Worker SkShaderBlurAlgorithm::Compute2DBlurKernel(sigma, radius, kernel);
54*c8dee2aaSAndroid Build Coastguard Worker }
55*c8dee2aaSAndroid Build Coastguard Worker
Compute1DBlurKernel(float sigma,int radius,SkSpan<float> kernel)56*c8dee2aaSAndroid Build Coastguard Worker inline void Compute1DBlurKernel(float sigma, int radius, SkSpan<float> kernel) {
57*c8dee2aaSAndroid Build Coastguard Worker SkShaderBlurAlgorithm::Compute1DBlurKernel(sigma, radius, kernel);
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker
Compute2DBlurOffsets(SkISize radius,std::array<SkV4,kMaxBlurSamples/2> & offsets)60*c8dee2aaSAndroid Build Coastguard Worker inline void Compute2DBlurOffsets(SkISize radius, std::array<SkV4, kMaxBlurSamples/2>& offsets) {
61*c8dee2aaSAndroid Build Coastguard Worker SkShaderBlurAlgorithm::Compute2DBlurOffsets(radius, offsets);
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker
Compute1DBlurLinearKernel(float sigma,int radius,std::array<SkV4,kMaxBlurSamples/2> & offsetsAndKernel)64*c8dee2aaSAndroid Build Coastguard Worker inline void Compute1DBlurLinearKernel(float sigma,
65*c8dee2aaSAndroid Build Coastguard Worker int radius,
66*c8dee2aaSAndroid Build Coastguard Worker std::array<SkV4, kMaxBlurSamples/2>& offsetsAndKernel) {
67*c8dee2aaSAndroid Build Coastguard Worker SkShaderBlurAlgorithm::Compute1DBlurLinearKernel(sigma, radius, offsetsAndKernel);
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////////////////////////
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker // Calculates the integral table for an analytic rectangle blur. The integral values are stored in
73*c8dee2aaSAndroid Build Coastguard Worker // the red channel of the provided bitmap, which will be 1D with a 1-pixel height.
74*c8dee2aaSAndroid Build Coastguard Worker SkBitmap CreateIntegralTable(int width);
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard Worker // Returns the width of an integral table we will create for the given 6*sigma.
77*c8dee2aaSAndroid Build Coastguard Worker int ComputeIntegralTableWidth(float sixSigma);
78*c8dee2aaSAndroid Build Coastguard Worker
79*c8dee2aaSAndroid Build Coastguard Worker // Creates a profile of a blurred circle.
80*c8dee2aaSAndroid Build Coastguard Worker SkBitmap CreateCircleProfile(float sigma, float radius, int profileWidth);
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker // Creates a half plane approximation profile of a blurred circle.
83*c8dee2aaSAndroid Build Coastguard Worker SkBitmap CreateHalfPlaneProfile(int profileWidth);
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker // Creates a blurred rounded rectangle mask. 'rrectToDraw' is the original rrect centered within
86*c8dee2aaSAndroid Build Coastguard Worker // bounds defined by 'dimensions', which encompass the entire blurred rrect.
87*c8dee2aaSAndroid Build Coastguard Worker SkBitmap CreateRRectBlurMask(const SkRRect& rrectToDraw, const SkISize& dimensions, float sigma);
88*c8dee2aaSAndroid Build Coastguard Worker
89*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_BlurUtils_DEFINED
92