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