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_UNI_UI_CAPTURE
17 #define RS_UNI_UI_CAPTURE
18 
19 #include "pixel_map.h"
20 #include "rs_base_render_engine.h"
21 
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_root_render_node.h"
27 #include "pipeline/rs_surface_render_node.h"
28 #include "visitor/rs_node_visitor.h"
29 
30 namespace OHOS {
31 namespace Rosen {
32 
33 class RSUniUICapture {
34 public:
35     RSUniUICapture(NodeId nodeId, const RSSurfaceCaptureConfig& captureConfig);
36     ~RSUniUICapture() = default;
37 
38     std::shared_ptr<Media::PixelMap> TakeLocalCapture();
39 
40 private:
41     class RSUniUICaptureVisitor : public RSNodeVisitor {
42     public:
43         RSUniUICaptureVisitor(NodeId nodeId, const RSSurfaceCaptureConfig& captureConfig);
44         ~RSUniUICaptureVisitor() noexcept override = default;
45         void PrepareChildren(RSRenderNode& node) override;
46         void PrepareCanvasRenderNode(RSCanvasRenderNode& node) override;
PrepareDisplayRenderNode(RSDisplayRenderNode & node)47         void PrepareDisplayRenderNode(RSDisplayRenderNode& node) override {};
PrepareProxyRenderNode(RSProxyRenderNode & node)48         void PrepareProxyRenderNode(RSProxyRenderNode& node) override {}
49         void PrepareRootRenderNode(RSRootRenderNode& node) override;
50         void PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) override;
51         void PrepareEffectRenderNode(RSEffectRenderNode& node) override;
52 
53         void ProcessChildren(RSRenderNode& node) override;
54         void ProcessCanvasRenderNode(RSCanvasRenderNode& node) override;
ProcessDisplayRenderNode(RSDisplayRenderNode & node)55         void ProcessDisplayRenderNode(RSDisplayRenderNode& node) override {};
ProcessProxyRenderNode(RSProxyRenderNode & node)56         void ProcessProxyRenderNode(RSProxyRenderNode& node) override {}
57         void ProcessRootRenderNode(RSRootRenderNode& node) override;
58         void ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) override;
59         void ProcessEffectRenderNode(RSEffectRenderNode& node) override;
60 
61         void SetCanvas(std::shared_ptr<ExtendRecordingCanvas> canvas);
62         void SetPaintFilterCanvas(std::shared_ptr<RSPaintFilterCanvas> canvas);
63 
64     private:
65         void ProcessSurfaceRenderNodeWithUni(RSSurfaceRenderNode& node);
66         void ProcessSurfaceViewWithUni(RSSurfaceRenderNode& node);
67         void ProcessSurfaceViewWithoutUni(RSSurfaceRenderNode& node);
68         std::shared_ptr<RSPaintFilterCanvas> canvas_ = nullptr;
69 
70         NodeId nodeId_ = INVALID_NODEID;
71         RSSurfaceCaptureConfig captureConfig_;
72 
73         Drawing::Matrix captureMatrix_ = Drawing::Matrix();
74         bool isUniRender_ = false;
75         std::shared_ptr<RSBaseRenderEngine> renderEngine_;
76     };
77     std::shared_ptr<Drawing::Surface> CreateSurface(const std::shared_ptr<Media::PixelMap>& pixelmap);
78     void PostTaskToRSRecord(std::shared_ptr<ExtendRecordingCanvas> canvas, std::shared_ptr<RSRenderNode> node,
79         std::shared_ptr<RSUniUICaptureVisitor> visitor);
80     bool CopyDataToPixelMap(std::shared_ptr<Drawing::Image> img,
81         std::shared_ptr<Media::PixelMap> pixelmap);
82     std::shared_ptr<Media::PixelMap> CreatePixelMapByNode(std::shared_ptr<RSRenderNode> node) const;
83 
84     NodeId nodeId_;
85     RSSurfaceCaptureConfig captureConfig_;
86     bool isUniRender_ = false;
87     bool isUseCpuSurface_ = false;
88 };
89 } // namespace Rosen
90 } // namespace OHOS
91 
92 #endif // RS_UNI_UI_CAPTURE
93