• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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