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