1 /*
2 * Copyright (c) 2025 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 "platform/common/rs_log.h"
16
17 #include "ui_effect/effect/include/border_light_effect_para.h"
18
19 #include "ui_effect/property/include/rs_ui_shader_base.h"
20
21 #include "ui_effect/effect/include/color_gradient_effect_para.h"
22
23 #include "ui_effect/property/include/rs_ui_mask_base.h"
24
25 namespace OHOS {
26 namespace Rosen {
27 using ShaderCreator = std::function<std::shared_ptr<RSNGShaderBase>()>;
28 using ShaderConvertor = std::function<std::shared_ptr<RSNGShaderBase>(std::shared_ptr<VisualEffectPara>)>;
29
30 static std::unordered_map<RSNGEffectType, ShaderCreator> creatorLUT = {
__anon46226f9a0102null31 {RSNGEffectType::CONTOUR_DIAGONAL_FLOW_LIGHT, [] {
32 return std::make_shared<RSNGContourDiagonalFlowLight>();
33 }
34 },
__anon46226f9a0202null35 {RSNGEffectType::WAVY_RIPPLE_LIGHT, [] {
36 return std::make_shared<RSNGWavyRippleLight>();
37 }
38 },
__anon46226f9a0302null39 {RSNGEffectType::AURORA_NOISE, [] {
40 return std::make_shared<RSNGAuroraNoise>();
41 }
42 },
__anon46226f9a0402null43 {RSNGEffectType::PARTICLE_CIRCULAR_HALO, [] {
44 return std::make_shared<RSNGParticleCircularHalo>();
45 }
46 },
__anon46226f9a0502null47 {RSNGEffectType::COLOR_GRADIENT_EFFECT, [] {
48 return std::make_shared<RSNGColorGradientEffect>();
49 }
50 },
__anon46226f9a0602null51 {RSNGEffectType::BORDER_LIGHT, [] {
52 return std::make_shared<RSNGBorderLight>();
53 }
54 }
55 };
56
57 const size_t MAX_GRADIENT_SIZE = 12;
58 static std::vector<std::function<void(std::shared_ptr<RSNGColorGradientEffect>&, const Vector4f&)>>
59 g_gradientColorSetVec = {
60 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0702() 61 {
62 target->Setter<ColorGradientEffectColor0Tag>(setColor);
63 },
64 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0802() 65 {
66 target->Setter<ColorGradientEffectColor1Tag>(setColor);
67 },
68 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0902() 69 {
70 target->Setter<ColorGradientEffectColor2Tag>(setColor);
71 },
72 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0a02() 73 {
74 target->Setter<ColorGradientEffectColor3Tag>(setColor);
75 },
76 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0b02() 77 {
78 target->Setter<ColorGradientEffectColor4Tag>(setColor);
79 },
80 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0c02() 81 {
82 target->Setter<ColorGradientEffectColor5Tag>(setColor);
83 },
84 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0d02() 85 {
86 target->Setter<ColorGradientEffectColor6Tag>(setColor);
87 },
88 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0e02() 89 {
90 target->Setter<ColorGradientEffectColor7Tag>(setColor);
91 },
92 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a0f02() 93 {
94 target->Setter<ColorGradientEffectColor8Tag>(setColor);
95 },
96 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a1002() 97 {
98 target->Setter<ColorGradientEffectColor9Tag>(setColor);
99 },
100 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a1102() 101 {
102 target->Setter<ColorGradientEffectColor10Tag>(setColor);
103 },
104 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector4f& setColor)
__anon46226f9a1202() 105 {
106 target->Setter<ColorGradientEffectColor11Tag>(setColor);
107 }
108 };
109
110 static std::vector<std::function<void(std::shared_ptr<RSNGColorGradientEffect>&, const Vector2f&)>>
111 g_gradientPosSetVec = {
112 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1302() 113 {
114 target->Setter<ColorGradientEffectPosition0Tag>(setPos);
115 },
116 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1402() 117 {
118 target->Setter<ColorGradientEffectPosition1Tag>(setPos);
119 },
120 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1502() 121 {
122 target->Setter<ColorGradientEffectPosition2Tag>(setPos);
123 },
124 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1602() 125 {
126 target->Setter<ColorGradientEffectPosition3Tag>(setPos);
127 },
128 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1702() 129 {
130 target->Setter<ColorGradientEffectPosition4Tag>(setPos);
131 },
132 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1802() 133 {
134 target->Setter<ColorGradientEffectPosition5Tag>(setPos);
135 },
136 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1902() 137 {
138 target->Setter<ColorGradientEffectPosition6Tag>(setPos);
139 },
140 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1a02() 141 {
142 target->Setter<ColorGradientEffectPosition7Tag>(setPos);
143 },
144 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1b02() 145 {
146 target->Setter<ColorGradientEffectPosition8Tag>(setPos);
147 },
148 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1c02() 149 {
150 target->Setter<ColorGradientEffectPosition9Tag>(setPos);
151 },
152 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1d02() 153 {
154 target->Setter<ColorGradientEffectPosition10Tag>(setPos);
155 },
156 [](std::shared_ptr<RSNGColorGradientEffect>& target, const Vector2f& setPos)
__anon46226f9a1e02() 157 {
158 target->Setter<ColorGradientEffectPosition11Tag>(setPos);
159 }
160 };
161
162 static std::vector<std::function<void(std::shared_ptr<RSNGColorGradientEffect>&, float)>> g_gradientStrengthSetVec = {
163 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a1f02() 164 {
165 target->Setter<ColorGradientEffectStrength0Tag>(setValue);
166 },
167 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2002() 168 {
169 target->Setter<ColorGradientEffectStrength1Tag>(setValue);
170 },
171 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2102() 172 {
173 target->Setter<ColorGradientEffectStrength2Tag>(setValue);
174 },
175 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2202() 176 {
177 target->Setter<ColorGradientEffectStrength3Tag>(setValue);
178 },
179 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2302() 180 {
181 target->Setter<ColorGradientEffectStrength4Tag>(setValue);
182 },
183 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2402() 184 {
185 target->Setter<ColorGradientEffectStrength5Tag>(setValue);
186 },
187 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2502() 188 {
189 target->Setter<ColorGradientEffectStrength6Tag>(setValue);
190 },
191 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2602() 192 {
193 target->Setter<ColorGradientEffectStrength7Tag>(setValue);
194 },
195 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2702() 196 {
197 target->Setter<ColorGradientEffectStrength8Tag>(setValue);
198 },
199 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2802() 200 {
201 target->Setter<ColorGradientEffectStrength9Tag>(setValue);
202 },
203 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2902() 204 {
205 target->Setter<ColorGradientEffectStrength10Tag>(setValue);
206 },
207 [](std::shared_ptr<RSNGColorGradientEffect>& target, float setValue)
__anon46226f9a2a02() 208 {
209 target->Setter<ColorGradientEffectStrength11Tag>(setValue);
210 }
211 };
212
213 namespace {
214
ConvertColorGradientEffectPara(std::shared_ptr<VisualEffectPara> effectPara)215 std::shared_ptr<RSNGShaderBase> ConvertColorGradientEffectPara(std::shared_ptr<VisualEffectPara> effectPara)
216 {
217 auto effect = RSNGShaderBase::Create(RSNGEffectType::COLOR_GRADIENT_EFFECT);
218 auto colorGradientEffect = std::static_pointer_cast<RSNGColorGradientEffect>(effect);
219 auto colorGradientEffectPara = std::static_pointer_cast<ColorGradientEffectPara>(effectPara);
220
221 std::vector<Vector4f> colors = colorGradientEffectPara->GetColors();
222 std::vector<Vector2f> positions = colorGradientEffectPara->GetPositions();
223 std::vector<float> strengths = colorGradientEffectPara->GetStrengths();
224
225 for (size_t i = 0; i < MAX_GRADIENT_SIZE; i++) {
226 auto setColor = i < colors.size() ? colors[i] : Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
227 g_gradientColorSetVec[i](colorGradientEffect, setColor);
228
229 auto setPos = i < positions.size() ? positions[i] : Vector2f(1.0f, 1.0f);
230 g_gradientPosSetVec[i](colorGradientEffect, setPos);
231
232 auto setValue = i < strengths.size() ? strengths[i] : 0.0f;
233 g_gradientStrengthSetVec[i](colorGradientEffect, setValue);
234 }
235
236 colorGradientEffect->Setter<ColorGradientEffectMaskTag>(
237 RSNGMaskBase::Create(colorGradientEffectPara->GetMask()));
238
239 colorGradientEffect->Setter<ColorGradientEffectColorNumberTag>(static_cast<float>(strengths.size()));
240
241 return colorGradientEffect;
242 }
243
ConvertBorderLightPara(std::shared_ptr<VisualEffectPara> effectPara)244 std::shared_ptr<RSNGShaderBase> ConvertBorderLightPara(std::shared_ptr<VisualEffectPara> effectPara)
245 {
246 auto effect = RSNGShaderBase::Create(RSNGEffectType::BORDER_LIGHT);
247 bool isInvalid = (effect == nullptr || effectPara == nullptr);
248 if (isInvalid) {
249 return nullptr;
250 }
251 auto borderLightEffect = std::static_pointer_cast<RSNGBorderLight>(effect);
252 auto borderLightEffectPara = std::static_pointer_cast<BorderLightEffectPara>(effectPara);
253
254 borderLightEffect->Setter<BorderLightPositionTag>(borderLightEffectPara->GetLightPosition());
255 borderLightEffect->Setter<BorderLightColorTag>(borderLightEffectPara->GetLightColor());
256 borderLightEffect->Setter<BorderLightIntensityTag>(borderLightEffectPara->GetLightIntensity());
257 borderLightEffect->Setter<BorderLightWidthTag>(borderLightEffectPara->GetLightWidth());
258 return borderLightEffect;
259 }
260 }
261
262 static std::unordered_map<VisualEffectPara::ParaType, ShaderConvertor> convertorLUT = {
263 { VisualEffectPara::ParaType::COLOR_GRADIENT_EFFECT, ConvertColorGradientEffectPara },
264 { VisualEffectPara::ParaType::BORDER_LIGHT_EFFECT, ConvertBorderLightPara },
265 };
266
Create(RSNGEffectType type)267 std::shared_ptr<RSNGShaderBase> RSNGShaderBase::Create(RSNGEffectType type)
268 {
269 auto it = creatorLUT.find(type);
270 return it != creatorLUT.end() ? it->second() : nullptr;
271 }
272
Create(std::shared_ptr<VisualEffectPara> effectPara)273 std::shared_ptr<RSNGShaderBase> RSNGShaderBase::Create(std::shared_ptr<VisualEffectPara> effectPara)
274 {
275 if (!effectPara) {
276 return nullptr;
277 }
278
279 auto it = convertorLUT.find(effectPara->GetParaType());
280 return it != convertorLUT.end() ? it->second(effectPara) : nullptr;
281 }
282
283 } // namespace Rosen
284 } // namespace OHOS
285