• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef USE_ROSEN_DRAWING
20 #include "include/core/SkCanvas.h"
21 #include "include/core/SkMatrix.h"
22 #include "include/core/SkSurface.h"
23 #endif
24 #include "pixel_map.h"
25 #include "rs_base_render_engine.h"
26 
27 #include "pipeline/rs_canvas_render_node.h"
28 #include "pipeline/rs_display_render_node.h"
29 #include "pipeline/rs_effect_render_node.h"
30 #ifndef USE_ROSEN_DRAWING
31 #include "pipeline/rs_recording_canvas.h"
32 #else
33 #include "recording/recording_canvas.h"
34 #endif
35 #include "pipeline/rs_root_render_node.h"
36 #include "pipeline/rs_surface_render_node.h"
37 #include "visitor/rs_node_visitor.h"
38 
39 namespace OHOS {
40 namespace Rosen {
41 
42 class RSUniUICapture {
43 public:
RSUniUICapture(NodeId nodeId,float scaleX,float scaleY)44     RSUniUICapture(NodeId nodeId, float scaleX, float scaleY)
45         : nodeId_(nodeId), scaleX_(scaleX), scaleY_(scaleY) {}
46     ~RSUniUICapture() = default;
47 
48     std::shared_ptr<Media::PixelMap> TakeLocalCapture();
49 
50 private:
51     class RSUniUICaptureVisitor : public RSNodeVisitor {
52     public:
53         RSUniUICaptureVisitor(NodeId nodeId, float scaleX, float scaleY);
54         ~RSUniUICaptureVisitor() noexcept override = default;
55         void PrepareChildren(RSRenderNode& node) override;
56         void PrepareCanvasRenderNode(RSCanvasRenderNode& node) override;
PrepareDisplayRenderNode(RSDisplayRenderNode & node)57         void PrepareDisplayRenderNode(RSDisplayRenderNode& node) override {};
PrepareProxyRenderNode(RSProxyRenderNode & node)58         void PrepareProxyRenderNode(RSProxyRenderNode& node) override {}
59         void PrepareRootRenderNode(RSRootRenderNode& node) override;
60         void PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) override;
61         void PrepareEffectRenderNode(RSEffectRenderNode& node) override;
62 
63         void ProcessChildren(RSRenderNode& node) override;
64         void ProcessCanvasRenderNode(RSCanvasRenderNode& node) override;
ProcessDisplayRenderNode(RSDisplayRenderNode & node)65         void ProcessDisplayRenderNode(RSDisplayRenderNode& node) override {};
ProcessProxyRenderNode(RSProxyRenderNode & node)66         void ProcessProxyRenderNode(RSProxyRenderNode& node) override {}
67         void ProcessRootRenderNode(RSRootRenderNode& node) override;
68         void ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) override;
69         void ProcessEffectRenderNode(RSEffectRenderNode& node) override;
70 
71 #ifndef USE_ROSEN_DRAWING
72         void SetCanvas(std::shared_ptr<RSRecordingCanvas> canvas);
73 #else
74         void SetCanvas(std::shared_ptr<Drawing::RecordingCanvas> canvas);
75 #endif
76 
77     private:
78         void ProcessSurfaceRenderNodeWithUni(RSSurfaceRenderNode& node);
79         void ProcessSurfaceViewWithUni(RSSurfaceRenderNode& node);
80         void ProcessSurfaceViewWithoutUni(RSSurfaceRenderNode& node);
81         std::shared_ptr<RSPaintFilterCanvas> canvas_ = nullptr;
82 
83         NodeId nodeId_;
84         float scaleX_ = 1.0f;
85         float scaleY_ = 1.0f;
86 
87 #ifndef USE_ROSEN_DRAWING
88         SkMatrix captureMatrix_ = SkMatrix::I();
89         bool isUniRender_ = false;
90         std::shared_ptr<RSBaseRenderEngine> renderEngine_;
91     };
92     sk_sp<SkSurface> CreateSurface(const std::shared_ptr<Media::PixelMap>& pixelmap) const;
93     void PostTaskToRSRecord(std::shared_ptr<RSRecordingCanvas> canvas, std::shared_ptr<RSRenderNode> node,
94         std::shared_ptr<RSUniUICaptureVisitor> visitor);
95 #else
96         Drawing::Matrix captureMatrix_ = Drawing::Matrix();
97         bool isUniRender_ = false;
98         std::shared_ptr<RSBaseRenderEngine> renderEngine_;
99     };
100     std::shared_ptr<Drawing::Surface> CreateSurface(const std::shared_ptr<Media::PixelMap>& pixelmap) const;
101     void PostTaskToRSRecord(std::shared_ptr<Drawing::RecordingCanvas> canvas, std::shared_ptr<RSRenderNode> node,
102         std::shared_ptr<RSUniUICaptureVisitor> visitor);
103 #endif
104     std::shared_ptr<Media::PixelMap> CreatePixelMapByNode(std::shared_ptr<RSRenderNode> node) const;
105 
106     NodeId nodeId_;
107     float scaleX_;
108     float scaleY_;
109 };
110 } // namespace Rosen
111 } // namespace OHOS
112 
113 #endif // RS_UNI_UI_CAPTURE
114