• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 
16 #include "core/components_ng/render/render_context.h"
17 
18 #include "core/pipeline_ng/pipeline_context.h"
19 
20 namespace OHOS::Ace::NG {
21 namespace {
RenderFitToString(RenderFit renderFit)22 std::string RenderFitToString(RenderFit renderFit)
23 {
24     static const std::string RenderFitStyles[] = { "RenderFit.CENTER", "RenderFit.TOP", "RenderFit.BOTTOM",
25         "RenderFit.LEFT", "RenderFit.RIGHT", "RenderFit.TOP_LEFT", "RenderFit.TOP_RIGHT", "RenderFit.BOTTOM_LEFT",
26         "RenderFit.BOTTOM_RIGHT", "RenderFit.RESIZE_FILL", "RenderFit.RESIZE_CONTAIN",
27         "RenderFit.RESIZE_CONTAIN_TOP_LEFT", "RenderFit.RESIZE_CONTAIN_BOTTOM_RIGHT", "RenderFit.RESIZE_COVER",
28         "RenderFit.RESIZE_COVER_TOP_LEFT", "RenderFit.RESIZE_COVER_BOTTOM_RIGHT" };
29     return RenderFitStyles[static_cast<int>(renderFit)];
30 }
31 
UseEffectTypeToString(EffectType effectType)32 std::string UseEffectTypeToString(EffectType effectType)
33 {
34     static const std::string UseEffectTypeStyles[] = { "EffectType.DEFAULT", "EffectType.WINDOW_EFFECT" };
35     return UseEffectTypeStyles[static_cast<int>(effectType)];
36 }
37 
38 } // namespace
39 
SetRequestFrame(const std::function<void ()> & requestFrame)40 void RenderContext::SetRequestFrame(const std::function<void()>& requestFrame)
41 {
42     requestFrame_ = requestFrame;
43 }
44 
RequestNextFrame() const45 void RenderContext::RequestNextFrame() const
46 {
47     if (requestFrame_) {
48         requestFrame_();
49         auto node = GetHost();
50         CHECK_NULL_VOID(node);
51         auto eventHub = node->GetEventHub<NG::EventHub>();
52         if (node->GetInspectorId().has_value() || (eventHub && eventHub->HasNDKDrawCompletedCallback())) {
53             auto pipeline = AceType::DynamicCast<PipelineContext>(PipelineBase::GetCurrentContext());
54             CHECK_NULL_VOID(pipeline);
55             pipeline->SetNeedRenderNode(WeakPtr<FrameNode>(node));
56         }
57     }
58 }
59 
SetHostNode(const WeakPtr<FrameNode> & host)60 void RenderContext::SetHostNode(const WeakPtr<FrameNode>& host)
61 {
62     host_ = host;
63 }
64 
GetHost() const65 RefPtr<FrameNode> RenderContext::GetHost() const
66 {
67     return host_.Upgrade();
68 }
69 
GetUnsafeHost() const70 FrameNode* RenderContext::GetUnsafeHost() const
71 {
72     return UnsafeRawPtr(host_);
73 }
74 
SetSharedTransitionOptions(const std::shared_ptr<SharedTransitionOption> & option)75 void RenderContext::SetSharedTransitionOptions(const std::shared_ptr<SharedTransitionOption>& option)
76 {
77     sharedTransitionOption_ = option;
78 }
79 
GetSharedTransitionOption() const80 const std::shared_ptr<SharedTransitionOption>& RenderContext::GetSharedTransitionOption() const
81 {
82     return sharedTransitionOption_;
83 }
84 
SetShareId(const ShareId & shareId)85 void RenderContext::SetShareId(const ShareId& shareId)
86 {
87     shareId_ = shareId;
88 }
89 
GetShareId() const90 const ShareId& RenderContext::GetShareId() const
91 {
92     return shareId_;
93 }
94 
HasSharedTransition() const95 bool RenderContext::HasSharedTransition() const
96 {
97     return !shareId_.empty();
98 }
99 
HasSharedTransitionOption() const100 bool RenderContext::HasSharedTransitionOption() const
101 {
102     return sharedTransitionOption_ != nullptr;
103 }
104 
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter) const105 void RenderContext::ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const
106 {
107     ACE_PROPERTY_TO_JSON_VALUE(propBorder_, BorderProperty);
108     ACE_PROPERTY_TO_JSON_VALUE(propOuterBorder_, OuterBorderProperty);
109     ACE_PROPERTY_TO_JSON_VALUE(propPointLight_, PointLightProperty);
110     ACE_PROPERTY_TO_JSON_VALUE(propBdImage_, BorderImageProperty);
111     ACE_PROPERTY_TO_JSON_VALUE(propOverlay_, OverlayProperty);
112     ACE_PROPERTY_TO_JSON_VALUE(propPositionProperty_, RenderPositionProperty);
113     ACE_PROPERTY_TO_JSON_VALUE(propBackground_, BackgroundProperty);
114     ACE_PROPERTY_TO_JSON_VALUE(propForeground_, ForegroundProperty);
115     ACE_PROPERTY_TO_JSON_VALUE(propGraphics_, GraphicsProperty);
116     ACE_PROPERTY_TO_JSON_VALUE(propGradient_, GradientProperty);
117     ACE_PROPERTY_TO_JSON_VALUE(propTransform_, TransformProperty);
118     ACE_PROPERTY_TO_JSON_VALUE(propClip_, ClipProperty);
119     ACE_PROPERTY_TO_JSON_VALUE(GetBackBlurStyle(), BlurStyleOption);
120     ACE_PROPERTY_TO_JSON_VALUE(GetBackgroundEffect(), EffectOption);
121     if (filter.IsFastFilter()) {
122         ObscuredToJsonValue(json, filter);
123         return;
124     }
125     if (propTransformMatrix_.has_value()) {
126         auto jsonValue = JsonUtil::Create(true);
127         jsonValue->Put("type", "matrix");
128         auto matrixString = propTransformMatrix_->ToString();
129         while (matrixString.find("\n") != std::string::npos) {
130             auto num = matrixString.find("\n");
131             matrixString.replace(num, 1, "");
132         }
133         jsonValue->Put("matrix", matrixString.c_str());
134         json->PutExtAttr("transform", jsonValue, filter);
135     } else {
136         json->PutExtAttr("transform", JsonUtil::Create(true), filter);
137     }
138     json->PutExtAttr("backgroundColor",
139         propBackgroundColor_.value_or(Color::TRANSPARENT).ColorToString().c_str(), filter);
140     json->PutExtAttr("zIndex", propZIndex_.value_or(0), filter);
141     json->PutExtAttr("opacity", propOpacity_.value_or(1), filter);
142     if (propProgressMask_.has_value() && propProgressMask_.value()) {
143         json->PutExtAttr("total", propProgressMask_.value()->GetMaxValue(), filter);
144         json->PutExtAttr("updateProgress", propProgressMask_.value()->GetValue(), filter);
145         json->PutExtAttr("updateColor", propProgressMask_.value()->GetColor().ColorToString().c_str(), filter);
146         json->PutExtAttr("enableBreathe", propProgressMask_.value()->GetEnableBreathe(), filter);
147     }
148     json->PutExtAttr("lightUpEffect", propLightUpEffect_.value_or(0.0), filter);
149     json->PutExtAttr("sphericalEffect", propSphericalEffect_.value_or(0.0), filter);
150     auto pixStretchEffectOption = propPixelStretchEffect_.value_or(PixStretchEffectOption());
151     auto pixelJsonValue = JsonUtil::Create(true);
152     pixelJsonValue->Put("left", pixStretchEffectOption.left.ToString().c_str());
153     pixelJsonValue->Put("right", pixStretchEffectOption.right.ToString().c_str());
154     pixelJsonValue->Put("top", pixStretchEffectOption.top.ToString().c_str());
155     pixelJsonValue->Put("bottom", pixStretchEffectOption.bottom.ToString().c_str());
156     json->PutExtAttr("pixelStretchEffect", pixelJsonValue, filter);
157     json->PutExtAttr("foregroundColor",
158         propForegroundColor_.value_or(Color::FOREGROUND).ColorToString().c_str(), filter);
159     if (propClickEffectLevel_.has_value()) {
160         auto clickEffectJsonValue = JsonUtil::Create(true);
161         clickEffectJsonValue->Put("level", std::to_string((int)propClickEffectLevel_.value().level).c_str());
162         clickEffectJsonValue->Put("scale", std::to_string((float)propClickEffectLevel_.value().scaleNumber).c_str());
163         json->PutExtAttr("clickEffect", clickEffectJsonValue, filter);
164     }
165     ObscuredToJsonValue(json, filter);
166     json->PutExtAttr("renderGroup", propRenderGroup_.value_or(false) ? "true" : "false", filter);
167     json->PutExtAttr("renderFit", RenderFitToString(propRenderFit_.value_or(RenderFit::TOP_LEFT)).c_str(), filter);
168     json->PutExtAttr("useShadowBatching", propUseShadowBatching_.value_or(false) ? "true" : "false", filter);
169     json->PutExtAttr("useEffect", propUseEffect_.value_or(false) ? "true" : "false", filter);
170     json->PutExtAttr("useEffectType",
171         UseEffectTypeToString(propUseEffectType_.value_or(EffectType::DEFAULT)).c_str(), filter);
172 }
173 
ObscuredToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter) const174 void RenderContext::ObscuredToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const
175 {
176     /* no fixed attr below, just return */
177     if (filter.IsFastFilter()) {
178         return;
179     }
180     auto jsonObscuredArray = JsonUtil::CreateArray(true);
181     std::vector<ObscuredReasons> obscuredReasons = propObscured_.value_or(std::vector<ObscuredReasons>());
182     for (size_t i = 0; i < obscuredReasons.size(); i++) {
183         auto index = std::to_string(i);
184         auto value = std::to_string(static_cast<int32_t>(obscuredReasons[i]));
185         jsonObscuredArray->Put(index.c_str(), value.c_str());
186     }
187     json->PutExtAttr("obscured", jsonObscuredArray, filter);
188 }
189 
FromJson(const std::unique_ptr<JsonValue> & json)190 void RenderContext::FromJson(const std::unique_ptr<JsonValue>& json)
191 {
192     auto borderRadius = json->GetValue("borderRadius");
193     BorderRadiusProperty brp;
194     brp.radiusTopLeft = Dimension::FromString(borderRadius->GetString("topLeft"));
195     brp.radiusTopRight = Dimension::FromString(borderRadius->GetString("topRight"));
196     brp.radiusBottomLeft = Dimension::FromString(borderRadius->GetString("bottomLeft"));
197     brp.radiusBottomRight = Dimension::FromString(borderRadius->GetString("bottomRight"));
198     UpdateBorderRadius(brp);
199     UpdateBackgroundColor(Color::ColorFromString(json->GetString("backgroundColor")));
200     auto clip = json->GetString("clip");
201     if (clip == "true" || clip == "false") {
202         UpdateClipEdge(clip == "true" ? true : false);
203     } else {
204         LOGE("UITree |ERROR| invalid clip=%{public}s", clip.c_str());
205     }
206 }
207 } // namespace OHOS::Ace::NG
208