From 8834e39830f3b705630dd64cf952f24caccf8d93 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 Signed-off-by: luwei --- dm/include/display_manager_adapter.h | 2 +- dm/src/display_manager.cpp | 14 +++++----- 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 | 23 ++++++++++++++-- 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, 81 insertions(+), 23 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index a1e7490f11..8f9d44ade0 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -37,7 +37,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..4c18958507 100644 --- a/dm/src/display_manager.cpp +++ b/dm/src/display_manager.cpp @@ -42,13 +42,14 @@ 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,8 +74,8 @@ bool DisplayManager::CheckRectSizeValid(int32_t param) const return true; } -sptr DisplayManager::GetScreenshot(DisplayId displayId, const Media::Rect &rect, - const Media::Size &size, int rotation) +std::shared_ptr DisplayManager::GetScreenshot(DisplayId displayId, const Media::Rect &rect, + const Media::Size &size, int rotation) { if (displayId == DISPLAY_ID_INVALD) { WLOGFE("displayId invalid!"); @@ -90,7 +91,8 @@ 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 +111,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 28e246abf1..178cf5a627 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -63,7 +63,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_); @@ -72,7 +72,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 67c8e53512..c4567139ca 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 f1c17fa5f4..39bf0635fe 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 40f24ba2a1..4d6865062e 100644 --- a/dmserver/src/abstract_display_controller.cpp +++ b/dmserver/src/abstract_display_controller.cpp @@ -19,6 +19,7 @@ #include #include "window_manager_hilog.h" +#include "window_manager_service.h" namespace OHOS::Rosen { namespace { @@ -78,14 +79,32 @@ 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 3825b07401..aed60579a7 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 7ad77df09c..1b6ad67d0d 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 3f5422220d..dce096d91e 100644 --- a/wmserver/include/window_manager_service.h +++ b/wmserver/include/window_manager_service.h @@ -54,6 +54,7 @@ public: WMError SetWindowFlags(uint32_t windowId, uint32_t flags) override; WMError SetSystemBarProperty(uint32_t windowId, WindowType type, const SystemBarProperty& prop) override; + std::shared_ptr GetDisplayNode(int32_t displayId) const; void RegisterWindowManagerAgent(WindowManagerAgentType type, const sptr& windowManagerAgent) override; void UnregisterWindowManagerAgent(WindowManagerAgentType type, diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index 4051cce404..1f2abb492f 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -51,6 +51,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 7b8478581a..56bcf64086 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -226,6 +226,11 @@ void WindowManagerService::UnregisterWindowManagerAgent(WindowManagerAgentType t windowController_->UnregisterWindowManagerAgent(type, 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 94b11f3f2c..96d5291385 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -457,5 +457,10 @@ Rect WindowNodeContainer::GetDisplayRect() const { return displayRect_; } + +std::shared_ptr WindowNodeContainer::GetDisplayNode() const +{ + return displayNode_; +} } } -- Gitee