• 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 "ge_render.h"
16 
17 #include "ge_aibar_shader_filter.h"
18 #include "ge_aurora_noise_shader.h"
19 #include "ge_bezier_warp_shader_filter.h"
20 #include "ge_border_light_shader.h"
21 #include "ge_color_gradient_shader_filter.h"
22 #include "ge_content_light_shader_filter.h"
23 #include "ge_contour_diagonal_flow_light_shader.h"
24 #include "ge_direction_light_shader_filter.h"
25 #include "ge_displacement_distort_shader_filter.h"
26 #include "ge_edge_light_shader_filter.h"
27 #include "ge_external_dynamic_loader.h"
28 #include "ge_grey_shader_filter.h"
29 #include "ge_kawase_blur_shader_filter.h"
30 #include "ge_linear_gradient_blur_shader_filter.h"
31 #include "ge_hps_effect_filter.h"
32 #include "ge_log.h"
33 #include "ge_magnifier_shader_filter.h"
34 #include "ge_mask_transition_shader_filter.h"
35 #include "ge_mesa_blur_shader_filter.h"
36 #include "ge_particle_circular_halo_shader.h"
37 #include "ge_sound_wave_filter.h"
38 #include "ge_visual_effect_impl.h"
39 #include "ge_variable_radius_blur_shader_filter.h"
40 #include "ge_water_ripple_filter.h"
41 #include "ge_wavy_ripple_light_shader.h"
42 
43 namespace OHOS {
44 namespace GraphicsEffectEngine {
45 using namespace Rosen::Drawing;
46 using ShaderCreator = std::function<std::shared_ptr<GEShader>(std::shared_ptr<GEVisualEffectImpl>)>;
47 
48 static std::unordered_map<GEVisualEffectImpl::FilterType, ShaderCreator> g_shaderCreatorLUT = {
49     {GEVisualEffectImpl::FilterType::CONTOUR_DIAGONAL_FLOW_LIGHT, [] (std::shared_ptr<GEVisualEffectImpl> ve)
__anon406760bd0102() 50         {
51             std::shared_ptr<GEShader> out = nullptr;
52             if (ve == nullptr || ve->GetContenDiagonalParams() == nullptr) {
53                 return out;
54             }
55             const auto& params = ve->GetContenDiagonalParams();
56             out = std::make_shared<GEContourDiagonalFlowLightShader>(*params);
57             return out;
58         }
59     },
60     {GEVisualEffectImpl::FilterType::WAVY_RIPPLE_LIGHT, [] (std::shared_ptr<GEVisualEffectImpl> ve)
__anon406760bd0202() 61         {
62             std::shared_ptr<GEShader> out = nullptr;
63             if (ve == nullptr || ve->GetWavyRippleLightParams() == nullptr) {
64                 return out;
65             }
66             const auto& params = ve->GetWavyRippleLightParams();
67             out = std::make_shared<GEWavyRippleLightShader>(*params);
68             return out;
69         }
70     },
71     {GEVisualEffectImpl::FilterType::AURORA_NOISE, [] (std::shared_ptr<GEVisualEffectImpl> ve)
__anon406760bd0302() 72         {
73             std::shared_ptr<GEShader> out = nullptr;
74             if (ve == nullptr || ve->GetAuroraNoiseParams() == nullptr) {
75                 return out;
76             }
77             const auto& params = ve->GetAuroraNoiseParams();
78             out = GEAuroraNoiseShader::CreateAuroraNoiseShader(*params);
79             return out;
80         }
81     },
82     {GEVisualEffectImpl::FilterType::PARTICLE_CIRCULAR_HALO, [] (std::shared_ptr<GEVisualEffectImpl> ve)
__anon406760bd0402() 83         {
84             std::shared_ptr<GEShader> out = nullptr;
85             if (ve == nullptr || ve->GetParticleCircularHaloParams() == nullptr) {
86                 return out;
87             }
88             const auto& params = ve->GetParticleCircularHaloParams();
89             out = std::make_shared<GEParticleCircularHaloShader>(*params);
90             return out;
91         }
92     },
93     {GEVisualEffectImpl::FilterType::COLOR_GRADIENT_EFFECT, [] (std::shared_ptr<GEVisualEffectImpl> ve)
__anon406760bd0502() 94         {
95             std::shared_ptr<GEShader> out = nullptr;
96             if (ve == nullptr) {
97                 return out;
98             }
99             const auto& params = ve->GetColorGradientEffectParams();
100             if (params == nullptr) {
101                 return out;
102             }
103             auto type = static_cast<uint32_t>(Drawing::GEVisualEffectImpl::FilterType::COLOR_GRADIENT_EFFECT);
104             auto impl = GEExternalDynamicLoader::GetInstance().CreateGEXObjectByType(
105                 type, sizeof(GEXColorGradientEffectParams), static_cast<void*>(params.get()));
106             if (!impl) {
107                 GE_LOGE("GEXColorGradientEffect::CreateDynamicImpl create object failed.");
108                 return out;
109             }
110             std::shared_ptr<GEShader> dmShader(static_cast<GEShader*>(impl));
111             return dmShader;
112         }
113     },
114     {GEVisualEffectImpl::FilterType::LIGHT_CAVE, [] (std::shared_ptr<GEVisualEffectImpl> ve)
__anon406760bd0602() 115         {
116             std::shared_ptr<GEShader> out = nullptr;
117             if (ve == nullptr) {
118                 return out;
119             }
120             const auto& params = ve->GetLightCaveParams();
121             if (params == nullptr) {
122                 return out;
123             }
124             auto type = static_cast<uint32_t>(Drawing::GEVisualEffectImpl::FilterType::LIGHT_CAVE);
125             auto impl = GEExternalDynamicLoader::GetInstance().CreateGEXObjectByType(
126                 type, sizeof(GEXLightCaveShaderParams), static_cast<void*>(params.get()));
127             if (!impl) {
128                 GE_LOGE("GEXLightCaveShader::CreateDynamicImpl create object failed.");
129                 return out;
130             }
131             std::shared_ptr<GEShader> dmShader(static_cast<GEShader*>(impl));
132             return dmShader;
133         }
134     },
135     {GEVisualEffectImpl::FilterType::BORDER_LIGHT, [] (std::shared_ptr<GEVisualEffectImpl> ve)
__anon406760bd0702() 136         {
137             std::shared_ptr<GEShader> out = nullptr;
138             if (ve == nullptr || ve->GetBorderLightParams() == nullptr) {
139                 return out;
140             }
141             const auto& params = ve->GetBorderLightParams();
142             out = std::make_shared<GEBorderLightShader>(*params);
143             return out;
144         }
145     }
146 };
147 
GERender()148 GERender::GERender() {}
149 
~GERender()150 GERender::~GERender() {}
151 
DrawImageEffect(Drawing::Canvas & canvas,Drawing::GEVisualEffectContainer & veContainer,const std::shared_ptr<Drawing::Image> & image,const Drawing::Rect & src,const Drawing::Rect & dst,const Drawing::SamplingOptions & sampling)152 void GERender::DrawImageEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer,
153     const std::shared_ptr<Drawing::Image>& image, const Drawing::Rect& src, const Drawing::Rect& dst,
154     const Drawing::SamplingOptions& sampling)
155 {
156     if (!image) {
157         LOGE("GERender::DrawImageRect image is null");
158         return;
159     }
160 
161     auto resImage = ApplyImageEffect(canvas, veContainer, image, src, dst, sampling);
162     Drawing::Brush brush;
163     canvas.AttachBrush(brush);
164     canvas.DrawImageRect(*resImage, src, dst, Drawing::SamplingOptions());
165     canvas.DetachBrush();
166 }
167 
ApplyImageEffect(Drawing::Canvas & canvas,Drawing::GEVisualEffectContainer & veContainer,const std::shared_ptr<Drawing::Image> & image,const Drawing::Rect & src,const Drawing::Rect & dst,const Drawing::SamplingOptions & sampling)168 std::shared_ptr<Drawing::Image> GERender::ApplyImageEffect(Drawing::Canvas& canvas,
169     Drawing::GEVisualEffectContainer& veContainer, const std::shared_ptr<Drawing::Image>& image,
170     const Drawing::Rect& src, const Drawing::Rect& dst, const Drawing::SamplingOptions& sampling)
171 {
172     if (!image) {
173         LOGE("GERender::ApplyImageEffect image is null");
174         return nullptr;
175     }
176     std::vector<std::shared_ptr<GEShaderFilter>> geShaderFilters;
177     auto resImage = image;
178     for (auto vef : veContainer.GetFilters()) {
179         if (vef == nullptr) {
180             LOGD("GERender::ApplyImageEffect vef is null");
181             continue;
182         }
183         auto ve = vef->GetImpl();
184         std::shared_ptr<GEShaderFilter> geShaderFilter = GenerateShaderFilter(vef);
185         if (geShaderFilter == nullptr) {
186             LOGD("GERender::ApplyImageEffect filter is null");
187             continue;
188         }
189         geShaderFilter->SetSupportHeadroom(vef->GetSupportHeadroom());
190         geShaderFilter->SetCache(ve->GetCache());
191         geShaderFilter->Preprocess(canvas, src, dst);
192         resImage = geShaderFilter->ProcessImage(canvas, resImage, src, dst);
193         ve->SetCache(geShaderFilter->GetCache());
194     }
195 
196     return resImage;
197 }
198 
ExcuteRangeEmpty(Drawing::Canvas & canvas,Drawing::GEVisualEffectContainer & veContainer,const HpsGEImageEffectContext & context,std::shared_ptr<Drawing::Image> & outImage,Drawing::Brush & brush)199 bool GERender::ExcuteRangeEmpty(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer,
200     const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage, Drawing::Brush& brush)
201 {
202     auto visualEffects = veContainer.GetFilters();
203     if (visualEffects.empty()) {
204         return false;
205     }
206     HpsGEImageEffectContext fullGEContext = { context.image, context.src, context.src, context.sampling, true,
207         context.alpha, context.colorFilter, context.maskColor, context.saturationForHPS, context.brightnessForHPS };
208     bool status = ApplyGEEffects(canvas, visualEffects, fullGEContext, outImage);
209     if (status) {
210         DrawToCanvas(canvas, context, outImage, brush);
211     }
212     return status;
213 }
214 
ApplyHpsGEImageEffect(Drawing::Canvas & canvas,Drawing::GEVisualEffectContainer & veContainer,const HpsGEImageEffectContext & context,std::shared_ptr<Drawing::Image> & outImage,Drawing::Brush & brush)215 bool GERender::ApplyHpsGEImageEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer,
216     const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage, Drawing::Brush& brush)
217 {
218     if (!context.image) {
219         LOGE("GERender::ApplyHpsGEImageEffect image is null");
220         return false;
221     }
222     auto visualEffects = veContainer.GetFilters();
223     if (visualEffects.empty()) {
224         return false;
225     }
226 
227     auto hpsEffectFilter = std::make_shared<HpsEffectFilter>(canvas);
228     std::vector<IndexRange> hpsSupportedIndexRanges = hpsEffectFilter->HpsSupportedEffectsIndexRanges(visualEffects);
229     if (hpsSupportedIndexRanges.empty()) {
230         return ExcuteRangeEmpty(canvas, veContainer, context, outImage, brush);
231     }
232 
233     auto resImage = context.image;
234     bool appliedBlur = false; // compatibility with HPS
235     bool lastAppliedGE = true;
236     auto indexRangeInfos = CategorizeRanges(hpsSupportedIndexRanges, visualEffects.size());
237     for (auto& indexRangeInfo : indexRangeInfos) {
238         std::vector<std::shared_ptr<Drawing::GEVisualEffect>> subVisualEffects(
239             visualEffects.begin() + indexRangeInfo.range[0], visualEffects.begin() + indexRangeInfo.range[1] + 1);
240         auto currentImage = resImage;
241         if (indexRangeInfo.mode == EffectMode::GE) {
242             HpsGEImageEffectContext partialGEContext = { currentImage, context.src, context.src,
243                 context.sampling, false, context.alpha, context.colorFilter, context.maskColor,
244                 context.saturationForHPS, context.brightnessForHPS };
245             // When hps support exists, don't set compatibility switch
246             ApplyGEEffects(canvas, subVisualEffects, partialGEContext, resImage);
247             lastAppliedGE = true;
248             continue;
249         }
250         for (auto vef : subVisualEffects) {
251             if (vef == nullptr) {
252                 continue;
253             }
254             auto ve = vef->GetImpl();
255             hpsEffectFilter->GenerateVisualEffectFromGE(ve, context.src, context.dst, context.saturationForHPS,
256                 context.brightnessForHPS, context.image);
257         }
258         HpsEffectFilter::HpsEffectContext hpsEffectContext = {context.alpha, context.colorFilter, context.maskColor};
259         appliedBlur = hpsEffectFilter->ApplyHpsEffect(canvas, currentImage, resImage, hpsEffectContext);
260         lastAppliedGE = false;
261     }
262     outImage = resImage;
263     if (lastAppliedGE) { // ApplyHpsEffect have done canvas sync
264         DrawToCanvas(canvas, context, outImage, brush);
265     }
266     return appliedBlur;
267 }
268 
DrawToCanvas(Drawing::Canvas & canvas,const HpsGEImageEffectContext & context,std::shared_ptr<Drawing::Image> & outImage,Drawing::Brush & brush)269 void GERender::DrawToCanvas(Drawing::Canvas& canvas, const HpsGEImageEffectContext& context,
270                             std::shared_ptr<Drawing::Image>& outImage, Drawing::Brush& brush)
271 {
272     if (outImage != nullptr) {
273         canvas.AttachBrush(brush);
274         canvas.DrawImageRect(*outImage, context.src, context.dst, context.sampling);
275         canvas.DetachBrush();
276     }
277 }
278 
CategorizeRanges(const std::vector<IndexRange> & hpsIndexRanges,const int32_t veContainerSize)279 std::vector<GERender::IndexRangeInfo> GERender::CategorizeRanges(
280     const std::vector<IndexRange>& hpsIndexRanges, const int32_t veContainerSize)
281 {
282     std::vector<IndexRangeInfo> categorizedRanges;
283     // The first GE range before the first hps range
284     if (!hpsIndexRanges.empty()) {
285         int start = 0;
286         int end = hpsIndexRanges[0][0] - 1;
287         if (start <= end) {
288             categorizedRanges.emplace_back(EffectMode::GE, IndexRange{start, end});
289         }
290     }
291 
292     for (size_t i = 0; i < hpsIndexRanges.size(); ++i) {
293         categorizedRanges.emplace_back(EffectMode::HPS, hpsIndexRanges[i]);
294 
295         // If it is not the last HPS range,deal with middle GE ranges
296         if (i >= hpsIndexRanges.size() - 1) {
297             continue;
298         }
299         int start = hpsIndexRanges[i][1] + 1;
300         int end = hpsIndexRanges[i + 1][0] - 1;
301         if (start <= end) {
302             categorizedRanges.emplace_back(EffectMode::GE, IndexRange{start, end});
303         }
304     }
305 
306     // The last GE range after the last hps range
307     if (!hpsIndexRanges.empty()) {
308         int start = hpsIndexRanges.back()[1] + 1;
309         int end = veContainerSize - 1;
310         if (start <= end) {
311             categorizedRanges.emplace_back(EffectMode::GE, IndexRange{start, end});
312         }
313     } else {
314         // No hps ranges, the full veContainer are GE ranges
315         categorizedRanges.emplace_back(EffectMode::GE, IndexRange{0, veContainerSize - 1});
316     }
317 
318     return categorizedRanges;
319 }
320 
ComposeGEEffects(std::vector<std::shared_ptr<Drawing::GEVisualEffect>> & visualEffects,std::vector<std::shared_ptr<GEShaderFilter>> & geShaderFiltersOut)321 bool GERender::ComposeGEEffects(std::vector<std::shared_ptr<Drawing::GEVisualEffect>>& visualEffects,
322                                 std::vector<std::shared_ptr<GEShaderFilter>>& geShaderFiltersOut)
323 {
324     bool anyFilterComposed = false;
325     std::shared_ptr<GEFilterComposer> filterComposer = nullptr;
326     geShaderFiltersOut.clear();
327     for (auto vef : visualEffects) {
328         if (vef == nullptr) {
329             LOGE("GERender::ComposeGEEffects vef is null");
330             continue;
331         }
332         auto ve = vef->GetImpl();
333         auto currentFilter = GenerateShaderFilter(vef);
334         if (currentFilter == nullptr) {
335             continue;
336         }
337         auto& filterParams = currentFilter->Params();
338         if (currentFilter->Type().empty() || !filterParams || !filterParams.has_value()) {
339             // Current filter not supported, save current composed filter
340             if (filterComposer) {
341                 geShaderFiltersOut.push_back(filterComposer->GetComposedFilter());
342                 filterComposer.reset();
343             }
344             geShaderFiltersOut.push_back(currentFilter);
345         } else if (filterComposer == nullptr) {
346             // Create a new composer for potential composion
347             filterComposer = std::make_shared<GEFilterComposer>(currentFilter);
348         } else if (filterComposer->Compose(currentFilter)) {
349             // Compose success
350             anyFilterComposed = true;
351             continue;
352         } else {
353             // Compose fail, save current composed filter and create a new composer for potential composion
354             geShaderFiltersOut.push_back(filterComposer->GetComposedFilter());
355             filterComposer = std::make_shared<GEFilterComposer>(currentFilter);
356         }
357     }
358 
359     if (filterComposer) {
360         // Save any filter left in composer
361         geShaderFiltersOut.push_back(filterComposer->GetComposedFilter());
362         filterComposer.reset();
363     }
364 
365     return anyFilterComposed;
366 }
367 
ApplyGEEffects(Drawing::Canvas & canvas,std::vector<std::shared_ptr<Drawing::GEVisualEffect>> & visualEffects,const HpsGEImageEffectContext & context,std::shared_ptr<Drawing::Image> & outImage)368 bool GERender::ApplyGEEffects(Drawing::Canvas& canvas,
369     std::vector<std::shared_ptr<Drawing::GEVisualEffect>>& visualEffects,
370     const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage)
371 {
372     auto image = context.image;
373     auto src = context.src;
374     auto dst = context.dst;
375     auto sampling = context.sampling;
376 
377     std::vector<std::shared_ptr<GEShaderFilter>> geShaderFilters;
378     bool anyFilterComposed = ComposeGEEffects(visualEffects, geShaderFilters);
379 
380     // Compatibility issues with Kawase skip in RSDrawingFilter::DrawImageRectInternal()
381     bool skipKawase = !anyFilterComposed && context.compatibleWithHpsSkipBlur;
382     if (skipKawase) {
383         return false;
384     }
385 
386     outImage = image;
387     for (auto filter : geShaderFilters) {
388         outImage = filter->ProcessImage(canvas, outImage, src, dst);
389     }
390     return true;
391 }
392 
HpsSupportEffect(Drawing::GEVisualEffectContainer & veContainer,std::shared_ptr<HpsEffectFilter> & hpsEffectFilter)393 bool GERender::HpsSupportEffect(Drawing::GEVisualEffectContainer& veContainer,
394                                 std::shared_ptr<HpsEffectFilter>& hpsEffectFilter)
395 {
396     if (hpsEffectFilter == nullptr) {
397         return false;
398     }
399     return hpsEffectFilter->HpsSupportEffectGE(veContainer);
400 }
401 
402 // true represent Draw Kawase or Mesa succ, false represent Draw Kawase or Mesa false or no Kawase and Mesa
ApplyHpsImageEffect(Drawing::Canvas & canvas,Drawing::GEVisualEffectContainer & veContainer,const HpsGEImageEffectContext & context,std::shared_ptr<Drawing::Image> & outImage)403 bool GERender::ApplyHpsImageEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer,
404     const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage)
405 {
406     auto hpsEffectFilter = std::make_shared<HpsEffectFilter>(canvas);
407     if (!context.image) {
408         LOGE("GERender::ApplyImageEffect image is null");
409         return false;
410     }
411 
412     if (veContainer.GetFilters().empty()) {
413         return false;
414     }
415 
416     if (hpsEffectFilter->HpsSupportEffectGE(veContainer)) {
417         for (auto vef : veContainer.GetFilters()) {
418             auto ve = vef->GetImpl();
419             hpsEffectFilter->GenerateVisualEffectFromGE(ve, context.src, context.dst, context.saturationForHPS,
420                 context.brightnessForHPS, context.image);
421         }
422 
423         HpsEffectFilter::HpsEffectContext hpsEffectContext = {context.alpha, context.colorFilter, context.maskColor};
424         return hpsEffectFilter->ApplyHpsEffect(canvas, context.image, outImage, hpsEffectContext);
425     }
426 
427     return false;
428 }
429 
GenerateExtShaderFilter(const std::shared_ptr<Drawing::GEVisualEffectImpl> & ve)430 std::shared_ptr<GEShaderFilter> GERender::GenerateExtShaderFilter(
431     const std::shared_ptr<Drawing::GEVisualEffectImpl>& ve)
432 {
433     auto type = ve->GetFilterType();
434     switch (type) {
435         case Drawing::GEVisualEffectImpl::FilterType::MESA_BLUR: {
436             const auto& mesaParams = ve->GetMESAParams();
437             auto object = GEExternalDynamicLoader::GetInstance().CreateGEXObjectByType(
438                 static_cast<uint32_t>(type), sizeof(Drawing::GEMESABlurShaderFilterParams),
439                 static_cast<void*>(mesaParams.get()));
440             if (!object) {
441                 return std::make_shared<GEMESABlurShaderFilter>(*mesaParams);
442             }
443             std::shared_ptr<GEMESABlurShaderFilter> dmShader(static_cast<GEMESABlurShaderFilter*>(object));
444             return dmShader;
445         }
446         case Drawing::GEVisualEffectImpl::FilterType::LINEAR_GRADIENT_BLUR: {
447             const auto& linearGradientBlurParams = ve->GetLinearGradientBlurParams();
448             if (linearGradientBlurParams->isRadiusGradient) {
449                 auto object = GEExternalDynamicLoader::GetInstance().CreateGEXObjectByType(
450                     static_cast<uint32_t>(type), sizeof(Drawing::GELinearGradientBlurShaderFilterParams),
451                     static_cast<void*>(linearGradientBlurParams.get()));
452                 if (object) {
453                     std::shared_ptr<GELinearGradientBlurShaderFilter>
454                         dmShader(static_cast<GELinearGradientBlurShaderFilter*>(object));
455                     return dmShader;
456                 }
457             }
458             return std::make_shared<GELinearGradientBlurShaderFilter>(*linearGradientBlurParams);
459         }
460         case Drawing::GEVisualEffectImpl::FilterType::EDGE_LIGHT: {
461             const auto& edgeLightParams = ve->GetEdgeLightParams();
462             auto object = GEExternalDynamicLoader::GetInstance().CreateGEXObjectByType(
463                 static_cast<uint32_t>(type), sizeof(Drawing::GEEdgeLightShaderFilterParams),
464                 static_cast<void*>(edgeLightParams.get()));
465             if (!object) {
466                 return std::make_shared<GEEdgeLightShaderFilter>(*edgeLightParams);
467             }
468             std::shared_ptr<GEEdgeLightShaderFilter> dmShader(static_cast<GEEdgeLightShaderFilter*>(object));
469             return dmShader;
470         }
471         case Drawing::GEVisualEffectImpl::FilterType::DISPERSION: {
472             const auto& dispersionParams = ve->GetDispersionParams();
473             auto object = GEExternalDynamicLoader::GetInstance().CreateGEXObjectByType(
474                 static_cast<uint32_t>(type), sizeof(Drawing::GEDispersionShaderFilterParams),
475                 static_cast<void*>(dispersionParams.get()));
476             if (!object) {
477                 return nullptr;
478             }
479             std::shared_ptr<GEShaderFilter> dmShader(static_cast<GEShaderFilter*>(object));
480             return dmShader;
481         }
482         case Drawing::GEVisualEffectImpl::FilterType::VARIABLE_RADIUS_BLUR: {
483             const auto& variableRadiusBlurParams = ve->GetVariableRadiusBlurParams();
484             auto object = GEExternalDynamicLoader::GetInstance().CreateGEXObjectByType(
485                 static_cast<uint32_t>(type),
486                 sizeof(Drawing::GEVariableRadiusBlurShaderFilterParams),
487                 static_cast<void*>(variableRadiusBlurParams.get()));
488             if (!object) {
489                 return std::make_shared<GEVariableRadiusBlurShaderFilter>(*variableRadiusBlurParams);
490             }
491             std::shared_ptr<GEVariableRadiusBlurShaderFilter> dmShader(
492                 static_cast<GEVariableRadiusBlurShaderFilter*>(object));
493             return dmShader;
494         }
495         default:
496             break;
497     }
498     return nullptr;
499 }
500 
GenerateShaderFilter(const std::shared_ptr<Drawing::GEVisualEffect> & vef)501 std::shared_ptr<GEShaderFilter> GERender::GenerateShaderFilter(
502     const std::shared_ptr<Drawing::GEVisualEffect>& vef)
503 {
504     auto ve = vef->GetImpl();
505     std::shared_ptr<GEShaderFilter> shaderFilter;
506     LOGD("GERender::GenerateShaderFilter %{public}d", (int)ve->GetFilterType());
507     switch (ve->GetFilterType()) {
508         case Drawing::GEVisualEffectImpl::FilterType::KAWASE_BLUR: {
509             const auto& kawaseParams = ve->GetKawaseParams();
510             shaderFilter = std::make_shared<GEKawaseBlurShaderFilter>(*kawaseParams);
511             break;
512         }
513         case Drawing::GEVisualEffectImpl::FilterType::MESA_BLUR: {
514             shaderFilter = GenerateExtShaderFilter(ve);
515             break;
516         }
517         case Drawing::GEVisualEffectImpl::FilterType::AIBAR: {
518             const auto& aiBarParams = ve->GetAIBarParams();
519             shaderFilter = std::make_shared<GEAIBarShaderFilter>(*aiBarParams);
520             break;
521         }
522         case Drawing::GEVisualEffectImpl::FilterType::COLOR_GRADIENT: {
523             const auto& colorGradientParams = ve->GetColorGradientParams();
524             shaderFilter = std::make_shared<GEColorGradientShaderFilter>(*colorGradientParams);
525             break;
526         }
527         case Drawing::GEVisualEffectImpl::FilterType::GREY: {
528             const auto& greyParams = ve->GetGreyParams();
529             shaderFilter = std::make_shared<GEGreyShaderFilter>(*greyParams);
530             break;
531         }
532         case Drawing::GEVisualEffectImpl::FilterType::LINEAR_GRADIENT_BLUR: {
533             shaderFilter = GenerateExtShaderFilter(ve);
534             break;
535         }
536         case Drawing::GEVisualEffectImpl::FilterType::MAGNIFIER: {
537             const auto& magnifierParams = ve->GetMagnifierParams();
538             shaderFilter = std::make_shared<GEMagnifierShaderFilter>(*magnifierParams);
539             break;
540         }
541         case Drawing::GEVisualEffectImpl::FilterType::WATER_RIPPLE: {
542             const auto& waterRippleParams = ve->GetWaterRippleParams();
543             shaderFilter = std::make_shared<GEWaterRippleFilter>(*waterRippleParams);
544             break;
545         }
546         case Drawing::GEVisualEffectImpl::FilterType::DISPLACEMENT_DISTORT_FILTER: {
547             const auto& displacementDistortParams = ve->GetDisplacementDistortParams();
548             shaderFilter = std::make_shared<GEDisplacementDistortFilter>(*displacementDistortParams);
549             break;
550         }
551         case Drawing::GEVisualEffectImpl::FilterType::SOUND_WAVE: {
552             const auto& soundWaveParams = ve->GetSoundWaveParams();
553             shaderFilter = std::make_shared<GESoundWaveFilter>(*soundWaveParams);
554             break;
555         }
556         case Drawing::GEVisualEffectImpl::FilterType::EDGE_LIGHT: {
557             shaderFilter = GenerateExtShaderFilter(ve);
558             break;
559         }
560         case Drawing::GEVisualEffectImpl::FilterType::BEZIER_WARP: {
561             const auto& bezierWarpParams = ve->GetBezierWarpParams();
562             shaderFilter = std::make_shared<GEBezierWarpShaderFilter>(*bezierWarpParams);
563             break;
564         }
565         case Drawing::GEVisualEffectImpl::FilterType::DISPERSION: {
566             shaderFilter = GenerateExtShaderFilter(ve);
567             break;
568         }
569         case Drawing::GEVisualEffectImpl::FilterType::CONTENT_LIGHT: {
570             const auto& contentLightParams = ve->GetContentLightParams();
571             shaderFilter = std::make_shared<GEContentLightFilter>(*contentLightParams);
572             break;
573         }
574         case Drawing::GEVisualEffectImpl::FilterType::DIRECTION_LIGHT: {
575             const auto& directionLightParams = ve->GetDirectionLightParams();
576             shaderFilter = std::make_shared<GEDirectionLightShaderFilter>(*directionLightParams);
577             break;
578         }
579         case Drawing::GEVisualEffectImpl::FilterType::MASK_TRANSITION: {
580             const auto& maskTransitionParams = ve->GetMaskTransitionParams();
581             shaderFilter = std::make_shared<GEMaskTransitionShaderFilter>(*maskTransitionParams);
582             break;
583         }
584         case Drawing::GEVisualEffectImpl::FilterType::VARIABLE_RADIUS_BLUR: {
585             shaderFilter = GenerateExtShaderFilter(ve);
586             break;
587         }
588         default:
589             break;
590     }
591     if (shaderFilter) {
592         shaderFilter->SetShaderFilterCanvasinfo(vef->GetCanvasInfo());
593         shaderFilter->SetSupportHeadroom(vef->GetSupportHeadroom());
594     }
595     return shaderFilter;
596 }
597 
GenerateShaderFilters(Drawing::GEVisualEffectContainer & veContainer)598 std::vector<std::shared_ptr<GEShaderFilter>> GERender::GenerateShaderFilters(
599     Drawing::GEVisualEffectContainer& veContainer)
600 {
601     LOGD("GERender::shaderFilters %{public}d", (int)veContainer.GetFilters().size());
602     std::vector<std::shared_ptr<GEShaderFilter>> shaderFilters;
603     for (auto vef : veContainer.GetFilters()) {
604         std::shared_ptr<GEShaderFilter> shaderFilter = GenerateShaderFilter(vef);
605         shaderFilters.push_back(shaderFilter);
606     }
607     return shaderFilters;
608 }
609 
DrawShaderEffect(Drawing::Canvas & canvas,Drawing::GEVisualEffectContainer & veContainer,const Drawing::Rect & bounds)610 void GERender::DrawShaderEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer,
611     const Drawing::Rect& bounds)
612 {
613     LOGD("GERender::DrawShaderEffect %{public}zu", veContainer.GetFilters().size());
614     for (auto vef : veContainer.GetFilters()) {
615         if (vef == nullptr) {
616             LOGD("GERender::DrawShaderEffect vef is null");
617             continue;
618         }
619         auto ve = vef->GetImpl();
620         std::shared_ptr<GEShader> geShaderEffect = GenerateShaderEffect(ve);
621         if (geShaderEffect == nullptr) {
622             LOGD("GERender::DrawShaderEffect shader is null");
623             continue;
624         }
625         geShaderEffect->SetCache(ve->GetCache());
626         geShaderEffect->DrawShader(canvas, bounds);
627         ve->SetCache(geShaderEffect->GetCache());
628     }
629 }
630 
GenerateShaderEffect(const std::shared_ptr<Drawing::GEVisualEffectImpl> & ve)631 std::shared_ptr<GEShader> GERender::GenerateShaderEffect(const std::shared_ptr<Drawing::GEVisualEffectImpl>& ve)
632 {
633     auto it = g_shaderCreatorLUT.find(ve->GetFilterType());
634     return it != g_shaderCreatorLUT.end() ? it->second(ve) : nullptr;
635 }
636 } // namespace GraphicsEffectEngine
637 } // namespace OHOS
638