1 /*
2 * Copyright (c) 2023-2024 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/canvas/canvas_model_ng.h"
17
18 #include <mutex>
19
20 #include "base/log/log_wrapper.h"
21 #include "core/components_ng/base/view_abstract.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/canvas/canvas_paint_method.h"
24 #include "core/components_ng/pattern/canvas/canvas_pattern.h"
25 #include "core/components_v2/inspector/inspector_constants.h"
26
27 namespace OHOS::Ace::NG {
Create()28 RefPtr<AceType> CanvasModelNG::Create()
29 {
30 auto* stack = ViewStackProcessor::GetInstance();
31 auto nodeId = stack->ClaimNodeId();
32 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::CANVAS_ETS_TAG, nodeId);
33 auto frameNode = FrameNode::GetOrCreateFrameNode(
34 V2::CANVAS_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<CanvasPattern>(); });
35 stack->Push(frameNode);
36 return frameNode->GetPattern<CanvasPattern>();
37 }
38
GetTaskPool(RefPtr<AceType> & pattern)39 RefPtr<AceType> CanvasModelNG::GetTaskPool(RefPtr<AceType>& pattern)
40 {
41 return pattern;
42 }
43
SetOnReady(std::function<void ()> && onReady)44 void CanvasModelNG::SetOnReady(std::function<void()>&& onReady)
45 {
46 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
47 CHECK_NULL_VOID(frameNode);
48 auto eventHub = frameNode->GetOrCreateEventHub<CanvasEventHub>();
49 CHECK_NULL_VOID(eventHub);
50
51 auto func = onReady;
52 auto onReadyEvent = [func]() { func(); };
53 eventHub->SetOnReady(std::move(onReadyEvent));
54 }
55
EnableAnalyzer(bool enable)56 void CanvasModelNG::EnableAnalyzer(bool enable)
57 {
58 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
59 CHECK_NULL_VOID(frameNode);
60 auto pattern = frameNode->GetPattern<CanvasPattern>();
61 CHECK_NULL_VOID(pattern);
62 pattern->EnableAnalyzer(enable);
63 }
64
SetImageAIOptions(void * options)65 void CanvasModelNG::SetImageAIOptions(void* options)
66 {
67 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
68 CHECK_NULL_VOID(frameNode);
69 auto pattern = frameNode->GetPattern<CanvasPattern>();
70 CHECK_NULL_VOID(pattern);
71 pattern->SetImageAIOptions(options);
72 }
73
DetachRenderContext()74 void CanvasModelNG::DetachRenderContext()
75 {
76 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
77 CHECK_NULL_VOID(frameNode);
78 auto pattern = frameNode->GetPattern<CanvasPattern>();
79 CHECK_NULL_VOID(pattern);
80 pattern->DetachRenderContext();
81 }
82
SetOnReady(FrameNode * frameNode,std::function<void ()> && onReady)83 void CanvasModelNG::SetOnReady(FrameNode* frameNode, std::function<void()>&& onReady)
84 {
85 CHECK_NULL_VOID(frameNode);
86 auto eventHub = frameNode->GetOrCreateEventHub<CanvasEventHub>();
87 CHECK_NULL_VOID(eventHub);
88 eventHub->SetOnReady(std::move(onReady));
89 }
90
EnableAnalyzer(FrameNode * frameNode,bool enable)91 void CanvasModelNG::EnableAnalyzer(FrameNode* frameNode, bool enable)
92 {
93 CHECK_NULL_VOID(frameNode);
94 auto pattern = frameNode->GetPattern<CanvasPattern>();
95 CHECK_NULL_VOID(pattern);
96 pattern->EnableAnalyzer(enable);
97 }
98
GetCanvasPattern(FrameNode * node)99 RefPtr<AceType> CanvasModelNG::GetCanvasPattern(FrameNode* node)
100 {
101 CHECK_NULL_RETURN(node, nullptr);
102 auto* frameNode = reinterpret_cast<FrameNode*>(node);
103 return frameNode->GetPattern<CanvasPattern>();
104 }
105
CreateFrameNode(int32_t nodeId)106 RefPtr<FrameNode> CanvasModelNG::CreateFrameNode(int32_t nodeId)
107 {
108 return FrameNode::GetOrCreateFrameNode(
109 V2::CANVAS_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<CanvasPattern>(); });
110 }
111 } // namespace OHOS::Ace::NG
112