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