• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 #ifndef RS_SURFACE_CAPTURE_TASK
17 #define RS_SURFACE_CAPTURE_TASK
18 
19 #include "common/rs_common_def.h"
20 #include "include/core/SkCanvas.h"
21 #include "include/core/SkMatrix.h"
22 #include "include/core/SkSurface.h"
23 #include "pipeline/rs_display_render_node.h"
24 #include "pipeline/rs_surface_render_node.h"
25 #include "pixel_map.h"
26 #include "rs_base_render_engine.h"
27 #include "visitor/rs_node_visitor.h"
28 
29 namespace OHOS {
30 namespace Rosen {
31 class RSSurfaceCaptureTask {
32 public:
RSSurfaceCaptureTask(NodeId nodeId,float scaleX,float scaleY)33     explicit RSSurfaceCaptureTask(NodeId nodeId, float scaleX, float scaleY)
34         : nodeId_(nodeId), scaleX_(scaleX), scaleY_(scaleY) {}
35     ~RSSurfaceCaptureTask() = default;
36 
37     std::unique_ptr<Media::PixelMap> Run();
38 
39 private:
40     class RSSurfaceCaptureVisitor : public RSNodeVisitor {
41     public:
42         RSSurfaceCaptureVisitor(float scaleX, float scaleY, bool isUniRender);
43         ~RSSurfaceCaptureVisitor() noexcept override = default;
PrepareBaseRenderNode(RSBaseRenderNode & node)44         void PrepareBaseRenderNode(RSBaseRenderNode& node) override {}
PrepareCanvasRenderNode(RSCanvasRenderNode & node)45         void PrepareCanvasRenderNode(RSCanvasRenderNode& node) override {}
PrepareDisplayRenderNode(RSDisplayRenderNode & node)46         void PrepareDisplayRenderNode(RSDisplayRenderNode& node) override {}
PrepareProxyRenderNode(RSProxyRenderNode & node)47         void PrepareProxyRenderNode(RSProxyRenderNode& node) override {}
PrepareRootRenderNode(RSRootRenderNode & node)48         void PrepareRootRenderNode(RSRootRenderNode& node) override {}
PrepareSurfaceRenderNode(RSSurfaceRenderNode & node)49         void PrepareSurfaceRenderNode(RSSurfaceRenderNode& node) override {}
50 
51         void ProcessBaseRenderNode(RSBaseRenderNode& node) override;
52         void ProcessCanvasRenderNode(RSCanvasRenderNode& node) override;
53         void ProcessDisplayRenderNode(RSDisplayRenderNode& node) override;
ProcessProxyRenderNode(RSProxyRenderNode & node)54         void ProcessProxyRenderNode(RSProxyRenderNode& node) override {}
55         void ProcessRootRenderNode(RSRootRenderNode& node) override;
56         void ProcessSurfaceRenderNode(RSSurfaceRenderNode& node) override;
57 
58         void SetSurface(SkSurface* surface);
IsDisplayNode(bool isDisplayNode)59         void IsDisplayNode(bool isDisplayNode)
60         {
61             isDisplayNode_ = isDisplayNode;
62         }
63 
IsUniRender()64         bool IsUniRender() const
65         {
66             return isUniRender_;
67         }
68 
69     private:
70         void ProcessSurfaceRenderNodeWithUni(RSSurfaceRenderNode& node);
71         void CaptureSingleSurfaceNodeWithUni(RSSurfaceRenderNode& node);
72         void CaptureSurfaceInDisplayWithUni(RSSurfaceRenderNode& node);
73         void ProcessSurfaceRenderNodeWithoutUni(RSSurfaceRenderNode& node);
74         void CaptureSingleSurfaceNodeWithoutUni(RSSurfaceRenderNode& node);
75         void CaptureSurfaceInDisplayWithoutUni(RSSurfaceRenderNode& node);
76         std::unique_ptr<RSPaintFilterCanvas> canvas_ = nullptr;
77         bool isDisplayNode_ = false;
78         float scaleX_ = 1.0f;
79         float scaleY_ = 1.0f;
80         bool isUniRender_ = false;
81 
82         SkMatrix captureMatrix_ = SkMatrix::I();
83 
84         std::shared_ptr<RSBaseRenderEngine> renderEngine_;
85     };
86 
87     sk_sp<SkSurface> CreateSurface(const std::unique_ptr<Media::PixelMap>& pixelmap);
88 
89     std::unique_ptr<Media::PixelMap> CreatePixelMapBySurfaceNode(std::shared_ptr<RSSurfaceRenderNode> node,
90         bool isUniRender = false);
91 
92     std::unique_ptr<Media::PixelMap> CreatePixelMapByDisplayNode(std::shared_ptr<RSDisplayRenderNode> node);
93 
94     NodeId nodeId_;
95 
96     float scaleX_;
97 
98     float scaleY_;
99 };
100 } // namespace Rosen
101 } // namespace OHOS
102 
103 #endif // RS_SURFACE_CAPTURE_TASK
104