• 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/components_ng/base/frame_node.h"
19 #include "core/components_ng/property/property.h"
20 #include "core/pipeline_ng/pipeline_context.h"
21 
22 namespace OHOS::Ace::NG {
23 namespace {
RenderFitToString(RenderFit renderFit)24 std::string RenderFitToString(RenderFit renderFit)
25 {
26     static const std::string RenderFitStyles[] = { "RenderFit.CENTER", "RenderFit.TOP", "RenderFit.BOTTOM",
27         "RenderFit.LEFT", "RenderFit.RIGHT", "RenderFit.TOP_LEFT", "RenderFit.TOP_RIGHT", "RenderFit.BOTTOM_LEFT",
28         "RenderFit.BOTTOM_RIGHT", "RenderFit.RESIZE_FILL", "RenderFit.RESIZE_CONTAIN",
29         "RenderFit.RESIZE_CONTAIN_TOP_LEFT", "RenderFit.RESIZE_CONTAIN_BOTTOM_RIGHT", "RenderFit.RESIZE_COVER",
30         "RenderFit.RESIZE_COVER_TOP_LEFT", "RenderFit.RESIZE_COVER_BOTTOM_RIGHT" };
31     return RenderFitStyles[static_cast<int>(renderFit)];
32 }
33 } // namespace
34 
SetRequestFrame(const std::function<void ()> & requestFrame)35 void RenderContext::SetRequestFrame(const std::function<void()>& requestFrame)
36 {
37     requestFrame_ = requestFrame;
38 }
39 
RequestNextFrame() const40 void RenderContext::RequestNextFrame() const
41 {
42     if (requestFrame_) {
43         requestFrame_();
44         auto node = GetHost();
45         CHECK_NULL_VOID(node);
46         if (node->GetInspectorId().has_value()) {
47             auto pipeline = AceType::DynamicCast<PipelineContext>(PipelineBase::GetCurrentContext());
48             CHECK_NULL_VOID(pipeline);
49             pipeline->SetNeedRenderNode(node);
50         }
51     }
52 }
53 
SetHostNode(const WeakPtr<FrameNode> & host)54 void RenderContext::SetHostNode(const WeakPtr<FrameNode>& host)
55 {
56     host_ = host;
57 }
58 
GetHost() const59 RefPtr<FrameNode> RenderContext::GetHost() const
60 {
61     return host_.Upgrade();
62 }
63 
SetSharedTransitionOptions(const std::shared_ptr<SharedTransitionOption> & option)64 void RenderContext::SetSharedTransitionOptions(const std::shared_ptr<SharedTransitionOption>& option)
65 {
66     sharedTransitionOption_ = option;
67 }
68 
GetSharedTransitionOption() const69 const std::shared_ptr<SharedTransitionOption>& RenderContext::GetSharedTransitionOption() const
70 {
71     return sharedTransitionOption_;
72 }
73 
SetShareId(const ShareId & shareId)74 void RenderContext::SetShareId(const ShareId& shareId)
75 {
76     shareId_ = shareId;
77 }
78 
GetShareId() const79 const ShareId& RenderContext::GetShareId() const
80 {
81     return shareId_;
82 }
83 
HasSharedTransition() const84 bool RenderContext::HasSharedTransition() const
85 {
86     return !shareId_.empty();
87 }
88 
HasSharedTransitionOption() const89 bool RenderContext::HasSharedTransitionOption() const
90 {
91     return sharedTransitionOption_ != nullptr;
92 }
93 
ToJsonValue(std::unique_ptr<JsonValue> & json) const94 void RenderContext::ToJsonValue(std::unique_ptr<JsonValue>& json) const
95 {
96     ACE_PROPERTY_TO_JSON_VALUE(propBorder_, BorderProperty);
97     ACE_PROPERTY_TO_JSON_VALUE(propOuterBorder_, OuterBorderProperty);
98     ACE_PROPERTY_TO_JSON_VALUE(propPointLight_, PointLightProperty);
99     ACE_PROPERTY_TO_JSON_VALUE(propBdImage_, BorderImageProperty);
100     ACE_PROPERTY_TO_JSON_VALUE(propOverlay_, OverlayProperty);
101     ACE_PROPERTY_TO_JSON_VALUE(propPositionProperty_, RenderPositionProperty);
102     ACE_PROPERTY_TO_JSON_VALUE(propBackground_, BackgroundProperty);
103     ACE_PROPERTY_TO_JSON_VALUE(propForeground_, ForegroundProperty);
104     ACE_PROPERTY_TO_JSON_VALUE(propGraphics_, GraphicsProperty);
105     ACE_PROPERTY_TO_JSON_VALUE(propGradient_, GradientProperty);
106     ACE_PROPERTY_TO_JSON_VALUE(propTransform_, TransformProperty);
107     ACE_PROPERTY_TO_JSON_VALUE(propClip_, ClipProperty);
108     ACE_PROPERTY_TO_JSON_VALUE(GetBackBlurStyle(), BlurStyleOption);
109     ACE_PROPERTY_TO_JSON_VALUE(GetBackgroundEffect(), EffectOption);
110     if (propTransformMatrix_.has_value()) {
111         auto jsonValue = JsonUtil::Create(true);
112         jsonValue->Put("type", "matrix");
113         auto matrixString = propTransformMatrix_->ToString();
114         while (matrixString.find("\n") != std::string::npos) {
115             auto num = matrixString.find("\n");
116             matrixString.replace(num, 1, "");
117         }
118         jsonValue->Put("matrix", matrixString.c_str());
119         json->Put("transform", jsonValue);
120     } else {
121         json->Put("transform", JsonUtil::Create(true));
122     }
123     json->Put("backgroundColor", propBackgroundColor_.value_or(Color::TRANSPARENT).ColorToString().c_str());
124     json->Put("zIndex", propZIndex_.value_or(0));
125     json->Put("opacity", propOpacity_.value_or(1));
126     if (propProgressMask_.has_value() && propProgressMask_.value()) {
127         json->Put("total", propProgressMask_.value()->GetMaxValue());
128         json->Put("updateProgress", propProgressMask_.value()->GetValue());
129         json->Put("updateColor", propProgressMask_.value()->GetColor().ColorToString().c_str());
130     }
131     json->Put("lightUpEffect", propLightUpEffect_.value_or(0.0));
132     json->Put("sphericalEffect", propSphericalEffect_.value_or(0.0));
133     auto pixStretchEffectOption = propPixelStretchEffect_.value_or(PixStretchEffectOption());
134     auto pixelJsonValue = JsonUtil::Create(true);
135     pixelJsonValue->Put("left", pixStretchEffectOption.left.ToString().c_str());
136     pixelJsonValue->Put("right", pixStretchEffectOption.right.ToString().c_str());
137     pixelJsonValue->Put("top", pixStretchEffectOption.top.ToString().c_str());
138     pixelJsonValue->Put("bottom", pixStretchEffectOption.bottom.ToString().c_str());
139     json->Put("pixelStretchEffect", pixelJsonValue);
140     json->Put("foregroundColor", propForegroundColor_.value_or(Color::FOREGROUND).ColorToString().c_str());
141     if (propClickEffectLevel_.has_value()) {
142         auto clickEffectJsonValue = JsonUtil::Create(true);
143         clickEffectJsonValue->Put("level", std::to_string((int)propClickEffectLevel_.value().level).c_str());
144         clickEffectJsonValue->Put("scale", std::to_string((float)propClickEffectLevel_.value().scaleNumber).c_str());
145         json->Put("clickEffect", clickEffectJsonValue);
146     }
147     ObscuredToJsonValue(json);
148     json->Put("renderGroup", propRenderGroup_.value_or(false) ? "true" : "false");
149     json->Put("renderFit", RenderFitToString(propRenderFit_.value_or(RenderFit::TOP_LEFT)).c_str());
150     json->Put("useShadowBatching", propUseShadowBatching_.value_or(false) ? "true" : "false");
151 }
152 
ObscuredToJsonValue(std::unique_ptr<JsonValue> & json) const153 void RenderContext::ObscuredToJsonValue(std::unique_ptr<JsonValue>& json) const
154 {
155     auto jsonObscuredArray = JsonUtil::CreateArray(true);
156     std::vector<ObscuredReasons> obscuredReasons = propObscured_.value_or(std::vector<ObscuredReasons>());
157     for (size_t i = 0; i < obscuredReasons.size(); i++) {
158         auto index = std::to_string(i);
159         auto value = std::to_string(static_cast<int32_t>(obscuredReasons[i]));
160         jsonObscuredArray->Put(index.c_str(), value.c_str());
161     }
162     json->Put("obscured", jsonObscuredArray);
163 }
164 
FromJson(const std::unique_ptr<JsonValue> & json)165 void RenderContext::FromJson(const std::unique_ptr<JsonValue>& json)
166 {
167     auto borderRadius = json->GetValue("borderRadius");
168     BorderRadiusProperty brp;
169     brp.radiusTopLeft = Dimension::FromString(borderRadius->GetString("topLeft"));
170     brp.radiusTopRight = Dimension::FromString(borderRadius->GetString("topRight"));
171     brp.radiusBottomLeft = Dimension::FromString(borderRadius->GetString("bottomLeft"));
172     brp.radiusBottomRight = Dimension::FromString(borderRadius->GetString("bottomRight"));
173     UpdateBorderRadius(brp);
174     UpdateBackgroundColor(Color::ColorFromString(json->GetString("backgroundColor")));
175     auto clip = json->GetString("clip");
176     if (clip == "true" || clip == "false") {
177         UpdateClipEdge(clip == "true" ? true : false);
178     } else {
179         LOGE("UITree |ERROR| invalid clip=%{public}s", clip.c_str());
180     }
181 }
182 } // namespace OHOS::Ace::NG
183