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