1 /*
2 * Copyright (c) 2022-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
16 #include "core/components_ng/pattern/xcomponent/xcomponent_model_ng.h"
17
18 #include "base/utils/utils.h"
19 #include "core/components_ng/pattern/xcomponent/xcomponent_pattern.h"
20 #include "core/components_ng/pattern/xcomponent/xcomponent_pattern_v2.h"
21 #include "base/display_manager/display_manager.h"
22
23 namespace OHOS::Ace::NG {
24 const uint32_t DEFAULT_SURFACE_SIZE = 0;
Create(XComponentType type)25 void XComponentModelNG::Create(XComponentType type)
26 {
27 auto* stack = ViewStackProcessor::GetInstance();
28 auto nodeId = stack->ClaimNodeId();
29 ACE_LAYOUT_SCOPED_TRACE("Create[%sNative][self:%d]", V2::XCOMPONENT_ETS_TAG, nodeId);
30 auto frameNode = FrameNode::GetOrCreateFrameNode(V2::XCOMPONENT_ETS_TAG, nodeId,
31 [type]() { return AceType::MakeRefPtr<XComponentPatternV2>(type, XComponentNodeType::DECLARATIVE_NODE); });
32 stack->Push(frameNode);
33 ACE_UPDATE_LAYOUT_PROPERTY(XComponentLayoutProperty, XComponentType, type);
34 }
35
Create(const std::optional<std::string> & id,XComponentType type,const std::optional<std::string> & libraryname,const std::shared_ptr<InnerXComponentController> & xcomponentController)36 void XComponentModelNG::Create(const std::optional<std::string>& id, XComponentType type,
37 const std::optional<std::string>& libraryname,
38 const std::shared_ptr<InnerXComponentController>& xcomponentController)
39 {
40 auto* stack = ViewStackProcessor::GetInstance();
41 auto nodeId = stack->ClaimNodeId();
42 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::XCOMPONENT_ETS_TAG, nodeId);
43 auto frameNode = FrameNode::GetOrCreateFrameNode(
44 V2::XCOMPONENT_ETS_TAG, nodeId, [id, type, libraryname, xcomponentController]() {
45 return AceType::MakeRefPtr<XComponentPattern>(id, type, libraryname, xcomponentController);
46 });
47 stack->Push(frameNode);
48 ACE_UPDATE_LAYOUT_PROPERTY(XComponentLayoutProperty, XComponentType, type);
49 }
50
Create(int32_t nodeId,float width,float height,const std::string & id,XComponentType type,const std::string & libraryname,const std::shared_ptr<InnerXComponentController> & xcomponentController)51 RefPtr<AceType> XComponentModelNG::Create(int32_t nodeId, float width, float height, const std::string& id,
52 XComponentType type, const std::string& libraryname,
53 const std::shared_ptr<InnerXComponentController>& xcomponentController)
54 {
55 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::XCOMPONENT_ETS_TAG, nodeId);
56 auto calcWidth = CalcLength(width, DimensionUnit::VP);
57 auto calcHeight = CalcLength(height, DimensionUnit::VP);
58 auto frameNode = FrameNode::GetOrCreateFrameNode(
59 V2::XCOMPONENT_ETS_TAG, nodeId, [id, type, libraryname, xcomponentController, calcWidth, calcHeight]() {
60 return AceType::MakeRefPtr<XComponentPattern>(id, type, libraryname, xcomponentController,
61 calcWidth.GetDimension().ConvertToPx(), calcHeight.GetDimension().ConvertToPx());
62 });
63
64 CHECK_NULL_RETURN(frameNode, nullptr);
65 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
66 CHECK_NULL_RETURN(layoutProperty, frameNode);
67 layoutProperty->UpdateXComponentType(type);
68 layoutProperty->UpdateUserDefinedIdealSize(CalcSize(calcWidth, calcHeight));
69 return frameNode;
70 }
71
InitXComponent(FrameNode * frameNode)72 void XComponentModelNG::InitXComponent(FrameNode* frameNode)
73 {
74 CHECK_NULL_VOID(frameNode);
75 auto node = AceType::Claim(frameNode);
76 auto type = GetTypeImpl(node);
77 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
78 return;
79 }
80 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
81 CHECK_NULL_VOID(xcPattern);
82 xcPattern->InitXComponent();
83 }
84
GetLibraryName()85 std::optional<std::string> XComponentModelNG::GetLibraryName()
86 {
87 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
88 CHECK_NULL_RETURN(frameNode, std::nullopt);
89 auto type = GetTypeImpl(frameNode);
90 CHECK_EQUAL_RETURN(type, XComponentType::COMPONENT, std::nullopt);
91 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
92 CHECK_NULL_RETURN(xcPattern, std::nullopt);
93 return xcPattern->GetLibraryName();
94 }
95
GetTypeImpl(const RefPtr<FrameNode> & frameNode)96 XComponentType XComponentModelNG::GetTypeImpl(const RefPtr<FrameNode>& frameNode)
97 {
98 CHECK_NULL_RETURN(frameNode, XComponentType::UNKNOWN);
99 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
100 CHECK_NULL_RETURN(layoutProperty, XComponentType::UNKNOWN);
101 return layoutProperty->GetXComponentTypeValue();
102 }
103
GetType()104 XComponentType XComponentModelNG::GetType()
105 {
106 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
107 return GetTypeImpl(frameNode);
108 }
109
SetSoPath(const std::string & soPath)110 void XComponentModelNG::SetSoPath(const std::string& soPath)
111 {
112 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
113 CHECK_NULL_VOID(frameNode);
114 auto type = GetTypeImpl(frameNode);
115 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
116 return;
117 }
118 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
119 CHECK_NULL_VOID(xcPattern);
120 xcPattern->SetSoPath(soPath);
121 }
122
SetOnLoad(LoadEvent && onLoad)123 void XComponentModelNG::SetOnLoad(LoadEvent&& onLoad)
124 {
125 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
126 CHECK_NULL_VOID(frameNode);
127 auto type = GetTypeImpl(frameNode);
128 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
129 return;
130 }
131 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
132 CHECK_NULL_VOID(eventHub);
133 eventHub->SetOnLoad(std::move(onLoad));
134 }
135
SetOnLoad(FrameNode * frameNode,LoadEvent && onLoad)136 void XComponentModelNG::SetOnLoad(FrameNode* frameNode, LoadEvent&& onLoad)
137 {
138 CHECK_NULL_VOID(frameNode);
139 auto node = AceType::Claim(frameNode);
140 auto type = GetTypeImpl(node);
141 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
142 return;
143 }
144 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
145 CHECK_NULL_VOID(xcPattern);
146 if (xcPattern->NeedTriggerLoadEventImmediately()) {
147 CHECK_NULL_VOID(onLoad);
148 onLoad(xcPattern->GetId());
149 return;
150 }
151 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
152 CHECK_NULL_VOID(eventHub);
153 eventHub->SetOnLoad(std::move(onLoad));
154 }
155
SetOnDestroy(DestroyEvent && onDestroy)156 void XComponentModelNG::SetOnDestroy(DestroyEvent&& onDestroy)
157 {
158 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
159 CHECK_NULL_VOID(frameNode);
160 auto type = GetTypeImpl(frameNode);
161 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
162 return;
163 }
164 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
165 CHECK_NULL_VOID(eventHub);
166 eventHub->SetOnDestroy(std::move(onDestroy));
167 }
168
SetOnDestroy(FrameNode * frameNode,DestroyEvent && onDestroy)169 void XComponentModelNG::SetOnDestroy(FrameNode* frameNode, DestroyEvent&& onDestroy)
170 {
171 CHECK_NULL_VOID(frameNode);
172 auto node = AceType::Claim(frameNode);
173 auto type = GetTypeImpl(node);
174 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
175 return;
176 }
177 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
178 CHECK_NULL_VOID(eventHub);
179 eventHub->SetOnDestroy(std::move(onDestroy));
180 }
181
RegisterOnCreate(const RefPtr<AceType> & node,LoadEvent && onLoad)182 void XComponentModelNG::RegisterOnCreate(const RefPtr<AceType>& node, LoadEvent&& onLoad)
183 {
184 auto frameNode = AceType::DynamicCast<NG::FrameNode>(node);
185 CHECK_NULL_VOID(frameNode);
186 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
187 if (!layoutProperty || layoutProperty->GetXComponentTypeValue() == XComponentType::COMPONENT) {
188 return;
189 }
190 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
191 CHECK_NULL_VOID(eventHub);
192 eventHub->SetOnLoad(std::move(onLoad));
193 }
194
RegisterOnDestroy(const RefPtr<AceType> & node,DestroyEvent && onDestroy)195 void XComponentModelNG::RegisterOnDestroy(const RefPtr<AceType>& node, DestroyEvent&& onDestroy)
196 {
197 auto frameNode = AceType::DynamicCast<NG::FrameNode>(node);
198 CHECK_NULL_VOID(frameNode);
199 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
200 if (!layoutProperty || layoutProperty->GetXComponentTypeValue() == XComponentType::COMPONENT) {
201 return;
202 }
203 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
204 CHECK_NULL_VOID(eventHub);
205 eventHub->SetOnDestroy(std::move(onDestroy));
206 }
207
IsTexture()208 bool XComponentModelNG::IsTexture()
209 {
210 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
211 CHECK_NULL_RETURN(frameNode, false);
212 return GetTypeImpl(frameNode) == XComponentType::TEXTURE;
213 }
214
SetDetachCallback(DetachCallback && onDetach)215 void XComponentModelNG::SetDetachCallback(DetachCallback&& onDetach)
216 {
217 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
218 CHECK_NULL_VOID(frameNode);
219 auto type = GetTypeImpl(frameNode);
220 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
221 return;
222 }
223 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
224 CHECK_NULL_VOID(eventHub);
225 eventHub->SetDetachEvent(std::move(onDetach));
226 }
227
SetControllerOnCreated(SurfaceCreatedEvent && onCreated)228 void XComponentModelNG::SetControllerOnCreated(SurfaceCreatedEvent&& onCreated)
229 {
230 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
231 CHECK_NULL_VOID(frameNode);
232 auto type = GetTypeImpl(frameNode);
233 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
234 return;
235 }
236 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
237 CHECK_NULL_VOID(eventHub);
238 eventHub->SetControllerCreatedEvent(std::move(onCreated));
239 }
240
SetControllerOnChanged(SurfaceChangedEvent && onChanged)241 void XComponentModelNG::SetControllerOnChanged(SurfaceChangedEvent&& onChanged)
242 {
243 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
244 CHECK_NULL_VOID(frameNode);
245 auto type = GetTypeImpl(frameNode);
246 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
247 return;
248 }
249 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
250 CHECK_NULL_VOID(eventHub);
251 eventHub->SetControllerChangedEvent(std::move(onChanged));
252 }
253
SetControllerOnDestroyed(SurfaceDestroyedEvent && onDestroyed)254 void XComponentModelNG::SetControllerOnDestroyed(SurfaceDestroyedEvent&& onDestroyed)
255 {
256 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
257 CHECK_NULL_VOID(frameNode);
258 auto type = GetTypeImpl(frameNode);
259 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
260 return;
261 }
262 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
263 CHECK_NULL_VOID(eventHub);
264 eventHub->SetControllerDestroyedEvent(std::move(onDestroyed));
265 }
266
SetRenderFit(RenderFit renderFit)267 void XComponentModelNG::SetRenderFit(RenderFit renderFit)
268 {
269 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
270 CHECK_NULL_VOID(frameNode);
271 auto type = GetTypeImpl(frameNode);
272 if (type != XComponentType::SURFACE) {
273 return;
274 }
275 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
276 CHECK_NULL_VOID(xcPattern);
277 xcPattern->SetRenderFit(renderFit);
278 }
279
EnableSecure(bool isSecure)280 void XComponentModelNG::EnableSecure(bool isSecure)
281 {
282 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
283 CHECK_NULL_VOID(frameNode);
284 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
285 CHECK_NULL_VOID(xcPattern);
286 xcPattern->EnableSecure(isSecure);
287 }
288
HdrBrightness(float hdrBrightness)289 void XComponentModelNG::HdrBrightness(float hdrBrightness)
290 {
291 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
292 CHECK_NULL_VOID(frameNode);
293 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
294 CHECK_NULL_VOID(xcPattern);
295 xcPattern->HdrBrightness(hdrBrightness);
296 }
297
EnableTransparentLayer(bool isTransparentLayer)298 void XComponentModelNG::EnableTransparentLayer(bool isTransparentLayer)
299 {
300 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
301 CHECK_NULL_VOID(frameNode);
302 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
303 CHECK_NULL_VOID(xcPattern);
304 xcPattern->EnableTransparentLayer(isTransparentLayer);
305 }
306
SetScreenId(uint64_t screenId)307 void XComponentModelNG::SetScreenId(uint64_t screenId)
308 {
309 auto* frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
310 SetScreenId(frameNode, screenId);
311 }
312
IsTexture(FrameNode * frameNode)313 bool XComponentModelNG::IsTexture(FrameNode *frameNode)
314 {
315 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
316 CHECK_NULL_RETURN(layoutProperty, false);
317 return layoutProperty->GetXComponentTypeValue() == XComponentType::TEXTURE;
318 }
319
GetType(FrameNode * frameNode)320 XComponentType XComponentModelNG::GetType(FrameNode* frameNode)
321 {
322 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
323 CHECK_NULL_RETURN(layoutProperty, XComponentType::SURFACE);
324 return layoutProperty->GetXComponentTypeValue(XComponentType::SURFACE);
325 }
326
327 // For CAPI XComponent
CreateFrameNode(int32_t nodeId,const std::string & id,XComponentType type,const std::optional<std::string> & libraryname)328 RefPtr<FrameNode> XComponentModelNG::CreateFrameNode(int32_t nodeId, const std::string& id, XComponentType type,
329 const std::optional<std::string>& libraryname)
330 {
331 auto pattern = AceType::MakeRefPtr<XComponentPatternV2>(type, XComponentNodeType::CNODE);
332 auto frameNode = FrameNode::CreateFrameNode(V2::XCOMPONENT_ETS_TAG, nodeId, pattern);
333 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
334 CHECK_NULL_RETURN(layoutProperty, frameNode);
335 layoutProperty->UpdateXComponentType(type);
336 return frameNode;
337 }
338
CreateTypeNode(int32_t nodeId,ArkUI_XComponent_Params * params)339 RefPtr<FrameNode> XComponentModelNG::CreateTypeNode(int32_t nodeId, ArkUI_XComponent_Params* params)
340 {
341 auto id = params->id;
342 auto type = params->type;
343 auto libraryName = params->libraryName;
344 auto controller = params->controller;
345 auto screenId = params->screenId;
346
347 RefPtr<FrameNode> frameNode;
348 if (id.empty() && controller == nullptr && (type == XComponentType::SURFACE || type == XComponentType::TEXTURE)) {
349 frameNode = FrameNode::CreateFrameNode(V2::XCOMPONENT_ETS_TAG, nodeId,
350 AceType::MakeRefPtr<XComponentPatternV2>(type, XComponentNodeType::TYPE_NODE));
351 } else {
352 frameNode = FrameNode::CreateFrameNode(V2::XCOMPONENT_ETS_TAG, nodeId,
353 AceType::MakeRefPtr<XComponentPattern>(id, type, libraryName, controller, 0.0, 0.0, true));
354 }
355 auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
356 if (layoutProperty) {
357 layoutProperty->UpdateXComponentType(type);
358 }
359 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
360 CHECK_NULL_RETURN(xcPattern, nullptr);
361 if (type == XComponentType::SURFACE || type == XComponentType::TEXTURE) {
362 xcPattern->SetImageAIOptions(params->aiOptions);
363 }
364 if (type == XComponentType::SURFACE && screenId.has_value()) {
365 SetScreenId(Referenced::RawPtr(frameNode), screenId.value());
366 }
367 return frameNode;
368 }
369
SetScreenId(FrameNode * frameNode,uint64_t screenId)370 void XComponentModelNG::SetScreenId(FrameNode* frameNode, uint64_t screenId)
371 {
372 CHECK_NULL_VOID(frameNode);
373 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
374 CHECK_NULL_VOID(xcPattern);
375 uint64_t rsScreenId = 0u;
376 TAG_LOGI(AceLogTag::ACE_XCOMPONENT, "XComponent[%{public}s][screenId: %" PRIu64 "]", xcPattern->GetId().c_str(),
377 screenId);
378 if (!DisplayManager::GetInstance().ConvertScreenIdToRsScreenId(screenId, rsScreenId)) {
379 TAG_LOGW(AceLogTag::ACE_XCOMPONENT, "ConvertScreenIdToRsScreenId fail");
380 }
381 xcPattern->SetScreenId(rsScreenId);
382 }
383
SetXComponentId(FrameNode * frameNode,const std::string & id)384 void XComponentModelNG::SetXComponentId(FrameNode* frameNode, const std::string& id)
385 {
386 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
387 CHECK_NULL_VOID(xcPattern);
388 xcPattern->SetId(id);
389 }
390
SetXComponentType(FrameNode * frameNode,XComponentType type)391 void XComponentModelNG::SetXComponentType(FrameNode* frameNode, XComponentType type)
392 {
393 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
394 CHECK_NULL_VOID(xcPattern);
395 xcPattern->SetType(type);
396 ACE_UPDATE_NODE_LAYOUT_PROPERTY(XComponentLayoutProperty, XComponentType, type, frameNode);
397 }
398
SetXComponentSurfaceSize(FrameNode * frameNode,uint32_t width,uint32_t height)399 void XComponentModelNG::SetXComponentSurfaceSize(FrameNode* frameNode, uint32_t width, uint32_t height)
400 {
401 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
402 CHECK_NULL_VOID(xcPattern);
403 xcPattern->ConfigSurface(width, height);
404 }
405
GetXComponentId(FrameNode * frameNode)406 std::string XComponentModelNG::GetXComponentId(FrameNode* frameNode)
407 {
408 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
409 CHECK_NULL_RETURN(xcPattern, "");
410 return xcPattern->GetId();
411 }
412
GetXComponentType(FrameNode * frameNode)413 XComponentType XComponentModelNG::GetXComponentType(FrameNode* frameNode)
414 {
415 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
416 CHECK_NULL_RETURN(xcPattern, XComponentType::SURFACE);
417 return xcPattern->GetType();
418 }
419
GetXComponentSurfaceWidth(FrameNode * frameNode)420 uint32_t XComponentModelNG::GetXComponentSurfaceWidth(FrameNode* frameNode)
421 {
422 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
423 CHECK_NULL_RETURN(xcPattern, DEFAULT_SURFACE_SIZE);
424 auto drawSize = xcPattern->GetDrawSize();
425 return drawSize.Width();
426 }
427
GetXComponentSurfaceHeight(FrameNode * frameNode)428 uint32_t XComponentModelNG::GetXComponentSurfaceHeight(FrameNode* frameNode)
429 {
430 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
431 CHECK_NULL_RETURN(xcPattern, DEFAULT_SURFACE_SIZE);
432 auto drawSize = xcPattern->GetDrawSize();
433 return drawSize.Height();
434 }
435
EnableAnalyzer(bool enable)436 void XComponentModelNG::EnableAnalyzer(bool enable)
437 {
438 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
439 CHECK_NULL_VOID(frameNode);
440 auto type = GetTypeImpl(frameNode);
441 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
442 return;
443 }
444 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
445 CHECK_NULL_VOID(xcPattern);
446 xcPattern->EnableAnalyzer(enable);
447 }
448
EnableAnalyzer(FrameNode * frameNode,bool enable)449 void XComponentModelNG::EnableAnalyzer(FrameNode* frameNode, bool enable)
450 {
451 CHECK_NULL_VOID(frameNode);
452 auto node = AceType::Claim(frameNode);
453 auto type = GetTypeImpl(node);
454 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
455 return;
456 }
457 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
458 CHECK_NULL_VOID(xcPattern);
459 xcPattern->EnableAnalyzer(enable);
460 }
461
SetImageAIOptions(void * options)462 void XComponentModelNG::SetImageAIOptions(void* options)
463 {
464 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
465 CHECK_NULL_VOID(frameNode);
466 auto type = GetTypeImpl(frameNode);
467 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
468 return;
469 }
470 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
471 CHECK_NULL_VOID(xcPattern);
472 xcPattern->SetImageAIOptions(options);
473 }
474
SetXComponentLibraryname(FrameNode * frameNode,const std::string & libraryname)475 void XComponentModelNG::SetXComponentLibraryname(FrameNode* frameNode, const std::string& libraryname)
476 {
477 CHECK_NULL_VOID(frameNode);
478 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
479 CHECK_NULL_VOID(xcPattern);
480 xcPattern->SetLibraryName(libraryname);
481 }
482
SetControllerOnCreated(FrameNode * frameNode,SurfaceCreatedEvent && onCreated)483 void XComponentModelNG::SetControllerOnCreated(FrameNode* frameNode, SurfaceCreatedEvent&& onCreated)
484 {
485 CHECK_NULL_VOID(frameNode);
486 auto node = AceType::Claim(frameNode);
487 auto type = GetTypeImpl(node);
488 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
489 return;
490 }
491 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
492 CHECK_NULL_VOID(eventHub);
493 eventHub->SetControllerCreatedEvent(std::move(onCreated));
494 }
495
SetControllerOnChanged(FrameNode * frameNode,SurfaceChangedEvent && onChanged)496 void XComponentModelNG::SetControllerOnChanged(FrameNode* frameNode, SurfaceChangedEvent&& onChanged)
497 {
498 CHECK_NULL_VOID(frameNode);
499 auto node = AceType::Claim(frameNode);
500 auto type = GetTypeImpl(node);
501 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
502 return;
503 }
504 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
505 CHECK_NULL_VOID(eventHub);
506 eventHub->SetControllerChangedEvent(std::move(onChanged));
507 }
508
SetControllerOnDestroyed(FrameNode * frameNode,SurfaceDestroyedEvent && onDestroyed)509 void XComponentModelNG::SetControllerOnDestroyed(FrameNode* frameNode, SurfaceDestroyedEvent&& onDestroyed)
510 {
511 CHECK_NULL_VOID(frameNode);
512 auto node = AceType::Claim(frameNode);
513 auto type = GetTypeImpl(node);
514 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
515 return;
516 }
517 auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
518 CHECK_NULL_VOID(eventHub);
519 eventHub->SetControllerDestroyedEvent(std::move(onDestroyed));
520 }
521
SetDetachCallback(FrameNode * frameNode,DetachCallback && onDetach)522 void XComponentModelNG::SetDetachCallback(FrameNode* frameNode, DetachCallback&& onDetach)
523 {
524 CHECK_NULL_VOID(frameNode);
525 auto node = AceType::Claim(frameNode);
526 auto type = GetTypeImpl(node);
527 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
528 return;
529 }
530 auto eventHub = node->GetEventHub<XComponentEventHub>();
531 CHECK_NULL_VOID(eventHub);
532 eventHub->SetDetachEvent(std::move(onDetach));
533 }
534
SetImageAIOptions(FrameNode * frameNode,void * options)535 void XComponentModelNG::SetImageAIOptions(FrameNode* frameNode, void* options)
536 {
537 CHECK_NULL_VOID(frameNode);
538 auto node = AceType::Claim(frameNode);
539 auto type = GetTypeImpl(node);
540 if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
541 return;
542 }
543 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
544 CHECK_NULL_VOID(xcPattern);
545 xcPattern->SetImageAIOptions(options);
546 }
547
EnableSecure(FrameNode * frameNode,bool enable)548 void XComponentModelNG::EnableSecure(FrameNode* frameNode, bool enable)
549 {
550 CHECK_NULL_VOID(frameNode);
551 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
552 CHECK_NULL_VOID(xcPattern);
553 xcPattern->EnableSecure(enable);
554 }
555
HdrBrightness(FrameNode * frameNode,float hdrBrightness)556 void XComponentModelNG::HdrBrightness(FrameNode* frameNode, float hdrBrightness)
557 {
558 CHECK_NULL_VOID(frameNode);
559 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
560 CHECK_NULL_VOID(xcPattern);
561 xcPattern->HdrBrightness(hdrBrightness);
562 }
563
EnableTransparentLayer(FrameNode * frameNode,bool enable)564 void XComponentModelNG::EnableTransparentLayer(FrameNode* frameNode, bool enable)
565 {
566 CHECK_NULL_VOID(frameNode);
567 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
568 CHECK_NULL_VOID(xcPattern);
569 xcPattern->EnableTransparentLayer(enable);
570 }
571
SetRenderFit(FrameNode * frameNode,RenderFit renderFit)572 void XComponentModelNG::SetRenderFit(FrameNode* frameNode, RenderFit renderFit)
573 {
574 CHECK_NULL_VOID(frameNode);
575 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
576 CHECK_NULL_VOID(xcPattern);
577 xcPattern->SetRenderFit(renderFit);
578 }
579
GetSurfaceRenderFit(FrameNode * frameNode)580 RenderFit XComponentModelNG::GetSurfaceRenderFit(FrameNode* frameNode)
581 {
582 CHECK_NULL_RETURN(frameNode, RenderFit::RESIZE_FILL);
583 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
584 CHECK_NULL_RETURN(xcPattern, RenderFit::RESIZE_FILL);
585 return xcPattern->GetSurfaceRenderFit();
586 }
587
SetXComponentSurfaceRect(FrameNode * frameNode,float offsetX,float offsetY,float surfaceWidth,float surfaceHeight)588 void XComponentModelNG::SetXComponentSurfaceRect(FrameNode* frameNode, float offsetX, float offsetY,
589 float surfaceWidth, float surfaceHeight)
590 {
591 CHECK_NULL_VOID(frameNode);
592 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
593 CHECK_NULL_VOID(xcPattern);
594 xcPattern->SetIdealSurfaceOffsetX(offsetX);
595 xcPattern->SetIdealSurfaceOffsetY(offsetY);
596 xcPattern->SetIdealSurfaceWidth(surfaceWidth);
597 xcPattern->SetIdealSurfaceHeight(surfaceHeight);
598
599 const auto& [offsetChanged, sizeChanged, needFireNativeEvent] = xcPattern->UpdateSurfaceRect();
600 xcPattern->HandleSurfaceChangeEvent(true, offsetChanged, sizeChanged, needFireNativeEvent);
601 }
602
GetXComponentSurfaceRect(FrameNode * frameNode,float & offsetX,float & offsetY,float & surfaceWidth,float & surfaceHeight)603 void XComponentModelNG::GetXComponentSurfaceRect(FrameNode* frameNode, float& offsetX, float& offsetY,
604 float& surfaceWidth, float& surfaceHeight)
605 {
606 CHECK_NULL_VOID(frameNode);
607 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
608 CHECK_NULL_VOID(xcPattern);
609 auto surfaceOffset = xcPattern->GetSurfaceOffset();
610 offsetX = surfaceOffset.GetX();
611 offsetY = surfaceOffset.GetY();
612 auto surfaceSize = xcPattern->GetSurfaceSize();
613 surfaceWidth = surfaceSize.Width();
614 surfaceHeight = surfaceSize.Height();
615 }
616
GetXComponentEnableAnalyzer(FrameNode * frameNode)617 bool XComponentModelNG::GetXComponentEnableAnalyzer(FrameNode* frameNode)
618 {
619 CHECK_NULL_RETURN(frameNode, false);
620 auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
621 CHECK_NULL_RETURN(xcPattern, false);
622 return xcPattern->GetEnableAnalyzer();
623 }
624 } // namespace OHOS::Ace::NG
625