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
FlushRender()49 void PaintWrapper::FlushRender()
50 {
51 CHECK_NULL_VOID(nodePaintImpl_);
52
53 auto renderContext = renderContext_.Upgrade();
54 CHECK_NULL_VOID(renderContext);
55
56 auto contentModifier = nodePaintImpl_->GetContentModifier(this);
57 if (contentModifier) {
58 nodePaintImpl_->UpdateContentModifier(this);
59 }
60
61 auto overlayModifier = nodePaintImpl_->GetOverlayModifier(this);
62 if (overlayModifier) {
63 nodePaintImpl_->UpdateOverlayModifier(this);
64 }
65
66 renderContext->StartRecording();
67
68 // first set content paint function.
69 auto contentDraw = nodePaintImpl_->GetContentDrawFunction(this);
70 if (contentDraw && !contentModifier) {
71 renderContext->FlushContentDrawFunction(std::move(contentDraw));
72 }
73
74 // then set foreground paint function.
75 auto foregroundDraw = nodePaintImpl_->GetForegroundDrawFunction(this);
76 if (foregroundDraw) {
77 renderContext->FlushForegroundDrawFunction(std::move(foregroundDraw));
78 }
79
80 // at last, set overlay paint function.
81 auto overlayDraw = nodePaintImpl_->GetOverlayDrawFunction(this);
82 if (overlayDraw && !overlayModifier) {
83 renderContext->FlushOverlayDrawFunction(std::move(overlayDraw));
84 }
85
86 if (renderContext->GetAccessibilityFocus().value_or(false)) {
87 renderContext->PaintAccessibilityFocus();
88 }
89
90 renderContext->StopRecordingIfNeeded();
91 }
92 } // namespace OHOS::Ace::NG
93