1 /*
2  * Copyright (c) 2023 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 #ifndef RS_DIVIDED_UI_CAPTURE
17 #define RS_DIVIDED_UI_CAPTURE
18 
19 #include "pixel_map.h"
20 
21 #include "common/rs_macros.h"
22 #include "pipeline/rs_canvas_render_node.h"
23 #include "pipeline/rs_display_render_node.h"
24 #include "pipeline/rs_effect_render_node.h"
25 #include "pipeline/rs_recording_canvas.h"
26 #include "pipeline/rs_surface_render_node.h"
27 #include "visitor/rs_node_visitor.h"
28 
29 namespace OHOS {
30 namespace Rosen {
31 
32 class RSC_EXPORT RSDividedUICapture {
33 public:
RSDividedUICapture(NodeId nodeId,float scaleX,float scaleY)34     RSDividedUICapture(NodeId nodeId, float scaleX, float scaleY)
35         : nodeId_(nodeId), scaleX_(scaleX), scaleY_(scaleY) {}
36     ~RSDividedUICapture() = default;
37 
38     std::shared_ptr<Media::PixelMap> TakeLocalCapture();
39 
40 private:
41     class RSDividedUICaptureVisitor : public RSNodeVisitor {
42     public:
RSDividedUICaptureVisitor(NodeId nodeId,float scaleX,float scaleY)43         RSDividedUICaptureVisitor(NodeId nodeId, float scaleX, float scaleY)
44             : nodeId_(nodeId), scaleX_(scaleX), scaleY_(scaleY) {}
45         ~RSDividedUICaptureVisitor() noexcept override = default;
46         void PrepareChildren(RSRenderNode& node) override;
47         void PrepareCanvasRenderNode(RSCanvasRenderNode& node) override;
PrepareDisplayRenderNode(RSDisplayRenderNode & node)48         void PrepareDisplayRenderNode(RSDisplayRenderNode& node) override {};
PrepareProxyRenderNode(RSProxyRenderNode & node)49         void PrepareProxyRenderNode(RSProxyRenderNode& node) override {}
50         void PrepareRootRenderNode(RSRootRenderNode& node) override;
51         void PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) override;
52         void PrepareEffectRenderNode(RSEffectRenderNode& node) override;
53 
54         void ProcessChildren(RSRenderNode& node) override;
55         void ProcessCanvasRenderNode(RSCanvasRenderNode& node) override;
ProcessDisplayRenderNode(RSDisplayRenderNode & node)56         void ProcessDisplayRenderNode(RSDisplayRenderNode& node) override {};
ProcessProxyRenderNode(RSProxyRenderNode & node)57         void ProcessProxyRenderNode(RSProxyRenderNode& node) override {}
58         void ProcessRootRenderNode(RSRootRenderNode& node) override;
59         void ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) override;
60         void ProcessEffectRenderNode(RSEffectRenderNode& node) override;
61 
62         void SetCanvas(std::shared_ptr<ExtendRecordingCanvas> canvas);
63 
64         void SetPaintFilterCanvas(std::shared_ptr<RSPaintFilterCanvas> canvas);
65 
66     private:
67         std::shared_ptr<RSPaintFilterCanvas> canvas_ = nullptr;
68 
69         NodeId nodeId_;
70         float scaleX_ = 1.0f;
71         float scaleY_ = 1.0f;
72     };
73     std::shared_ptr<Drawing::Surface> CreateSurface(const std::shared_ptr<Media::PixelMap>& pixelmap) const;
74     void PostTaskToRTRecord(std::shared_ptr<ExtendRecordingCanvas> canvas, std::shared_ptr<RSRenderNode> node,
75         std::shared_ptr<RSDividedUICaptureVisitor> visitor);
76     std::shared_ptr<Media::PixelMap> CreatePixelMapByNode(std::shared_ptr<RSRenderNode> node) const;
77 
78     NodeId nodeId_;
79     float scaleX_;
80     float scaleY_;
81 };
82 } // namespace Rosen
83 } // namespace OHOS
84 
85 #endif // RS_DIVIDED_UI_CAPTURE
86