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 {
GetInstanceNG()28 CanvasModel* CanvasModel::GetInstanceNG()
29 {
30 if (!instance_) {
31 std::lock_guard<std::mutex> lock(mutex_);
32 if (!instance_) {
33 instance_.reset(new NG::CanvasModelNG());
34 }
35 }
36 return instance_.get();
37 }
38 } // namespace OHOS::Ace
39
40 namespace OHOS::Ace::NG {
Create()41 RefPtr<AceType> CanvasModelNG::Create()
42 {
43 auto* stack = ViewStackProcessor::GetInstance();
44 auto nodeId = stack->ClaimNodeId();
45 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::CANVAS_ETS_TAG, nodeId);
46 auto frameNode = FrameNode::GetOrCreateFrameNode(
47 V2::CANVAS_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<CanvasPattern>(); });
48 stack->Push(frameNode);
49 return frameNode->GetPattern<CanvasPattern>();
50 }
51
GetTaskPool(RefPtr<AceType> & pattern)52 RefPtr<AceType> CanvasModelNG::GetTaskPool(RefPtr<AceType>& pattern)
53 {
54 return pattern;
55 }
56
SetOnReady(std::function<void ()> && onReady)57 void CanvasModelNG::SetOnReady(std::function<void()>&& onReady)
58 {
59 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
60 CHECK_NULL_VOID(frameNode);
61 auto eventHub = frameNode->GetEventHub<CanvasEventHub>();
62 CHECK_NULL_VOID(eventHub);
63
64 auto func = onReady;
65 auto onReadyEvent = [func]() { func(); };
66 eventHub->SetOnReady(std::move(onReadyEvent));
67 }
68
EnableAnalyzer(bool enable)69 void CanvasModelNG::EnableAnalyzer(bool enable)
70 {
71 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
72 CHECK_NULL_VOID(frameNode);
73 auto pattern = frameNode->GetPattern<CanvasPattern>();
74 CHECK_NULL_VOID(pattern);
75 pattern->EnableAnalyzer(enable);
76 }
77
SetImageAIOptions(void * options)78 void CanvasModelNG::SetImageAIOptions(void* options)
79 {
80 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
81 CHECK_NULL_VOID(frameNode);
82 auto pattern = frameNode->GetPattern<CanvasPattern>();
83 CHECK_NULL_VOID(pattern);
84 pattern->SetImageAIOptions(options);
85 }
86
DetachRenderContext()87 void CanvasModelNG::DetachRenderContext()
88 {
89 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
90 CHECK_NULL_VOID(frameNode);
91 auto pattern = frameNode->GetPattern<CanvasPattern>();
92 CHECK_NULL_VOID(pattern);
93 pattern->DetachRenderContext();
94 }
95
SetOnReady(FrameNode * frameNode,std::function<void ()> && onReady)96 void CanvasModelNG::SetOnReady(FrameNode* frameNode, std::function<void()>&& onReady)
97 {
98 CHECK_NULL_VOID(frameNode);
99 auto eventHub = frameNode->GetEventHub<CanvasEventHub>();
100 CHECK_NULL_VOID(eventHub);
101 auto func = onReady;
102 auto onReadyEvent = [func]() { func(); };
103 eventHub->SetOnReady(std::move(onReadyEvent));
104 }
105
GetCanvasPattern(FrameNode * node)106 RefPtr<AceType> CanvasModelNG::GetCanvasPattern(FrameNode* node)
107 {
108 CHECK_NULL_RETURN(node, nullptr);
109 auto* frameNode = reinterpret_cast<FrameNode*>(node);
110 return frameNode->GetPattern<CanvasPattern>();
111 }
112
CreateFrameNode(int32_t nodeId)113 RefPtr<FrameNode> CanvasModelNG::CreateFrameNode(int32_t nodeId)
114 {
115 auto frameNode = FrameNode::GetOrCreateFrameNode(
116 V2::CANVAS_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<CanvasPattern>(); });
117 return frameNode;
118 }
119 } // namespace OHOS::Ace::NG
120