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