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