• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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/render/paint_wrapper.h"
17 
18 #include "base/utils/utils.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/base/modifier.h"
21 #include "core/components_ng/render/node_paint_method.h"
22 
23 namespace OHOS::Ace::NG {
24 
PaintWrapper(WeakPtr<RenderContext> renderContext,RefPtr<GeometryNode> geometryNode,RefPtr<PaintProperty> layoutProperty)25 PaintWrapper::PaintWrapper(
26     WeakPtr<RenderContext> renderContext, RefPtr<GeometryNode> geometryNode, RefPtr<PaintProperty> layoutProperty)
27     : renderContext_(std::move(renderContext)), geometryNode_(std::move(geometryNode)),
28       paintProperty_(std::move(layoutProperty))
29 {}
30 
31 PaintWrapper::~PaintWrapper() = default;
32 
SetNodePaintMethod(const RefPtr<NodePaintMethod> & nodePaintImpl)33 void PaintWrapper::SetNodePaintMethod(const RefPtr<NodePaintMethod>& nodePaintImpl)
34 {
35     nodePaintImpl_ = nodePaintImpl;
36     CHECK_NULL_VOID(nodePaintImpl_);
37     auto renderContext = renderContext_.Upgrade();
38     CHECK_NULL_VOID(renderContext);
39     auto contentModifier = nodePaintImpl_->GetContentModifier(this);
40     if (contentModifier) {
41         renderContext->FlushContentModifier(contentModifier);
42     }
43     auto overlayModifier = nodePaintImpl_->GetOverlayModifier(this);
44     if (overlayModifier) {
45         renderContext->FlushOverlayModifier(overlayModifier);
46     }
47 }
48 
FlushOverlayModifier()49 void PaintWrapper::FlushOverlayModifier()
50 {
51     CHECK_NULL_VOID_NOLOG(nodePaintImpl_);
52     auto overlayModifier = nodePaintImpl_->GetOverlayModifier(this);
53     CHECK_NULL_VOID_NOLOG(overlayModifier);
54     auto renderContext = renderContext_.Upgrade();
55     CHECK_NULL_VOID_NOLOG(renderContext);
56     renderContext->FlushOverlayModifier(overlayModifier);
57 }
58 
FlushRender()59 void PaintWrapper::FlushRender()
60 {
61     CHECK_NULL_VOID(nodePaintImpl_);
62 
63     auto renderContext = renderContext_.Upgrade();
64     CHECK_NULL_VOID(renderContext);
65 
66     auto contentModifier = nodePaintImpl_->GetContentModifier(this);
67     if (contentModifier) {
68         nodePaintImpl_->UpdateContentModifier(this);
69     }
70 
71     auto overlayModifier = nodePaintImpl_->GetOverlayModifier(this);
72     if (overlayModifier) {
73         nodePaintImpl_->UpdateOverlayModifier(this);
74     }
75 
76     renderContext->StartRecording();
77 
78     // first set content paint function.
79     auto contentDraw = nodePaintImpl_->GetContentDrawFunction(this);
80     if (contentDraw && !contentModifier) {
81         renderContext->FlushContentDrawFunction(std::move(contentDraw));
82     }
83 
84     // then set foreground paint function.
85     auto foregroundDraw = nodePaintImpl_->GetForegroundDrawFunction(this);
86     if (foregroundDraw) {
87         renderContext->FlushForegroundDrawFunction(std::move(foregroundDraw));
88     }
89 
90     // at last, set overlay paint function.
91     auto overlayDraw = nodePaintImpl_->GetOverlayDrawFunction(this);
92     if (overlayDraw && !overlayModifier) {
93         renderContext->FlushOverlayDrawFunction(std::move(overlayDraw));
94     }
95 
96     if (renderContext->GetAccessibilityFocus().value_or(false)) {
97         renderContext->PaintAccessibilityFocus();
98     }
99 
100     renderContext->StopRecordingIfNeeded();
101 }
102 } // namespace OHOS::Ace::NG
103