1 /*
2 * Copyright (c) 2023 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 "core/interfaces/native/node/node_xcomponent_modifier.h"
16
17 #include "core/components_ng/base/frame_node.h"
18 #include "core/components_ng/pattern/xcomponent/xcomponent_model_ng.h"
19 #include "core/components_ng/pattern/xcomponent/xcomponent_pattern.h"
20 #include "core/pipeline/base/element_register.h"
21 #include "core/components_ng/base/view_abstract.h"
22 #include "frameworks/bridge/common/utils/utils.h"
23 #include "core/interfaces/native/node/node_api.h"
24
25 namespace OHOS::Ace::NG {
26 namespace {
27 const uint32_t ERROR_UINT_CODE = -1;
28 std::string g_strValue;
29
SetXComponentEnableAnalyzer(ArkUINodeHandle node,ArkUI_Bool enable)30 void SetXComponentEnableAnalyzer(ArkUINodeHandle node, ArkUI_Bool enable)
31 {
32 auto* frameNode = reinterpret_cast<FrameNode*>(node);
33 CHECK_NULL_VOID(frameNode);
34 XComponentModelNG::EnableAnalyzer(frameNode, enable);
35 }
36
ResetXComponentEnableAnalyzer(ArkUINodeHandle node)37 void ResetXComponentEnableAnalyzer(ArkUINodeHandle node)
38 {
39 auto* frameNode = reinterpret_cast<FrameNode*>(node);
40 CHECK_NULL_VOID(frameNode);
41 XComponentModelNG::EnableAnalyzer(frameNode, false);
42 }
43
SetXComponentBackgroundColor(ArkUINodeHandle node,uint32_t color)44 void SetXComponentBackgroundColor(ArkUINodeHandle node, uint32_t color)
45 {
46 auto *frameNode = reinterpret_cast<FrameNode *>(node);
47 CHECK_NULL_VOID(frameNode);
48 auto type = XComponentModelNG::GetType(frameNode);
49 if (!XComponentModel::IsBackGroundColorAvailable(type)) {
50 return;
51 }
52 ViewAbstract::SetBackgroundColor(frameNode, Color(color));
53 }
54
ResetXComponentBackgroundColor(ArkUINodeHandle node)55 void ResetXComponentBackgroundColor(ArkUINodeHandle node)
56 {
57 auto *frameNode = reinterpret_cast<FrameNode *>(node);
58 CHECK_NULL_VOID(frameNode);
59 auto type = XComponentModelNG::GetType(frameNode);
60 if (!XComponentModel::IsBackGroundColorAvailable(type)) {
61 return;
62 }
63 ViewAbstract::SetBackgroundColor(frameNode, (type == XComponentType::SURFACE) ? Color::BLACK : Color::TRANSPARENT);
64 }
65
SetXComponentOpacity(ArkUINodeHandle node,ArkUI_Float32 opacity)66 void SetXComponentOpacity(ArkUINodeHandle node, ArkUI_Float32 opacity)
67 {
68 auto *frameNode = reinterpret_cast<FrameNode *>(node);
69 CHECK_NULL_VOID(frameNode);
70 if (!XComponentModelNG::IsTexture(frameNode)) {
71 return;
72 }
73 if ((LessNotEqual(opacity, 0.0)) || opacity > 1) {
74 opacity = 1.0f;
75 }
76 ViewAbstract::SetOpacity(frameNode, opacity);
77 }
78
ResetXComponentOpacity(ArkUINodeHandle node)79 void ResetXComponentOpacity(ArkUINodeHandle node)
80 {
81 auto* frameNode = reinterpret_cast<FrameNode*>(node);
82 CHECK_NULL_VOID(frameNode);
83 if (!XComponentModelNG::IsTexture(frameNode)) {
84 return;
85 }
86 ViewAbstract::SetOpacity(frameNode, 1.0f);
87 }
88
SetXComponentId(ArkUINodeHandle node,const char * id)89 void SetXComponentId(ArkUINodeHandle node, const char* id)
90 {
91 auto* frameNode = reinterpret_cast<FrameNode*>(node);
92 CHECK_NULL_VOID(frameNode);
93 XComponentModelNG::SetXComponentId(frameNode, id);
94 }
95
SetXComponentType(ArkUINodeHandle node,uint32_t type)96 void SetXComponentType(ArkUINodeHandle node, uint32_t type)
97 {
98 auto* frameNode = reinterpret_cast<FrameNode*>(node);
99 CHECK_NULL_VOID(frameNode);
100 XComponentModelNG::SetXComponentType(frameNode, static_cast<XComponentType>(type));
101 }
102
SetXComponentSurfaceSize(ArkUINodeHandle node,uint32_t width,uint32_t height)103 void SetXComponentSurfaceSize(ArkUINodeHandle node, uint32_t width, uint32_t height)
104 {
105 auto* frameNode = reinterpret_cast<FrameNode*>(node);
106 CHECK_NULL_VOID(frameNode);
107 XComponentModelNG::SetXComponentSurfaceSize(frameNode, width, height);
108 }
109
GetXComponentId(ArkUINodeHandle node)110 ArkUI_CharPtr GetXComponentId(ArkUINodeHandle node)
111 {
112 auto *frameNode = reinterpret_cast<FrameNode *>(node);
113 CHECK_NULL_RETURN(frameNode, "");
114 g_strValue = XComponentModelNG::GetXComponentId(frameNode);
115 return g_strValue.c_str();
116 }
117
GetXComponentType(ArkUINodeHandle node)118 ArkUI_Int32 GetXComponentType(ArkUINodeHandle node)
119 {
120 auto *frameNode = reinterpret_cast<FrameNode *>(node);
121 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
122 return static_cast<ArkUI_Int32>(XComponentModelNG::GetXComponentType(frameNode));
123 }
124
GetXComponentSurfaceWidth(ArkUINodeHandle node)125 ArkUI_Uint32 GetXComponentSurfaceWidth(ArkUINodeHandle node)
126 {
127 auto *frameNode = reinterpret_cast<FrameNode *>(node);
128 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
129 return XComponentModelNG::GetXComponentSurfaceWidth(frameNode);
130 }
131
GetXComponentSurfaceHeight(ArkUINodeHandle node)132 ArkUI_Uint32 GetXComponentSurfaceHeight(ArkUINodeHandle node)
133 {
134 auto *frameNode = reinterpret_cast<FrameNode *>(node);
135 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
136 return XComponentModelNG::GetXComponentSurfaceHeight(frameNode);
137 }
138
GetNativeXComponent(ArkUINodeHandle node)139 void* GetNativeXComponent(ArkUINodeHandle node)
140 {
141 auto *frameNode = reinterpret_cast<FrameNode *>(node);
142 CHECK_NULL_RETURN(frameNode, nullptr);
143 auto xcPattern = frameNode->GetPattern<XComponentPattern>();
144 CHECK_NULL_RETURN(xcPattern, nullptr);
145 auto pair = xcPattern->GetNativeXComponent();
146 return reinterpret_cast<void*>(pair.second.lock().get());
147 }
148
SetXComponentLibraryname(ArkUINodeHandle node,const char * libraryname)149 void SetXComponentLibraryname(ArkUINodeHandle node, const char* libraryname)
150 {
151 auto* frameNode = reinterpret_cast<FrameNode*>(node);
152 CHECK_NULL_VOID(frameNode);
153 XComponentModelNG::SetXComponentLibraryname(frameNode, libraryname);
154 }
155
SetImageAIOptions(ArkUINodeHandle node,void * options)156 void SetImageAIOptions(ArkUINodeHandle node, void* options)
157 {
158 auto* frameNode = reinterpret_cast<FrameNode*>(node);
159 CHECK_NULL_VOID(frameNode);
160 XComponentModelNG::SetImageAIOptions(frameNode, options);
161 }
162
InitXComponent(ArkUINodeHandle node)163 void InitXComponent(ArkUINodeHandle node)
164 {
165 auto* frameNode = reinterpret_cast<FrameNode*>(node);
166 CHECK_NULL_VOID(frameNode);
167 XComponentModelNG::InitXComponent(frameNode);
168 }
169
SetXComponentEnableSecure(ArkUINodeHandle node,ArkUI_Bool enable)170 void SetXComponentEnableSecure(ArkUINodeHandle node, ArkUI_Bool enable)
171 {
172 auto* frameNode = reinterpret_cast<FrameNode*>(node);
173 CHECK_NULL_VOID(frameNode);
174 XComponentModelNG::EnableSecure(frameNode, enable);
175 }
176
ResetXComponentEnableSecure(ArkUINodeHandle node)177 void ResetXComponentEnableSecure(ArkUINodeHandle node)
178 {
179 auto* frameNode = reinterpret_cast<FrameNode*>(node);
180 CHECK_NULL_VOID(frameNode);
181 XComponentModelNG::EnableSecure(frameNode, false);
182 }
183
SetXComponentRenderFit(ArkUINodeHandle node,ArkUI_Int32 renderFitNumber)184 void SetXComponentRenderFit(ArkUINodeHandle node, ArkUI_Int32 renderFitNumber)
185 {
186 auto* frameNode = reinterpret_cast<FrameNode*>(node);
187 CHECK_NULL_VOID(frameNode);
188 auto renderFit = RenderFit::RESIZE_FILL;
189 if (renderFitNumber >= static_cast<int32_t>(RenderFit::CENTER) &&
190 renderFitNumber <= static_cast<int32_t>(RenderFit::RESIZE_COVER_BOTTOM_RIGHT)) {
191 renderFit = static_cast<RenderFit>(renderFitNumber);
192 }
193 auto type = XComponentModelNG::GetXComponentType(frameNode);
194 if (type == XComponentType::TEXTURE) {
195 ViewAbstract::SetRenderFit(frameNode, renderFit);
196 return;
197 }
198 XComponentModelNG::SetRenderFit(frameNode, renderFit);
199 }
200
ResetXComponentRenderFit(ArkUINodeHandle node)201 void ResetXComponentRenderFit(ArkUINodeHandle node)
202 {
203 auto* frameNode = reinterpret_cast<FrameNode*>(node);
204 CHECK_NULL_VOID(frameNode);
205 auto type = XComponentModelNG::GetXComponentType(frameNode);
206 if (type == XComponentType::TEXTURE) {
207 ViewAbstract::SetRenderFit(frameNode, RenderFit::RESIZE_FILL);
208 return;
209 }
210 XComponentModelNG::SetRenderFit(frameNode, RenderFit::RESIZE_FILL);
211 }
212 } // namespace
213
214 namespace NodeModifier {
GetXComponentModifier()215 const ArkUIXComponentModifier* GetXComponentModifier()
216 {
217 static const ArkUIXComponentModifier modifier = {
218 nullptr, // loadXComponent
219 nullptr, // setXComponentOptions
220 nullptr, // getXComponentSurfaceId
221 nullptr, // getXComponentController
222 SetXComponentEnableAnalyzer,
223 ResetXComponentEnableAnalyzer,
224 SetXComponentBackgroundColor,
225 ResetXComponentBackgroundColor,
226 SetXComponentOpacity,
227 ResetXComponentOpacity,
228 SetXComponentId,
229 SetXComponentType,
230 SetXComponentSurfaceSize,
231 GetXComponentId,
232 GetXComponentType,
233 GetXComponentSurfaceWidth,
234 GetXComponentSurfaceHeight,
235 GetNativeXComponent,
236 SetXComponentLibraryname,
237 SetImageAIOptions,
238 InitXComponent,
239 SetXComponentEnableSecure,
240 ResetXComponentEnableSecure,
241 SetXComponentRenderFit,
242 ResetXComponentRenderFit,
243 };
244
245 return &modifier;
246 }
247
GetCJUIXComponentModifier()248 const CJUIXComponentModifier* GetCJUIXComponentModifier()
249 {
250 static const CJUIXComponentModifier modifier = {
251 nullptr, // loadXComponent
252 nullptr, // setXComponentOptions
253 nullptr, // getXComponentSurfaceId
254 nullptr, // getXComponentController
255 SetXComponentBackgroundColor,
256 ResetXComponentBackgroundColor,
257 SetXComponentOpacity,
258 ResetXComponentOpacity,
259 SetXComponentId,
260 SetXComponentType,
261 SetXComponentSurfaceSize,
262 GetXComponentId,
263 GetXComponentType,
264 GetXComponentSurfaceWidth,
265 GetXComponentSurfaceHeight,
266 GetNativeXComponent,
267 SetXComponentLibraryname,
268 SetImageAIOptions,
269 };
270
271 return &modifier;
272 }
273 } // namespace NodeModifier
274 } // namespace OHOS::Ace::NG