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