• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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