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