1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef GRAPHICS_EFFECT_GE_MESA_BLUR_SHADER_FILTER_H
16 #define GRAPHICS_EFFECT_GE_MESA_BLUR_SHADER_FILTER_H
17 
18 #include <memory>
19 
20 #include "ge_shader_filter.h"
21 #include "ge_visual_effect.h"
22 
23 #include "draw/canvas.h"
24 #include "effect/color_filter.h"
25 #include "effect/runtime_effect.h"
26 #include "effect/runtime_shader_builder.h"
27 #include "image/image.h"
28 #include "utils/matrix.h"
29 #include "utils/rect.h"
30 
31 namespace OHOS {
32 namespace Rosen {
33 class GEMESABlurShaderFilter : public GEShaderFilter {
34 public:
35     GEMESABlurShaderFilter(const Drawing::GEMESABlurShaderFilterParams& params);
36     ~GEMESABlurShaderFilter() override = default;
37     int GetRadius() const;
38 
39     std::shared_ptr<Drawing::Image> ProcessImage(Drawing::Canvas& canvas, const std::shared_ptr<Drawing::Image> image,
40         const Drawing::Rect& src, const Drawing::Rect& dst) override;
41 
42 private:
43     struct NewBlurParams {
44         int numberOfPasses = 1;     // 1: initial number of passes
45         float offsets[12] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};    // 0: initial offsets
46     };
47     bool InitBlurEffect();
48     bool InitMixEffect();
49     bool InitSimpleFilter();
50     bool InitGreyAdjustmentEffect();
51 
52     void CheckInputImage(Drawing::Canvas& canvas, const std::shared_ptr<Drawing::Image>& image,
53         std::shared_ptr<Drawing::Image>& checkedImage, const Drawing::Rect& src) const;
54     std::shared_ptr<Drawing::Image> OutputImageWithoutBlur(Drawing::Canvas& canvas,
55         const std::shared_ptr<Drawing::Image>& image,
56         const Drawing::Rect& src, const Drawing::Rect& dst) const;
57 
58     std::shared_ptr<Drawing::ShaderEffect> ApplyGreyAdjustmentFilter(Drawing::Canvas& canvas,
59         const std::shared_ptr<Drawing::Image>& input, const std::shared_ptr<Drawing::ShaderEffect>& prevShader,
60         const Drawing::ImageInfo& scaledInfo, const Drawing::SamplingOptions& linear) const;
61     std::shared_ptr<Drawing::ShaderEffect> GetShaderEffect(const std::shared_ptr<Drawing::Image>& image,
62         const Drawing::SamplingOptions& linear, const Drawing::Matrix& matrix) const;
63 
64     std::shared_ptr<Drawing::Image> DownSampling2X(Drawing::Canvas& canvas,
65         const std::shared_ptr<Drawing::Image>& input, const Drawing::Rect& src,
66         const Drawing::ImageInfo& scaledInfo, const Drawing::SamplingOptions& linear,
67         const NewBlurParams& blur) const;
68     std::shared_ptr<Drawing::Image> DownSampling4X(Drawing::Canvas& canvas,
69         const std::shared_ptr<Drawing::Image>& input, const Drawing::Rect& src,
70         const Drawing::ImageInfo& scaledInfo, const Drawing::SamplingOptions& linear,
71         const NewBlurParams& blur) const;
72     std::shared_ptr<Drawing::Image> DownSampling8X(Drawing::Canvas& canvas,
73         const std::shared_ptr<Drawing::Image>& input, const Drawing::Rect& src,
74         const Drawing::ImageInfo& scaledInfo, const Drawing::ImageInfo& middleInfo,
75         const Drawing::SamplingOptions& linear, const NewBlurParams& blur) const;
76     std::shared_ptr<Drawing::Image> DownSamplingMoreX(Drawing::Canvas& canvas,
77         const std::shared_ptr<Drawing::Image>& input, const Drawing::Rect& src,
78         const Drawing::ImageInfo& scaledInfo, const Drawing::ImageInfo& middleInfo,
79         const Drawing::ImageInfo& middleInfo2, const Drawing::SamplingOptions& linear,
80         const NewBlurParams& blur) const;
81     std::shared_ptr<Drawing::Image> DownSampling(Drawing::Canvas& canvas,
82         const std::shared_ptr<Drawing::Image>& input, const Drawing::Rect& src,
83         const Drawing::ImageInfo& scaledInfo, int& width, int& height,
84         const Drawing::SamplingOptions& linear, const NewBlurParams& blur) const;
85     std::shared_ptr<Drawing::Image> ScaleAndAddRandomColor(Drawing::Canvas& canvas,
86         const std::shared_ptr<Drawing::Image>& image, const std::shared_ptr<Drawing::Image>& blurImage,
87         const Drawing::Rect& src, const Drawing::Rect& dst, int& width, int& height) const;
88 
89     void ComputeRadiusAndScale(int radius);
90     void AdjustRadiusAndScale();
91     std::string GetDescription() const;
92     bool IsInputValid(Drawing::Canvas& canvas, const std::shared_ptr<Drawing::Image>& image, const Drawing::Rect& src,
93         const Drawing::Rect& dst);
94 
95     void SetBlurParams(NewBlurParams& bParam);
96     void SetBlurParamsFivePassSmall(NewBlurParams& bParam);
97     void SetBlurParamsFivePassLarge(NewBlurParams& bParam);
98 
99     Drawing::Matrix BuildMatrix(const Drawing::Rect& src, const Drawing::ImageInfo& scaledInfo,
100         const std::shared_ptr<Drawing::Image>& input) const;
101     Drawing::Matrix BuildMiddleMatrix(
102         const Drawing::ImageInfo& scaledInfo, const Drawing::ImageInfo& middleInfo) const;
103     Drawing::Matrix BuildStretchMatrixFull(const Drawing::Rect& src,
104         const Drawing::Rect& dst, int inputWidth, int inputHeight) const;
105     Drawing::Matrix BuildStretchMatrix(const Drawing::Rect& src, int inputWidth, int inputHeight) const;
106     void CalculatePixelStretch(int width, int height);
107 
108     int radius_ = 0;
109     float blurRadius_ = 0.0f;
110     float blurScale_ = 0.25f;
111 
112     float greyCoef1_ = 0.0f;
113     float greyCoef2_ = 0.0f;
114     bool isGreyX_ = false;
115     float stretchOffsetX_ = 0.0f;
116     float stretchOffsetY_ = 0.0f;
117     float stretchOffsetZ_ = 0.0f;
118     float stretchOffsetW_ = 0.0f;
119     float offsetX_ = 0.0f;
120     float offsetY_ = 0.0f;
121     float offsetZ_ = 0.0f;
122     float offsetW_ = 0.0f;
123     Drawing::TileMode tileMode_ = Drawing::TileMode::CLAMP;
124     float width_ = 0.0f;
125     float height_ = 0.0f;
126 };
127 
128 } // namespace Rosen
129 } // namespace OHOS
130 
131 #endif // GRAPHICS_EFFECT_GE_MESA_BLUR_SHADER_FILTER_H
132