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