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 "render/rs_magnifier_shader_filter.h"
16 
17 #include "platform/common/rs_log.h"
18 #include "src/core/SkOpts.h"
19 
20 namespace OHOS {
21 namespace Rosen {
22 namespace {
23 constexpr static float FLOAT_ZERO_THRESHOLD = 0.001f;
24 } // namespace
25 
RSMagnifierShaderFilter(const std::shared_ptr<RSMagnifierParams> & para)26 RSMagnifierShaderFilter::RSMagnifierShaderFilter(const std::shared_ptr<RSMagnifierParams>& para)
27     : magnifierPara_(para)
28 {
29     type_ = ShaderFilterType::MAGNIFIER;
30     hash_ = SkOpts::hash(&magnifierPara_, sizeof(magnifierPara_), hash_);
31 }
32 
33 RSMagnifierShaderFilter::~RSMagnifierShaderFilter() = default;
34 
GenerateGEVisualEffect(std::shared_ptr<Drawing::GEVisualEffectContainer> visualEffectContainer)35 void RSMagnifierShaderFilter::GenerateGEVisualEffect(
36     std::shared_ptr<Drawing::GEVisualEffectContainer> visualEffectContainer)
37 {
38     if (magnifierPara_ == nullptr || scaleX_ < FLOAT_ZERO_THRESHOLD || scaleY_ < FLOAT_ZERO_THRESHOLD) {
39         ROSEN_LOGD("RSMagnifierShaderFilter::GenerateGEVisualEffect magnifierPara_ is nullptr!");
40         return;
41     }
42 
43     auto magnifierFilter = std::make_shared<Drawing::GEVisualEffect>("MAGNIFIER", Drawing::DrawingPaintType::BRUSH);
44     if (magnifierFilter == nullptr) {
45         ROSEN_LOGD("RSMagnifierShaderFilter::GenerateGEVisualEffect magnifierFilter is nullptr!");
46         return;
47     }
48     magnifierFilter->SetParam("FACTOR", magnifierPara_->factor_);
49     magnifierFilter->SetParam("WIDTH", magnifierPara_->width_ * scaleX_);
50     magnifierFilter->SetParam("HEIGHT", magnifierPara_->height_ * scaleY_);
51     magnifierFilter->SetParam("CORNERRADIUS", magnifierPara_->cornerRadius_ * scaleY_);
52     magnifierFilter->SetParam("BORDERWIDTH", magnifierPara_->borderWidth_ * scaleY_);
53     magnifierFilter->SetParam("SHADOWOFFSETX", magnifierPara_->shadowOffsetX_ * scaleX_);
54     magnifierFilter->SetParam("SHADOWOFFSETY", magnifierPara_->shadowOffsetY_ * scaleY_);
55     magnifierFilter->SetParam("SHADOWSIZE", magnifierPara_->shadowSize_ * scaleY_);
56     magnifierFilter->SetParam("SHADOWSTRENGTH", magnifierPara_->shadowStrength_);
57     magnifierFilter->SetParam("GRADIENTMASKCOLOR1", magnifierPara_->gradientMaskColor1_);
58     magnifierFilter->SetParam("GRADIENTMASKCOLOR2", magnifierPara_->gradientMaskColor2_);
59     magnifierFilter->SetParam("OUTERCONTOURCOLOR1", magnifierPara_->outerContourColor1_);
60     magnifierFilter->SetParam("OUTERCONTOURCOLOR2", magnifierPara_->outerContourColor2_);
61     magnifierFilter->SetParam("ROTATEDEGREE", rotateDegree_);
62 
63     visualEffectContainer->AddToChainedFilter(magnifierFilter);
64 }
65 
SetMagnifierOffset(Drawing::Matrix & mat)66 void RSMagnifierShaderFilter::SetMagnifierOffset(Drawing::Matrix& mat)
67 {
68     if (!magnifierPara_) {
69         ROSEN_LOGD("RSMagnifierShaderFilter::SetMagnifierOffset magnifierPara_ is nullptr!");
70         return;
71     }
72 
73     // 1 and 3 represents index
74     if ((mat.Get(1) > FLOAT_ZERO_THRESHOLD) && (mat.Get(3) < (0 - FLOAT_ZERO_THRESHOLD))) {
75         rotateDegree_ = 90; // 90 represents rotate degree
76         scaleX_ = mat.Get(1);
77         scaleY_ = -mat.Get(3); // 3 represents index
78         offsetX_ = magnifierPara_->offsetY_ * scaleX_;
79         offsetY_ = -magnifierPara_->offsetX_ * scaleY_;
80     // 0 and 4 represents index
81     } else if ((mat.Get(0) < (0 - FLOAT_ZERO_THRESHOLD)) && (mat.Get(4) < (0 - FLOAT_ZERO_THRESHOLD))) {
82         rotateDegree_ = 180; // 180 represents rotate degree
83         scaleX_ = -mat.Get(0);
84         scaleY_ = -mat.Get(4); // 4 represents index
85         offsetX_ = -magnifierPara_->offsetX_ * scaleX_;
86         offsetY_ = -magnifierPara_->offsetY_ * scaleY_;
87     // 1 and 3 represents index
88     } else if ((mat.Get(1) < (0 - FLOAT_ZERO_THRESHOLD)) && (mat.Get(3) > FLOAT_ZERO_THRESHOLD)) {
89         rotateDegree_ = 270; // 270 represents rotate degree
90         scaleX_ = -mat.Get(1);
91         scaleY_ = mat.Get(3); // 3 represents index
92         offsetX_ = -magnifierPara_->offsetY_ * scaleX_;
93         offsetY_ = magnifierPara_->offsetX_ * scaleY_;
94     } else {
95         rotateDegree_ = 0;
96         scaleX_ = mat.Get(0);
97         scaleY_ = mat.Get(4); // 4 represents index
98         offsetX_ = magnifierPara_->offsetX_ * scaleX_;
99         offsetY_ = magnifierPara_->offsetY_ * scaleY_;
100     }
101 }
102 
103 } // namespace Rosen
104 } // namespace OHOS
105