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_grey_shader_filter.h"
19 #include "ge_kawase_blur_shader_filter.h"
20 #include "ge_mesa_blur_shader_filter.h"
21 #include "ge_linear_gradient_blur_shader_filter.h"
22 #include "ge_log.h"
23 #include "ge_magnifier_shader_filter.h"
24 #include "ge_visual_effect_impl.h"
25 #include "ge_water_ripple_filter.h"
26
27 namespace OHOS {
28 namespace GraphicsEffectEngine {
29
GERender()30 GERender::GERender() {}
31
~GERender()32 GERender::~GERender() {}
33
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)34 void GERender::DrawImageEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer,
35 const std::shared_ptr<Drawing::Image>& image, const Drawing::Rect& src, const Drawing::Rect& dst,
36 const Drawing::SamplingOptions& sampling)
37 {
38 if (!image) {
39 LOGE("GERender::DrawImageRect image is null");
40 return;
41 }
42
43 auto resImage = ApplyImageEffect(canvas, veContainer, image, src, dst, sampling);
44 Drawing::Brush brush;
45 canvas.AttachBrush(brush);
46 canvas.DrawImageRect(*resImage, src, dst, Drawing::SamplingOptions());
47 canvas.DetachBrush();
48 }
49
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)50 std::shared_ptr<Drawing::Image> GERender::ApplyImageEffect(Drawing::Canvas& canvas,
51 Drawing::GEVisualEffectContainer& veContainer, const std::shared_ptr<Drawing::Image>& image,
52 const Drawing::Rect& src, const Drawing::Rect& dst, const Drawing::SamplingOptions& sampling)
53 {
54 if (!image) {
55 LOGE("GERender::ApplyImageEffect image is null");
56 return nullptr;
57 }
58 std::vector<std::shared_ptr<GEShaderFilter>> geShaderFilters = GenerateShaderFilter(veContainer);
59 auto resImage = image;
60 for (auto geShaderFilter : geShaderFilters) {
61 if (geShaderFilter != nullptr) {
62 resImage = geShaderFilter->ProcessImage(canvas, resImage, src, dst);
63 } else {
64 LOGD("GERender::ApplyImageEffect filter is null");
65 }
66 }
67
68 return resImage;
69 }
70
GenerateShaderFilter(Drawing::GEVisualEffectContainer & veContainer)71 std::vector<std::shared_ptr<GEShaderFilter>> GERender::GenerateShaderFilter(
72 Drawing::GEVisualEffectContainer& veContainer)
73 {
74 LOGD("GERender::shaderFilters %{public}d", (int)veContainer.GetFilters().size());
75 std::vector<std::shared_ptr<GEShaderFilter>> shaderFilters;
76 for (auto vef : veContainer.GetFilters()) {
77 auto ve = vef->GetImpl();
78 std::shared_ptr<GEShaderFilter> shaderFilter;
79 LOGD("GERender::shaderFilters %{public}d", (int)ve->GetFilterType());
80 switch (ve->GetFilterType()) {
81 case Drawing::GEVisualEffectImpl::FilterType::KAWASE_BLUR: {
82 const auto& kawaseParams = ve->GetKawaseParams();
83 shaderFilter = std::make_shared<GEKawaseBlurShaderFilter>(*kawaseParams);
84 break;
85 }
86 case Drawing::GEVisualEffectImpl::FilterType::MESA_BLUR: {
87 const auto& mesaParams = ve->GetMESAParams();
88 shaderFilter = std::make_shared<GEMESABlurShaderFilter>(*mesaParams);
89 break;
90 }
91 case Drawing::GEVisualEffectImpl::FilterType::AIBAR: {
92 const auto& aiBarParams = ve->GetAIBarParams();
93 shaderFilter = std::make_shared<GEAIBarShaderFilter>(*aiBarParams);
94 break;
95 }
96 case Drawing::GEVisualEffectImpl::FilterType::GREY: {
97 const auto& greyParams = ve->GetGreyParams();
98 shaderFilter = std::make_shared<GEGreyShaderFilter>(*greyParams);
99 break;
100 }
101 case Drawing::GEVisualEffectImpl::FilterType::LINEAR_GRADIENT_BLUR: {
102 const auto& linearGradientBlurParams = ve->GetLinearGradientBlurParams();
103 shaderFilter = std::make_shared<GELinearGradientBlurShaderFilter>(*linearGradientBlurParams);
104 break;
105 }
106 case Drawing::GEVisualEffectImpl::FilterType::MAGNIFIER: {
107 const auto& magnifierParams = ve->GetMagnifierParams();
108 shaderFilter = std::make_shared<GEMagnifierShaderFilter>(*magnifierParams);
109 break;
110 }
111 case Drawing::GEVisualEffectImpl::FilterType::WATER_RIPPLE: {
112 const auto& waterRippleParams = ve->GetWaterRippleParams();
113 shaderFilter = std::make_shared<GEWaterRippleFilter>(*waterRippleParams);
114 break;
115 }
116 default:
117 break;
118 }
119 shaderFilters.push_back(shaderFilter);
120 }
121 return shaderFilters;
122 }
123
124 } // namespace GraphicsEffectEngine
125 } // namespace OHOS
126