• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "render/rs_render_mesa_blur_filter.h"
16 
17 #include "ge_visual_effect.h"
18 #include "ge_visual_effect_container.h"
19 #include "src/core/SkOpts.h"
20 
21 #include "effect/color_matrix.h"
22 #include "effect/runtime_shader_builder.h"
23 #include "platform/common/rs_system_properties.h"
24 
25 #ifdef USE_M133_SKIA
26 #include "include/gpu/ganesh/GrDirectContext.h"
27 #include "src/core/SkChecksum.h"
28 #else
29 #include "src/core/SkOpts.h"
30 #include "include/gpu/GrDirectContext.h"
31 #endif
32 
33 namespace OHOS {
34 namespace Rosen {
RSMESABlurShaderFilter(int radius)35 RSMESABlurShaderFilter::RSMESABlurShaderFilter(int radius)
36     : RSRenderFilterParaBase(RSUIFilterType::MESA), radius_(radius)
37 {
38     CalculateHash();
39 }
40 
RSMESABlurShaderFilter(int radius,float greyCoefLow,float greyCoefHigh)41 RSMESABlurShaderFilter::RSMESABlurShaderFilter(int radius, float greyCoefLow, float greyCoefHigh)
42     : RSRenderFilterParaBase(RSUIFilterType::MESA), radius_(radius), greyCoefLow_(greyCoefLow),
43       greyCoefHigh_(greyCoefHigh)
44 {
45     CalculateHash();
46 }
47 
48 RSMESABlurShaderFilter::~RSMESABlurShaderFilter() = default;
49 
GetRadius() const50 int RSMESABlurShaderFilter::GetRadius() const
51 {
52     return radius_;
53 }
54 
SetRadius(int radius)55 void RSMESABlurShaderFilter::SetRadius(int radius)
56 {
57     radius_ = radius;
58     CalculateHash();
59 }
60 
SetPixelStretchParams(std::shared_ptr<RSPixelStretchParams> & param)61 void RSMESABlurShaderFilter::SetPixelStretchParams(std::shared_ptr<RSPixelStretchParams>& param)
62 {
63     {
64         std::lock_guard<std::mutex> lock(pixelStretchParamsMutex_);
65         pixelStretchParam_ = std::move(param);
66     }
67     CalculateHash();
68 }
69 
CalculateHash()70 void RSMESABlurShaderFilter::CalculateHash()
71 {
72 #ifdef USE_M133_SKIA
73     const auto hashFunc = SkChecksum::Hash32;
74 #else
75     const auto hashFunc = SkOpts::hash;
76 #endif
77     hash_ = hashFunc(&radius_, sizeof(radius_), 0);
78     hash_ = hashFunc(&greyCoefLow_, sizeof(greyCoefLow_), hash_);
79     hash_ = hashFunc(&greyCoefHigh_, sizeof(greyCoefHigh_), hash_);
80     if (auto localParams = GetPixelStretchParams()) {
81         hash_ = hashFunc(&localParams->offsetX_, sizeof(localParams->offsetX_), hash_);
82         hash_ = hashFunc(&localParams->offsetY_, sizeof(localParams->offsetY_), hash_);
83         hash_ = hashFunc(&localParams->offsetZ_, sizeof(localParams->offsetZ_), hash_);
84         hash_ = hashFunc(&localParams->offsetW_, sizeof(localParams->offsetW_), hash_);
85         hash_ = hashFunc(&localParams->tileMode_, sizeof(localParams->tileMode_), hash_);
86         hash_ = hashFunc(&localParams->width_, sizeof(localParams->width_), hash_);
87         hash_ = hashFunc(&localParams->height_, sizeof(localParams->height_), hash_);
88     }
89 }
90 
GetDetailedDescription() const91 std::string RSMESABlurShaderFilter::GetDetailedDescription() const
92 {
93     std::string filterString = ", MESA radius: " + std::to_string(radius_) + " sigma";
94     filterString = filterString + ", greyCoef1: " + std::to_string(greyCoefLow_);
95     filterString = filterString + ", greyCoef2: " + std::to_string(greyCoefHigh_);
96     if (auto localParams = GetPixelStretchParams()) {
97         filterString = filterString + ", pixel stretch offsetX: " + std::to_string(localParams->offsetX_);
98         filterString = filterString + ", offsetY: " + std::to_string(localParams->offsetY_);
99         filterString = filterString + ", offsetZ: " + std::to_string(localParams->offsetZ_);
100         filterString = filterString + ", offsetW: " + std::to_string(localParams->offsetW_);
101         filterString = filterString + ", tileMode: " + std::to_string(localParams->tileMode_);
102         filterString = filterString + ", width: " + std::to_string(localParams->width_);
103         filterString = filterString + ", height: " + std::to_string(localParams->height_);
104     }
105     return filterString;
106 }
107 
GenerateGEVisualEffect(std::shared_ptr<Drawing::GEVisualEffectContainer> visualEffectContainer)108 void RSMESABlurShaderFilter::GenerateGEVisualEffect(
109     std::shared_ptr<Drawing::GEVisualEffectContainer> visualEffectContainer)
110 {
111     auto mesaFilter = std::make_shared<Drawing::GEVisualEffect>("MESA_BLUR", Drawing::DrawingPaintType::BRUSH);
112     mesaFilter->SetParam("MESA_BLUR_RADIUS", (int)radius_); // blur radius
113     mesaFilter->SetParam("MESA_BLUR_GREY_COEF_1", greyCoefLow_);
114     mesaFilter->SetParam("MESA_BLUR_GREY_COEF_2", greyCoefHigh_);
115     if (auto localParams = GetPixelStretchParams()) {
116         mesaFilter->SetParam("OFFSET_X", localParams->offsetX_);
117         mesaFilter->SetParam("OFFSET_Y", localParams->offsetY_);
118         mesaFilter->SetParam("OFFSET_Z", localParams->offsetZ_);
119         mesaFilter->SetParam("OFFSET_W", localParams->offsetW_);
120         mesaFilter->SetParam("TILE_MODE", localParams->tileMode_);
121         mesaFilter->SetParam("WIDTH", localParams->width_);
122         mesaFilter->SetParam("HEIGHT", localParams->height_);
123     } else {
124         mesaFilter->SetParam("OFFSET_X", 0.f);
125         mesaFilter->SetParam("OFFSET_Y", 0.f);
126         mesaFilter->SetParam("OFFSET_Z", 0.f);
127         mesaFilter->SetParam("OFFSET_W", 0.f);
128         mesaFilter->SetParam("TILE_MODE", 0);
129         mesaFilter->SetParam("WIDTH", 0.f);
130         mesaFilter->SetParam("HEIGHT", 0.f);
131     }
132     visualEffectContainer->AddToChainedFilter(mesaFilter);
133 }
134 } // namespace Rosen
135 } // namespace OHOS
136