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