• 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 
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