From 425f8d17a7a2db736c3444a81f9145de637cc13f Mon Sep 17 00:00:00 2001 From: luwei Date: Thu, 13 Jan 2022 20:37:04 +0800 Subject: [PATCH] modify screenshot Change-Id: Iaf24a3a4a7c451ca1a51cb83d48098c6be6be940 --- dm/include/display_manager_adapter.h | 2 +- dm/src/display_manager.cpp | 10 +++---- dm/src/display_manager_adapter.cpp | 4 +-- .../include/abstract_display_controller.h | 26 ++++++++++++++++++- dmserver/include/display_manager_interface.h | 2 +- dmserver/include/display_manager_proxy.h | 2 +- dmserver/include/display_manager_service.h | 2 +- dmserver/src/abstract_display_controller.cpp | 22 ++++++++++++++-- dmserver/src/display_manager_proxy.cpp | 4 +-- dmserver/src/display_manager_service.cpp | 5 ++-- dmserver/src/display_manager_stub.cpp | 4 +-- interfaces/innerkits/dm/display_manager.h | 4 +-- wmserver/include/window_manager_service.h | 1 + wmserver/include/window_node_container.h | 1 + wmserver/src/window_manager_service.cpp | 5 ++++ wmserver/src/window_node_container.cpp | 5 ++++ 16 files changed, 77 insertions(+), 22 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index eae13dbe5c..a27d9789b6 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -38,7 +38,7 @@ public: DisplayId CreateVirtualDisplay(const VirtualDisplayInfo &virtualDisplayInfo, sptr surface); bool DestroyVirtualDisplay(DisplayId displayId); - sptr GetDisplaySnapshot(DisplayId displayId); + std::shared_ptr GetDisplaySnapshot(DisplayId displayId); bool SuspendBegin(PowerStateChangeReason reason); bool SetDisplayState(DisplayState state, DisplayStateCallback callback); diff --git a/dm/src/display_manager.cpp b/dm/src/display_manager.cpp index 2df4a0af41..87ba8a41d3 100644 --- a/dm/src/display_manager.cpp +++ b/dm/src/display_manager.cpp @@ -42,13 +42,13 @@ const sptr DisplayManager::GetDisplayById(DisplayId displayId) return display; } -sptr DisplayManager::GetScreenshot(DisplayId displayId) +std::shared_ptr DisplayManager::GetScreenshot(DisplayId displayId) { if (displayId == DISPLAY_ID_INVALD) { WLOGFE("displayId invalid!"); return nullptr; } - sptr screenShot = SingletonContainer::Get().GetDisplaySnapshot(displayId); + std::shared_ptr screenShot = SingletonContainer::Get().GetDisplaySnapshot(displayId); if (screenShot == nullptr) { WLOGFE("DisplayManager::GetScreenshot failed!"); return nullptr; @@ -73,7 +73,7 @@ bool DisplayManager::CheckRectSizeValid(int32_t param) const return true; } -sptr DisplayManager::GetScreenshot(DisplayId displayId, const Media::Rect &rect, +std::shared_ptr DisplayManager::GetScreenshot(DisplayId displayId, const Media::Rect &rect, const Media::Size &size, int rotation) { if (displayId == DISPLAY_ID_INVALD) { @@ -90,7 +90,7 @@ sptr DisplayManager::GetScreenshot(DisplayId displayId, const M WLOGFE("size invalid! w %{public}d, h %{public}d", rect.width, rect.height); return nullptr; } - sptr screenShot = SingletonContainer::Get().GetDisplaySnapshot(displayId); + std::shared_ptr screenShot = SingletonContainer::Get().GetDisplaySnapshot(displayId); if (screenShot == nullptr) { WLOGFE("DisplayManager::GetScreenshot failed!"); return nullptr; @@ -109,7 +109,7 @@ sptr DisplayManager::GetScreenshot(DisplayId displayId, const M WLOGFE("Media::PixelMap::Create failed!"); return nullptr; } - sptr dstScreenshot = pixelMap.release(); + std::shared_ptr dstScreenshot(pixelMap.release()); return dstScreenshot; } diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 29cef8d722..c317550230 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -64,7 +64,7 @@ sptr DisplayManagerAdapter::GetDisplayById(DisplayId displayId) return display; } -sptr DisplayManagerAdapter::GetDisplaySnapshot(DisplayId displayId) +std::shared_ptr DisplayManagerAdapter::GetDisplaySnapshot(DisplayId displayId) { std::lock_guard lock(mutex_); @@ -73,7 +73,7 @@ sptr DisplayManagerAdapter::GetDisplaySnapshot(DisplayId displa return nullptr; } - sptr dispalySnapshot = displayManagerServiceProxy_->GetDispalySnapshot(displayId); + std::shared_ptr dispalySnapshot = displayManagerServiceProxy_->GetDispalySnapshot(displayId); return dispalySnapshot; } diff --git a/dmserver/include/abstract_display_controller.h b/dmserver/include/abstract_display_controller.h index f921657660..9e25eacff2 100644 --- a/dmserver/include/abstract_display_controller.h +++ b/dmserver/include/abstract_display_controller.h @@ -35,7 +35,7 @@ public: RSScreenModeInfo GetScreenActiveMode(ScreenId id); ScreenId CreateVirtualScreen(const VirtualDisplayInfo &virtualDisplayInfo, sptr surface); bool DestroyVirtualScreen(ScreenId screenId); - sptr GetScreenSnapshot(ScreenId screenId); + std::shared_ptr GetScreenSnapshot(DisplayId displayId, ScreenId screenId); private: AbstractDisplayController(); @@ -43,6 +43,30 @@ private: void parepareRSScreenManger(); OHOS::Rosen::RSInterfaces *rsInterface_; + + class ScreenshotCallback : public SurfaceCaptureCallback { + public: + ScreenshotCallback() = default; + ~ScreenshotCallback() {}; + void OnSurfaceCapture(std::shared_ptr pixelmap) override + { + if (flag_ == false) { + flag_ = true; + pixelMap_ = pixelmap; + } + } + bool IsPixelMapOk() + { + return flag_; + } + std::shared_ptr GetPixelMap() + { + return pixelMap_; + } + private: + bool flag_ = false; + std::shared_ptr pixelMap_ = nullptr; + }; }; } // namespace OHOS::Rosen #endif // FOUNDATION_DMSERVER_ABSTRACT_DISPLAY_CONTROLLER_H \ No newline at end of file diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index 5ce9d66e28..7cfa1815b4 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -47,7 +47,7 @@ public: virtual DisplayId CreateVirtualDisplay(const VirtualDisplayInfo &virtualDisplayInfo, sptr surface) = 0; virtual bool DestroyVirtualDisplay(DisplayId displayId) = 0; - virtual sptr GetDispalySnapshot(DisplayId displayId) = 0; + virtual std::shared_ptr GetDispalySnapshot(DisplayId displayId) = 0; virtual bool SuspendBegin(PowerStateChangeReason reason) = 0; virtual bool SetDisplayState(DisplayState state) = 0; diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index 4b81d380dc..bd0f452aac 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -33,7 +33,7 @@ public: DisplayId CreateVirtualDisplay(const VirtualDisplayInfo &virtualDisplayInfo, sptr surface) override; bool DestroyVirtualDisplay(DisplayId displayId) override; - sptr GetDispalySnapshot(DisplayId displayId) override; + std::shared_ptr GetDispalySnapshot(DisplayId displayId) override; bool SuspendBegin(PowerStateChangeReason reason) override; bool SetDisplayState(DisplayState state) override; diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index c8d652a946..4e359bf53b 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -45,7 +45,7 @@ public: DisplayId GetDefaultDisplayId() override; DisplayInfo GetDisplayInfoById(DisplayId displayId) override; - sptr GetDispalySnapshot(DisplayId displayId) override; + std::shared_ptr GetDispalySnapshot(DisplayId displayId) override; bool SuspendBegin(PowerStateChangeReason reason) override; bool SetDisplayState(DisplayState state) override; diff --git a/dmserver/src/abstract_display_controller.cpp b/dmserver/src/abstract_display_controller.cpp index 9d2762ec9c..2e806f73ce 100644 --- a/dmserver/src/abstract_display_controller.cpp +++ b/dmserver/src/abstract_display_controller.cpp @@ -16,6 +16,7 @@ #include "abstract_display_controller.h" #include "window_manager_hilog.h" +#include "window_manager_service.h" #include @@ -77,14 +78,31 @@ bool AbstractDisplayController::DestroyVirtualScreen(ScreenId screenId) return true; } -sptr AbstractDisplayController::GetScreenSnapshot(ScreenId screenId) +std::shared_ptr AbstractDisplayController::GetScreenSnapshot(DisplayId displayId, ScreenId screenId) { if (rsInterface_ == nullptr) { return nullptr; } - sptr screenshot = nullptr; + std::shared_ptr displayNode = SingletonContainer::Get().GetDisplayNode(displayId); + std::shared_ptr callback = std::make_shared(); + rsInterface_->TakeSurfaceCapture(displayNode, callback); + + int counter = 0; + while (!callback->IsPixelMapOk()) { + usleep(10000); // 10000us equals to 10ms + counter++; + if (counter >= 200) { // wait for 200 * 10ms = 2s + WLOGFE("Failed to get pixelmap, timeout"); + return nullptr; + } + } + std::shared_ptr screenshot = callback->GetPixelMap(); + + if (screenshot == nullptr) { + WLOGFE("Failed to get pixelmap from RS, return nullptr!"); + } return screenshot; } } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index 55a285e2df..9449f5403c 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -135,7 +135,7 @@ bool DisplayManagerProxy::DestroyVirtualDisplay(DisplayId displayId) return reply.ReadBool(); } -sptr DisplayManagerProxy::GetDispalySnapshot(DisplayId displayId) +std::shared_ptr DisplayManagerProxy::GetDispalySnapshot(DisplayId displayId) { sptr remote = Remote(); if (remote == nullptr) { @@ -161,7 +161,7 @@ sptr DisplayManagerProxy::GetDispalySnapshot(DisplayId displayI return nullptr; } - sptr pixelMap = reply.ReadParcelable(); + std::shared_ptr pixelMap(reply.ReadParcelable()); if (pixelMap == nullptr) { WLOGFW("DisplayManagerProxy::GetDispalySnapshot SendRequest nullptr."); return nullptr; diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index a6ff2b589d..8bc4236584 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -101,10 +101,11 @@ bool DisplayManagerService::DestroyVirtualDisplay(DisplayId displayId) return AbstractDisplayController::GetInstance().DestroyVirtualScreen(screenId); } -sptr DisplayManagerService::GetDispalySnapshot(DisplayId displayId) +std::shared_ptr DisplayManagerService::GetDispalySnapshot(DisplayId displayId) { ScreenId screenId = GetScreenIdFromDisplayId(displayId); - sptr screenSnapshot = AbstractDisplayController::GetInstance().GetScreenSnapshot(screenId); + std::shared_ptr screenSnapshot + = AbstractDisplayController::GetInstance().GetScreenSnapshot(displayId, screenId); return screenSnapshot; } diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index 107d4db7b9..2f891ea006 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -64,12 +64,12 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, } case TRANS_ID_GET_DISPLAY_SNAPSHOT: { DisplayId displayId = data.ReadUint64(); - sptr dispalySnapshot = GetDispalySnapshot(displayId); + std::shared_ptr dispalySnapshot = GetDispalySnapshot(displayId); if (dispalySnapshot == nullptr) { reply.WriteParcelable(nullptr); break; } - reply.WriteParcelable(dispalySnapshot.GetRefPtr()); + reply.WriteParcelable(dispalySnapshot.get()); } case TRANS_ID_SUSPEND_BEGIN: { PowerStateChangeReason reason = static_cast(data.ReadUint32()); diff --git a/interfaces/innerkits/dm/display_manager.h b/interfaces/innerkits/dm/display_manager.h index 97ed134f2f..4a99f0e04c 100644 --- a/interfaces/innerkits/dm/display_manager.h +++ b/interfaces/innerkits/dm/display_manager.h @@ -46,8 +46,8 @@ public: sptr surface, DisplayId displayIdToMirror, int32_t flags); bool DestroyVirtualDisplay(DisplayId displayId); - sptr GetScreenshot(DisplayId displayId); - sptr GetScreenshot(DisplayId displayId, const Media::Rect &rect, + std::shared_ptr GetScreenshot(DisplayId displayId); + std::shared_ptr GetScreenshot(DisplayId displayId, const Media::Rect &rect, const Media::Size &size, int rotation); bool WakeUpBegin(PowerStateChangeReason reason); diff --git a/wmserver/include/window_manager_service.h b/wmserver/include/window_manager_service.h index 2cee42de12..883b67cde9 100644 --- a/wmserver/include/window_manager_service.h +++ b/wmserver/include/window_manager_service.h @@ -55,6 +55,7 @@ public: void RegisterFocusChangedListener(const sptr& windowManagerAgent) override; void UnregisterFocusChangedListener(const sptr& windowManagerAgent) override; + std::shared_ptr GetDisplayNode(int32_t displayId) const; // Inner interfaces WMError NotifyDisplaySuspend(); diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index 04430981cf..66b360203d 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -45,6 +45,7 @@ public: Rect GetDisplayRect() const; sptr GetTopImmersiveNode() const; void NotifySystemBarIfChanged(); + std::shared_ptr GetDisplayNode() const; private: void AssignZOrder(sptr& node); diff --git a/wmserver/src/window_manager_service.cpp b/wmserver/src/window_manager_service.cpp index 594f9a0f6c..b0fb52551f 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -214,6 +214,11 @@ void WindowManagerService::UnregisterFocusChangedListener(const sptrUnregisterFocusChangedListener(windowManagerAgent); } +std::shared_ptr WindowManagerService::GetDisplayNode(int32_t displayId) const +{ + return windowRoot_->GetOrCreateWindowNodeContainer(displayId)->GetDisplayNode(); +} + void WindowManagerService::OnWindowEvent(Event event, uint32_t windowId) { switch (event) { diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index 38dc36447e..6cb62ec786 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -451,5 +451,10 @@ Rect WindowNodeContainer::GetDisplayRect() const { return displayRect_; } + +std::shared_ptr WindowNodeContainer::GetDisplayNode() const +{ + return displayNode_; +} } } -- Gitee