1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License. 5e0dac50fSopenharmony_ci * You may obtain a copy of the License at 6e0dac50fSopenharmony_ci * 7e0dac50fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0dac50fSopenharmony_ci * 9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and 13e0dac50fSopenharmony_ci * limitations under the License. 14e0dac50fSopenharmony_ci */ 15e0dac50fSopenharmony_ci 16e0dac50fSopenharmony_ci#include "abstract_screen.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include <cmath> 19e0dac50fSopenharmony_ci#include "abstract_screen_controller.h" 20e0dac50fSopenharmony_ci#include "display_manager_service.h" 21e0dac50fSopenharmony_ci#include "dm_common.h" 22e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 23e0dac50fSopenharmony_ci 24e0dac50fSopenharmony_cinamespace OHOS::Rosen { 25e0dac50fSopenharmony_cinamespace { 26e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "AbstractScreenGroup"}; 27e0dac50fSopenharmony_ciconstexpr float MAX_ZORDER = 100000.0f; 28e0dac50fSopenharmony_ci} 29e0dac50fSopenharmony_ci 30e0dac50fSopenharmony_ciAbstractScreen::AbstractScreen(sptr<AbstractScreenController> screenController, const std::string& name, ScreenId dmsId, 31e0dac50fSopenharmony_ci ScreenId rsId) : dmsId_(dmsId), rsId_(rsId), screenController_(screenController) 32e0dac50fSopenharmony_ci{ 33e0dac50fSopenharmony_ci if (name != "") { 34e0dac50fSopenharmony_ci name_ = name; 35e0dac50fSopenharmony_ci } 36e0dac50fSopenharmony_ci} 37e0dac50fSopenharmony_ci 38e0dac50fSopenharmony_ciAbstractScreen::~AbstractScreen() 39e0dac50fSopenharmony_ci{ 40e0dac50fSopenharmony_ci} 41e0dac50fSopenharmony_ci 42e0dac50fSopenharmony_cisptr<SupportedScreenModes> AbstractScreen::GetActiveScreenMode() const 43e0dac50fSopenharmony_ci{ 44e0dac50fSopenharmony_ci if (activeIdx_ < 0 || activeIdx_ >= static_cast<int32_t>(modes_.size())) { 45e0dac50fSopenharmony_ci WLOGE("active mode index is wrong: %{public}d", activeIdx_); 46e0dac50fSopenharmony_ci return nullptr; 47e0dac50fSopenharmony_ci } 48e0dac50fSopenharmony_ci return modes_[activeIdx_]; 49e0dac50fSopenharmony_ci} 50e0dac50fSopenharmony_ci 51e0dac50fSopenharmony_cistd::vector<sptr<SupportedScreenModes>> AbstractScreen::GetAbstractScreenModes() const 52e0dac50fSopenharmony_ci{ 53e0dac50fSopenharmony_ci return modes_; 54e0dac50fSopenharmony_ci} 55e0dac50fSopenharmony_ci 56e0dac50fSopenharmony_cisptr<AbstractScreenGroup> AbstractScreen::GetGroup() const 57e0dac50fSopenharmony_ci{ 58e0dac50fSopenharmony_ci if (screenController_ == nullptr) { 59e0dac50fSopenharmony_ci return nullptr; 60e0dac50fSopenharmony_ci } 61e0dac50fSopenharmony_ci return screenController_->GetAbstractScreenGroup(groupDmsId_); 62e0dac50fSopenharmony_ci} 63e0dac50fSopenharmony_ci 64e0dac50fSopenharmony_cisptr<ScreenInfo> AbstractScreen::ConvertToScreenInfo() const 65e0dac50fSopenharmony_ci{ 66e0dac50fSopenharmony_ci sptr<ScreenInfo> info = new(std::nothrow) ScreenInfo(); 67e0dac50fSopenharmony_ci if (info == nullptr) { 68e0dac50fSopenharmony_ci return nullptr; 69e0dac50fSopenharmony_ci } 70e0dac50fSopenharmony_ci FillScreenInfo(info); 71e0dac50fSopenharmony_ci return info; 72e0dac50fSopenharmony_ci} 73e0dac50fSopenharmony_ci 74e0dac50fSopenharmony_civoid AbstractScreen::UpdateRSTree(std::shared_ptr<RSSurfaceNode>& surfaceNode, bool isAdd, bool needToUpdate) 75e0dac50fSopenharmony_ci{ 76e0dac50fSopenharmony_ci if (rsDisplayNode_ == nullptr || surfaceNode == nullptr) { 77e0dac50fSopenharmony_ci WLOGFE("node is nullptr"); 78e0dac50fSopenharmony_ci return; 79e0dac50fSopenharmony_ci } 80e0dac50fSopenharmony_ci WLOGFD("%{public}s surface: %{public}s, %{public}" PRIu64"", (isAdd ? "add" : "remove"), 81e0dac50fSopenharmony_ci surfaceNode->GetName().c_str(), surfaceNode->GetId()); 82e0dac50fSopenharmony_ci 83e0dac50fSopenharmony_ci if (isAdd) { 84e0dac50fSopenharmony_ci surfaceNode->SetVisible(true); 85e0dac50fSopenharmony_ci rsDisplayNode_->AddChild(surfaceNode, -1); 86e0dac50fSopenharmony_ci } else { 87e0dac50fSopenharmony_ci rsDisplayNode_->RemoveChild(surfaceNode); 88e0dac50fSopenharmony_ci } 89e0dac50fSopenharmony_ci 90e0dac50fSopenharmony_ci if (needToUpdate) { 91e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 92e0dac50fSopenharmony_ci if (isAdd) { 93e0dac50fSopenharmony_ci appSurfaceNodes_.push_back(surfaceNode); 94e0dac50fSopenharmony_ci } else { 95e0dac50fSopenharmony_ci auto iter = std::find_if(appSurfaceNodes_.begin(), appSurfaceNodes_.end(), 96e0dac50fSopenharmony_ci [surfaceNode] (std::shared_ptr<RSSurfaceNode> node) { 97e0dac50fSopenharmony_ci return surfaceNode->GetId() == node->GetId(); 98e0dac50fSopenharmony_ci }); 99e0dac50fSopenharmony_ci if (iter != appSurfaceNodes_.end()) { 100e0dac50fSopenharmony_ci appSurfaceNodes_.erase(iter); 101e0dac50fSopenharmony_ci } 102e0dac50fSopenharmony_ci } 103e0dac50fSopenharmony_ci } 104e0dac50fSopenharmony_ci} 105e0dac50fSopenharmony_ci 106e0dac50fSopenharmony_ciDMError AbstractScreen::AddSurfaceNode(std::shared_ptr<RSSurfaceNode>& surfaceNode, bool onTop, bool needToRecord) 107e0dac50fSopenharmony_ci{ 108e0dac50fSopenharmony_ci if (rsDisplayNode_ == nullptr || surfaceNode == nullptr) { 109e0dac50fSopenharmony_ci WLOGFE("node is nullptr"); 110e0dac50fSopenharmony_ci return DMError::DM_ERROR_NULLPTR; 111e0dac50fSopenharmony_ci } 112e0dac50fSopenharmony_ci surfaceNode->SetVisible(true); 113e0dac50fSopenharmony_ci if (onTop) { 114e0dac50fSopenharmony_ci rsDisplayNode_->AddChild(surfaceNode, -1); 115e0dac50fSopenharmony_ci surfaceNode->SetPositionZ(MAX_ZORDER); 116e0dac50fSopenharmony_ci } else { 117e0dac50fSopenharmony_ci rsDisplayNode_->AddChild(surfaceNode, -1); 118e0dac50fSopenharmony_ci } 119e0dac50fSopenharmony_ci if (needToRecord) { 120e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 121e0dac50fSopenharmony_ci nativeSurfaceNodes_.push_back(surfaceNode); 122e0dac50fSopenharmony_ci } 123e0dac50fSopenharmony_ci auto transactionProxy = RSTransactionProxy::GetInstance(); 124e0dac50fSopenharmony_ci if (transactionProxy != nullptr) { 125e0dac50fSopenharmony_ci transactionProxy->FlushImplicitTransaction(); 126e0dac50fSopenharmony_ci } 127e0dac50fSopenharmony_ci return DMError::DM_OK; 128e0dac50fSopenharmony_ci} 129e0dac50fSopenharmony_ci 130e0dac50fSopenharmony_ciDMError AbstractScreen::RemoveSurfaceNode(std::shared_ptr<RSSurfaceNode>& surfaceNode) 131e0dac50fSopenharmony_ci{ 132e0dac50fSopenharmony_ci if (rsDisplayNode_ == nullptr || surfaceNode == nullptr) { 133e0dac50fSopenharmony_ci WLOGFE("Node is nullptr"); 134e0dac50fSopenharmony_ci return DMError::DM_ERROR_NULLPTR; 135e0dac50fSopenharmony_ci } 136e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 137e0dac50fSopenharmony_ci auto iter = std::find_if(nativeSurfaceNodes_.begin(), nativeSurfaceNodes_.end(), [surfaceNode] 138e0dac50fSopenharmony_ci (std::shared_ptr<RSSurfaceNode> node) { 139e0dac50fSopenharmony_ci return surfaceNode->GetId() == node->GetId(); 140e0dac50fSopenharmony_ci }); 141e0dac50fSopenharmony_ci if (iter == nativeSurfaceNodes_.end()) { 142e0dac50fSopenharmony_ci WLOGFW("Child not found"); 143e0dac50fSopenharmony_ci return DMError::DM_ERROR_INVALID_PARAM; 144e0dac50fSopenharmony_ci } 145e0dac50fSopenharmony_ci rsDisplayNode_->RemoveChild(*iter); 146e0dac50fSopenharmony_ci nativeSurfaceNodes_.erase(iter); 147e0dac50fSopenharmony_ci auto transactionProxy = RSTransactionProxy::GetInstance(); 148e0dac50fSopenharmony_ci if (transactionProxy != nullptr) { 149e0dac50fSopenharmony_ci transactionProxy->FlushImplicitTransaction(); 150e0dac50fSopenharmony_ci } 151e0dac50fSopenharmony_ci return DMError::DM_OK; 152e0dac50fSopenharmony_ci} 153e0dac50fSopenharmony_ci 154e0dac50fSopenharmony_civoid AbstractScreen::UpdateDisplayGroupRSTree(std::shared_ptr<RSSurfaceNode>& surfaceNode, NodeId parentNodeId, 155e0dac50fSopenharmony_ci bool isAdd) 156e0dac50fSopenharmony_ci{ 157e0dac50fSopenharmony_ci if (rsDisplayNode_ == nullptr || surfaceNode == nullptr) { 158e0dac50fSopenharmony_ci WLOGFE("node is nullptr"); 159e0dac50fSopenharmony_ci return; 160e0dac50fSopenharmony_ci } 161e0dac50fSopenharmony_ci WLOGFI("%{public}s surface: %{public}s, %{public}" PRIu64"", (isAdd ? "add" : "remove"), 162e0dac50fSopenharmony_ci surfaceNode->GetName().c_str(), surfaceNode->GetId()); 163e0dac50fSopenharmony_ci 164e0dac50fSopenharmony_ci if (isAdd) { 165e0dac50fSopenharmony_ci surfaceNode->SetVisible(true); 166e0dac50fSopenharmony_ci rsDisplayNode_->AddCrossParentChild(surfaceNode, -1); 167e0dac50fSopenharmony_ci } else { 168e0dac50fSopenharmony_ci rsDisplayNode_->RemoveCrossParentChild(surfaceNode, parentNodeId); 169e0dac50fSopenharmony_ci } 170e0dac50fSopenharmony_ci} 171e0dac50fSopenharmony_ci 172e0dac50fSopenharmony_civoid AbstractScreen::SetPropertyForDisplayNode(const std::shared_ptr<RSDisplayNode>& rsDisplayNode, 173e0dac50fSopenharmony_ci const RSDisplayNodeConfig& config, const Point& startPoint) 174e0dac50fSopenharmony_ci{ 175e0dac50fSopenharmony_ci rSDisplayNodeConfig_ = config; 176e0dac50fSopenharmony_ci startPoint_ = startPoint; 177e0dac50fSopenharmony_ci WLOGFI("SetDisplayOffset: posX:%{public}d, posY:%{public}d", startPoint.posX_, startPoint.posY_); 178e0dac50fSopenharmony_ci rsDisplayNode->SetDisplayOffset(startPoint.posX_, startPoint.posY_); 179e0dac50fSopenharmony_ci uint32_t width = 0; 180e0dac50fSopenharmony_ci uint32_t height = 0; 181e0dac50fSopenharmony_ci sptr<SupportedScreenModes> abstractScreenModes = GetActiveScreenMode(); 182e0dac50fSopenharmony_ci if (abstractScreenModes != nullptr) { 183e0dac50fSopenharmony_ci height = abstractScreenModes->height_; 184e0dac50fSopenharmony_ci width = abstractScreenModes->width_; 185e0dac50fSopenharmony_ci } 186e0dac50fSopenharmony_ci RSScreenType screenType; 187e0dac50fSopenharmony_ci auto ret = RSInterfaces::GetInstance().GetScreenType(rsId_, screenType); 188e0dac50fSopenharmony_ci if (ret == StatusCode::SUCCESS && screenType == RSScreenType::VIRTUAL_TYPE_SCREEN) { 189e0dac50fSopenharmony_ci rsDisplayNode->SetSecurityDisplay(true); 190e0dac50fSopenharmony_ci WLOGFI("virtualScreen SetSecurityDisplay success"); 191e0dac50fSopenharmony_ci } 192e0dac50fSopenharmony_ci // If setDisplayOffset is not valid for SetFrame/SetBounds 193e0dac50fSopenharmony_ci rsDisplayNode->SetFrame(0, 0, width, height); 194e0dac50fSopenharmony_ci rsDisplayNode->SetBounds(0, 0, width, height); 195e0dac50fSopenharmony_ci} 196e0dac50fSopenharmony_ci 197e0dac50fSopenharmony_civoid AbstractScreen::InitRSDisplayNode(const RSDisplayNodeConfig& config, const Point& startPoint) 198e0dac50fSopenharmony_ci{ 199e0dac50fSopenharmony_ci if (rsDisplayNode_ != nullptr) { 200e0dac50fSopenharmony_ci rsDisplayNode_->SetDisplayNodeMirrorConfig(config); 201e0dac50fSopenharmony_ci WLOGFD("RSDisplayNode is not null"); 202e0dac50fSopenharmony_ci } else { 203e0dac50fSopenharmony_ci WLOGFD("Create rsDisplayNode"); 204e0dac50fSopenharmony_ci std::shared_ptr<RSDisplayNode> rsDisplayNode = RSDisplayNode::Create(config); 205e0dac50fSopenharmony_ci if (rsDisplayNode == nullptr) { 206e0dac50fSopenharmony_ci WLOGE("fail to add child. create rsDisplayNode fail!"); 207e0dac50fSopenharmony_ci return; 208e0dac50fSopenharmony_ci } 209e0dac50fSopenharmony_ci rsDisplayNode_ = rsDisplayNode; 210e0dac50fSopenharmony_ci } 211e0dac50fSopenharmony_ci SetPropertyForDisplayNode(rsDisplayNode_, config, startPoint); 212e0dac50fSopenharmony_ci 213e0dac50fSopenharmony_ci // flush transaction 214e0dac50fSopenharmony_ci auto transactionProxy = RSTransactionProxy::GetInstance(); 215e0dac50fSopenharmony_ci if (transactionProxy != nullptr) { 216e0dac50fSopenharmony_ci transactionProxy->FlushImplicitTransaction(); 217e0dac50fSopenharmony_ci } 218e0dac50fSopenharmony_ci WLOGFD("InitRSDisplayNode success"); 219e0dac50fSopenharmony_ci} 220e0dac50fSopenharmony_ci 221e0dac50fSopenharmony_civoid AbstractScreen::InitRSDefaultDisplayNode(const RSDisplayNodeConfig& config, const Point& startPoint) 222e0dac50fSopenharmony_ci{ 223e0dac50fSopenharmony_ci if (rsDisplayNode_ == nullptr) { 224e0dac50fSopenharmony_ci WLOGFD("RSDisplayNode is nullptr"); 225e0dac50fSopenharmony_ci } 226e0dac50fSopenharmony_ci 227e0dac50fSopenharmony_ci WLOGFD("Create defaultRSDisplayNode"); 228e0dac50fSopenharmony_ci std::shared_ptr<RSDisplayNode> rsDisplayNode = RSDisplayNode::Create(config); 229e0dac50fSopenharmony_ci if (rsDisplayNode == nullptr) { 230e0dac50fSopenharmony_ci WLOGE("fail to add child. create rsDisplayNode fail!"); 231e0dac50fSopenharmony_ci return; 232e0dac50fSopenharmony_ci } 233e0dac50fSopenharmony_ci rsDisplayNode_ = rsDisplayNode; 234e0dac50fSopenharmony_ci SetPropertyForDisplayNode(rsDisplayNode_, config, startPoint); 235e0dac50fSopenharmony_ci 236e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 237e0dac50fSopenharmony_ci // update RSTree for default display 238e0dac50fSopenharmony_ci for (auto node: appSurfaceNodes_) { 239e0dac50fSopenharmony_ci UpdateRSTree(node, true, false); 240e0dac50fSopenharmony_ci } 241e0dac50fSopenharmony_ci for (auto node: nativeSurfaceNodes_) { 242e0dac50fSopenharmony_ci AddSurfaceNode(node, false, false); 243e0dac50fSopenharmony_ci } 244e0dac50fSopenharmony_ci 245e0dac50fSopenharmony_ci // flush transaction 246e0dac50fSopenharmony_ci auto transactionProxy = RSTransactionProxy::GetInstance(); 247e0dac50fSopenharmony_ci if (transactionProxy != nullptr) { 248e0dac50fSopenharmony_ci transactionProxy->FlushImplicitTransaction(); 249e0dac50fSopenharmony_ci } 250e0dac50fSopenharmony_ci WLOGFD("InitRSDefaultDisplayNode success"); 251e0dac50fSopenharmony_ci} 252e0dac50fSopenharmony_ci 253e0dac50fSopenharmony_civoid AbstractScreen::UpdateRSDisplayNode(Point startPoint) 254e0dac50fSopenharmony_ci{ 255e0dac50fSopenharmony_ci WLOGD("update display offset from [%{public}d %{public}d] to [%{public}d %{public}d]", 256e0dac50fSopenharmony_ci startPoint_.posX_, startPoint_.posY_, startPoint.posX_, startPoint.posY_); 257e0dac50fSopenharmony_ci if (rsDisplayNode_ == nullptr) { 258e0dac50fSopenharmony_ci WLOGFD("rsDisplayNode_ is nullptr"); 259e0dac50fSopenharmony_ci return; 260e0dac50fSopenharmony_ci } 261e0dac50fSopenharmony_ci 262e0dac50fSopenharmony_ci startPoint_ = startPoint; 263e0dac50fSopenharmony_ci rsDisplayNode_->SetDisplayOffset(startPoint.posX_, startPoint.posY_); 264e0dac50fSopenharmony_ci} 265e0dac50fSopenharmony_ci 266e0dac50fSopenharmony_ciScreenId AbstractScreen::GetScreenGroupId() const 267e0dac50fSopenharmony_ci{ 268e0dac50fSopenharmony_ci return groupDmsId_; 269e0dac50fSopenharmony_ci} 270e0dac50fSopenharmony_ci 271e0dac50fSopenharmony_ciDMError AbstractScreen::GetScreenSupportedColorGamuts(std::vector<ScreenColorGamut>& colorGamuts) 272e0dac50fSopenharmony_ci{ 273e0dac50fSopenharmony_ci auto ret = RSInterfaces::GetInstance().GetScreenSupportedColorGamuts(rsId_, colorGamuts); 274e0dac50fSopenharmony_ci if (ret != StatusCode::SUCCESS) { 275e0dac50fSopenharmony_ci WLOGE("GetScreenSupportedColorGamuts fail! rsId %{public}" PRIu64"", rsId_); 276e0dac50fSopenharmony_ci return DMError::DM_ERROR_RENDER_SERVICE_FAILED; 277e0dac50fSopenharmony_ci } 278e0dac50fSopenharmony_ci WLOGI("GetScreenSupportedColorGamuts ok! rsId %{public}" PRIu64", size %{public}u", 279e0dac50fSopenharmony_ci rsId_, static_cast<uint32_t>(colorGamuts.size())); 280e0dac50fSopenharmony_ci 281e0dac50fSopenharmony_ci return DMError::DM_OK; 282e0dac50fSopenharmony_ci} 283e0dac50fSopenharmony_ci 284e0dac50fSopenharmony_ciDMError AbstractScreen::GetScreenColorGamut(ScreenColorGamut& colorGamut) 285e0dac50fSopenharmony_ci{ 286e0dac50fSopenharmony_ci auto ret = RSInterfaces::GetInstance().GetScreenColorGamut(rsId_, colorGamut); 287e0dac50fSopenharmony_ci if (ret != StatusCode::SUCCESS) { 288e0dac50fSopenharmony_ci WLOGE("GetScreenColorGamut fail! rsId %{public}" PRIu64"", rsId_); 289e0dac50fSopenharmony_ci return DMError::DM_ERROR_RENDER_SERVICE_FAILED; 290e0dac50fSopenharmony_ci } 291e0dac50fSopenharmony_ci WLOGI("GetScreenColorGamut ok! rsId %{public}" PRIu64", colorGamut %{public}u", 292e0dac50fSopenharmony_ci rsId_, static_cast<uint32_t>(colorGamut)); 293e0dac50fSopenharmony_ci 294e0dac50fSopenharmony_ci return DMError::DM_OK; 295e0dac50fSopenharmony_ci} 296e0dac50fSopenharmony_ci 297e0dac50fSopenharmony_ciDMError AbstractScreen::SetScreenColorGamut(int32_t colorGamutIdx) 298e0dac50fSopenharmony_ci{ 299e0dac50fSopenharmony_ci std::vector<ScreenColorGamut> colorGamuts; 300e0dac50fSopenharmony_ci DMError res = GetScreenSupportedColorGamuts(colorGamuts); 301e0dac50fSopenharmony_ci if (res != DMError::DM_OK) { 302e0dac50fSopenharmony_ci WLOGE("SetScreenColorGamut fail! rsId %{public}" PRIu64"", rsId_); 303e0dac50fSopenharmony_ci return res; 304e0dac50fSopenharmony_ci } 305e0dac50fSopenharmony_ci if (colorGamutIdx < 0 || colorGamutIdx >= static_cast<int32_t>(colorGamuts.size())) { 306e0dac50fSopenharmony_ci WLOGE("SetScreenColorGamut fail! rsId %{public}" PRIu64" colorGamutIdx %{public}d invalid.", 307e0dac50fSopenharmony_ci rsId_, colorGamutIdx); 308e0dac50fSopenharmony_ci return DMError::DM_ERROR_INVALID_PARAM; 309e0dac50fSopenharmony_ci } 310e0dac50fSopenharmony_ci auto ret = RSInterfaces::GetInstance().SetScreenColorGamut(rsId_, colorGamutIdx); 311e0dac50fSopenharmony_ci if (ret != StatusCode::SUCCESS) { 312e0dac50fSopenharmony_ci WLOGE("SetScreenColorGamut fail! rsId %{public}" PRIu64"", rsId_); 313e0dac50fSopenharmony_ci return DMError::DM_ERROR_RENDER_SERVICE_FAILED; 314e0dac50fSopenharmony_ci } 315e0dac50fSopenharmony_ci WLOGI("SetScreenColorGamut ok! rsId %{public}" PRIu64", colorGamutIdx %{public}u", 316e0dac50fSopenharmony_ci rsId_, colorGamutIdx); 317e0dac50fSopenharmony_ci 318e0dac50fSopenharmony_ci return DMError::DM_OK; 319e0dac50fSopenharmony_ci} 320e0dac50fSopenharmony_ci 321e0dac50fSopenharmony_ciDMError AbstractScreen::GetScreenGamutMap(ScreenGamutMap& gamutMap) 322e0dac50fSopenharmony_ci{ 323e0dac50fSopenharmony_ci auto ret = RSInterfaces::GetInstance().GetScreenGamutMap(rsId_, gamutMap); 324e0dac50fSopenharmony_ci if (ret != StatusCode::SUCCESS) { 325e0dac50fSopenharmony_ci WLOGE("GetScreenGamutMap fail! rsId %{public}" PRIu64"", rsId_); 326e0dac50fSopenharmony_ci return DMError::DM_ERROR_RENDER_SERVICE_FAILED; 327e0dac50fSopenharmony_ci } 328e0dac50fSopenharmony_ci WLOGI("GetScreenGamutMap ok! rsId %{public}" PRIu64", gamutMap %{public}u", 329e0dac50fSopenharmony_ci rsId_, static_cast<uint32_t>(gamutMap)); 330e0dac50fSopenharmony_ci 331e0dac50fSopenharmony_ci return DMError::DM_OK; 332e0dac50fSopenharmony_ci} 333e0dac50fSopenharmony_ci 334e0dac50fSopenharmony_ciDMError AbstractScreen::SetScreenGamutMap(ScreenGamutMap gamutMap) 335e0dac50fSopenharmony_ci{ 336e0dac50fSopenharmony_ci if (gamutMap > GAMUT_MAP_HDR_EXTENSION) { 337e0dac50fSopenharmony_ci return DMError::DM_ERROR_INVALID_PARAM; 338e0dac50fSopenharmony_ci } 339e0dac50fSopenharmony_ci auto ret = RSInterfaces::GetInstance().SetScreenGamutMap(rsId_, gamutMap); 340e0dac50fSopenharmony_ci if (ret != StatusCode::SUCCESS) { 341e0dac50fSopenharmony_ci WLOGE("SetScreenGamutMap fail! rsId %{public}" PRIu64"", rsId_); 342e0dac50fSopenharmony_ci return DMError::DM_ERROR_RENDER_SERVICE_FAILED; 343e0dac50fSopenharmony_ci } 344e0dac50fSopenharmony_ci WLOGI("SetScreenGamutMap ok! rsId %{public}" PRIu64", gamutMap %{public}u", 345e0dac50fSopenharmony_ci rsId_, static_cast<uint32_t>(gamutMap)); 346e0dac50fSopenharmony_ci 347e0dac50fSopenharmony_ci return DMError::DM_OK; 348e0dac50fSopenharmony_ci} 349e0dac50fSopenharmony_ci 350e0dac50fSopenharmony_ciDMError AbstractScreen::SetScreenColorTransform() 351e0dac50fSopenharmony_ci{ 352e0dac50fSopenharmony_ci WLOGI("SetScreenColorTransform ok! rsId %{public}" PRIu64"", rsId_); 353e0dac50fSopenharmony_ci 354e0dac50fSopenharmony_ci return DMError::DM_OK; 355e0dac50fSopenharmony_ci} 356e0dac50fSopenharmony_ci 357e0dac50fSopenharmony_civoid AbstractScreen::FillScreenInfo(sptr<ScreenInfo> info) const 358e0dac50fSopenharmony_ci{ 359e0dac50fSopenharmony_ci if (info == nullptr) { 360e0dac50fSopenharmony_ci WLOGE("FillScreenInfo failed! info is nullptr"); 361e0dac50fSopenharmony_ci return; 362e0dac50fSopenharmony_ci } 363e0dac50fSopenharmony_ci info->id_ = dmsId_; 364e0dac50fSopenharmony_ci info->name_ = name_; 365e0dac50fSopenharmony_ci uint32_t width = 0; 366e0dac50fSopenharmony_ci uint32_t height = 0; 367e0dac50fSopenharmony_ci sptr<SupportedScreenModes> abstractScreenModes = GetActiveScreenMode(); 368e0dac50fSopenharmony_ci if (abstractScreenModes != nullptr) { 369e0dac50fSopenharmony_ci height = abstractScreenModes->height_; 370e0dac50fSopenharmony_ci width = abstractScreenModes->width_; 371e0dac50fSopenharmony_ci } 372e0dac50fSopenharmony_ci float virtualPixelRatio = virtualPixelRatio_; 373e0dac50fSopenharmony_ci // "< 1e-6" means virtualPixelRatio is 0. 374e0dac50fSopenharmony_ci if (fabsf(virtualPixelRatio) < 1e-6) { 375e0dac50fSopenharmony_ci virtualPixelRatio = 1.0f; 376e0dac50fSopenharmony_ci } 377e0dac50fSopenharmony_ci ScreenSourceMode sourceMode = GetSourceMode(); 378e0dac50fSopenharmony_ci info->virtualPixelRatio_ = virtualPixelRatio; 379e0dac50fSopenharmony_ci info->virtualHeight_ = height / virtualPixelRatio; 380e0dac50fSopenharmony_ci info->virtualWidth_ = width / virtualPixelRatio; 381e0dac50fSopenharmony_ci info->lastParent_ = lastGroupDmsId_; 382e0dac50fSopenharmony_ci info->parent_ = groupDmsId_; 383e0dac50fSopenharmony_ci info->isScreenGroup_ = isScreenGroup_; 384e0dac50fSopenharmony_ci info->rotation_ = rotation_; 385e0dac50fSopenharmony_ci info->orientation_ = orientation_; 386e0dac50fSopenharmony_ci info->sourceMode_ = sourceMode; 387e0dac50fSopenharmony_ci info->type_ = type_; 388e0dac50fSopenharmony_ci info->modeId_ = activeIdx_; 389e0dac50fSopenharmony_ci info->modes_ = modes_; 390e0dac50fSopenharmony_ci} 391e0dac50fSopenharmony_ci 392e0dac50fSopenharmony_cibool AbstractScreen::SetOrientation(Orientation orientation) 393e0dac50fSopenharmony_ci{ 394e0dac50fSopenharmony_ci orientation_ = orientation; 395e0dac50fSopenharmony_ci return true; 396e0dac50fSopenharmony_ci} 397e0dac50fSopenharmony_ci 398e0dac50fSopenharmony_cibool AbstractScreen::SetVirtualPixelRatio(float virtualPixelRatio) 399e0dac50fSopenharmony_ci{ 400e0dac50fSopenharmony_ci virtualPixelRatio_ = virtualPixelRatio; 401e0dac50fSopenharmony_ci return true; 402e0dac50fSopenharmony_ci} 403e0dac50fSopenharmony_ci 404e0dac50fSopenharmony_cifloat AbstractScreen::GetVirtualPixelRatio() const 405e0dac50fSopenharmony_ci{ 406e0dac50fSopenharmony_ci return virtualPixelRatio_; 407e0dac50fSopenharmony_ci} 408e0dac50fSopenharmony_ci 409e0dac50fSopenharmony_ciScreenSourceMode AbstractScreen::GetSourceMode() const 410e0dac50fSopenharmony_ci{ 411e0dac50fSopenharmony_ci sptr<AbstractScreenGroup> abstractScreenGroup = GetGroup(); 412e0dac50fSopenharmony_ci if (abstractScreenGroup == nullptr || screenController_ == nullptr) { 413e0dac50fSopenharmony_ci return ScreenSourceMode::SCREEN_ALONE; 414e0dac50fSopenharmony_ci } 415e0dac50fSopenharmony_ci ScreenId defaultId = screenController_->GetDefaultAbstractScreenId(); 416e0dac50fSopenharmony_ci if (dmsId_ == defaultId) { 417e0dac50fSopenharmony_ci return ScreenSourceMode::SCREEN_MAIN; 418e0dac50fSopenharmony_ci } 419e0dac50fSopenharmony_ci ScreenCombination combination = abstractScreenGroup->GetScreenCombination(); 420e0dac50fSopenharmony_ci switch (combination) { 421e0dac50fSopenharmony_ci case ScreenCombination::SCREEN_MIRROR: { 422e0dac50fSopenharmony_ci return ScreenSourceMode::SCREEN_MIRROR; 423e0dac50fSopenharmony_ci } 424e0dac50fSopenharmony_ci case ScreenCombination::SCREEN_EXPAND: { 425e0dac50fSopenharmony_ci return ScreenSourceMode::SCREEN_EXTEND; 426e0dac50fSopenharmony_ci } 427e0dac50fSopenharmony_ci case ScreenCombination::SCREEN_ALONE: { 428e0dac50fSopenharmony_ci return ScreenSourceMode::SCREEN_ALONE; 429e0dac50fSopenharmony_ci } 430e0dac50fSopenharmony_ci default: { 431e0dac50fSopenharmony_ci return ScreenSourceMode::SCREEN_ALONE; 432e0dac50fSopenharmony_ci } 433e0dac50fSopenharmony_ci } 434e0dac50fSopenharmony_ci} 435e0dac50fSopenharmony_ci 436e0dac50fSopenharmony_ciRotation AbstractScreen::CalcRotation(Orientation orientation) const 437e0dac50fSopenharmony_ci{ 438e0dac50fSopenharmony_ci sptr<SupportedScreenModes> info = GetActiveScreenMode(); 439e0dac50fSopenharmony_ci if (info == nullptr) { 440e0dac50fSopenharmony_ci return Rotation::ROTATION_0; 441e0dac50fSopenharmony_ci } 442e0dac50fSopenharmony_ci // vertical: phone(Plugin screen); horizontal: pad & external screen 443e0dac50fSopenharmony_ci bool isVerticalScreen = info->width_ < info->height_; 444e0dac50fSopenharmony_ci switch (orientation) { 445e0dac50fSopenharmony_ci case Orientation::UNSPECIFIED: { 446e0dac50fSopenharmony_ci return Rotation::ROTATION_0; 447e0dac50fSopenharmony_ci } 448e0dac50fSopenharmony_ci case Orientation::VERTICAL: { 449e0dac50fSopenharmony_ci return isVerticalScreen ? Rotation::ROTATION_0 : Rotation::ROTATION_90; 450e0dac50fSopenharmony_ci } 451e0dac50fSopenharmony_ci case Orientation::HORIZONTAL: { 452e0dac50fSopenharmony_ci return isVerticalScreen ? Rotation::ROTATION_90 : Rotation::ROTATION_0; 453e0dac50fSopenharmony_ci } 454e0dac50fSopenharmony_ci case Orientation::REVERSE_VERTICAL: { 455e0dac50fSopenharmony_ci return isVerticalScreen ? Rotation::ROTATION_180 : Rotation::ROTATION_270; 456e0dac50fSopenharmony_ci } 457e0dac50fSopenharmony_ci case Orientation::REVERSE_HORIZONTAL: { 458e0dac50fSopenharmony_ci return isVerticalScreen ? Rotation::ROTATION_270 : Rotation::ROTATION_180; 459e0dac50fSopenharmony_ci } 460e0dac50fSopenharmony_ci default: { 461e0dac50fSopenharmony_ci WLOGE("unknown orientation %{public}u", orientation); 462e0dac50fSopenharmony_ci return Rotation::ROTATION_0; 463e0dac50fSopenharmony_ci } 464e0dac50fSopenharmony_ci } 465e0dac50fSopenharmony_ci} 466e0dac50fSopenharmony_ci 467e0dac50fSopenharmony_ciconst std::string& AbstractScreen::GetScreenName() const 468e0dac50fSopenharmony_ci{ 469e0dac50fSopenharmony_ci return name_; 470e0dac50fSopenharmony_ci} 471e0dac50fSopenharmony_ci 472e0dac50fSopenharmony_civoid AbstractScreen::SetPhyWidth(uint32_t phyWidth) 473e0dac50fSopenharmony_ci{ 474e0dac50fSopenharmony_ci phyWidth_ = phyWidth; 475e0dac50fSopenharmony_ci} 476e0dac50fSopenharmony_ci 477e0dac50fSopenharmony_civoid AbstractScreen::SetPhyHeight(uint32_t phyHeight) 478e0dac50fSopenharmony_ci{ 479e0dac50fSopenharmony_ci phyHeight_ = phyHeight; 480e0dac50fSopenharmony_ci} 481e0dac50fSopenharmony_ci 482e0dac50fSopenharmony_ciuint32_t AbstractScreen::GetPhyWidth() const 483e0dac50fSopenharmony_ci{ 484e0dac50fSopenharmony_ci return phyWidth_; 485e0dac50fSopenharmony_ci} 486e0dac50fSopenharmony_ci 487e0dac50fSopenharmony_ciuint32_t AbstractScreen::GetPhyHeight() const 488e0dac50fSopenharmony_ci{ 489e0dac50fSopenharmony_ci return phyHeight_; 490e0dac50fSopenharmony_ci} 491e0dac50fSopenharmony_ci 492e0dac50fSopenharmony_ciAbstractScreenGroup::AbstractScreenGroup(sptr<AbstractScreenController> screenController, ScreenId dmsId, ScreenId rsId, 493e0dac50fSopenharmony_ci std::string name, ScreenCombination combination) : AbstractScreen(screenController, name, dmsId, rsId), 494e0dac50fSopenharmony_ci combination_(combination) 495e0dac50fSopenharmony_ci{ 496e0dac50fSopenharmony_ci type_ = ScreenType::UNDEFINED; 497e0dac50fSopenharmony_ci isScreenGroup_ = true; 498e0dac50fSopenharmony_ci} 499e0dac50fSopenharmony_ci 500e0dac50fSopenharmony_ciAbstractScreenGroup::~AbstractScreenGroup() 501e0dac50fSopenharmony_ci{ 502e0dac50fSopenharmony_ci rsDisplayNode_ = nullptr; 503e0dac50fSopenharmony_ci} 504e0dac50fSopenharmony_ci 505e0dac50fSopenharmony_cisptr<ScreenGroupInfo> AbstractScreenGroup::ConvertToScreenGroupInfo() const 506e0dac50fSopenharmony_ci{ 507e0dac50fSopenharmony_ci sptr<ScreenGroupInfo> screenGroupInfo = new(std::nothrow) ScreenGroupInfo(); 508e0dac50fSopenharmony_ci if (screenGroupInfo == nullptr) { 509e0dac50fSopenharmony_ci return nullptr; 510e0dac50fSopenharmony_ci } 511e0dac50fSopenharmony_ci FillScreenInfo(screenGroupInfo); 512e0dac50fSopenharmony_ci screenGroupInfo->combination_ = combination_; 513e0dac50fSopenharmony_ci for (auto iter = screenMap_.begin(); iter != screenMap_.end(); iter++) { 514e0dac50fSopenharmony_ci screenGroupInfo->children_.push_back(iter->first); 515e0dac50fSopenharmony_ci screenGroupInfo->position_.push_back(iter->second->startPoint_); 516e0dac50fSopenharmony_ci } 517e0dac50fSopenharmony_ci return screenGroupInfo; 518e0dac50fSopenharmony_ci} 519e0dac50fSopenharmony_ci 520e0dac50fSopenharmony_cibool AbstractScreenGroup::GetRSDisplayNodeConfig(sptr<AbstractScreen>& dmsScreen, struct RSDisplayNodeConfig& config) 521e0dac50fSopenharmony_ci{ 522e0dac50fSopenharmony_ci if (dmsScreen == nullptr) { 523e0dac50fSopenharmony_ci WLOGE("dmsScreen is nullptr."); 524e0dac50fSopenharmony_ci return false; 525e0dac50fSopenharmony_ci } 526e0dac50fSopenharmony_ci config = { dmsScreen->rsId_ }; 527e0dac50fSopenharmony_ci switch (combination_) { 528e0dac50fSopenharmony_ci case ScreenCombination::SCREEN_ALONE: 529e0dac50fSopenharmony_ci [[fallthrough]]; 530e0dac50fSopenharmony_ci case ScreenCombination::SCREEN_EXPAND: 531e0dac50fSopenharmony_ci break; 532e0dac50fSopenharmony_ci case ScreenCombination::SCREEN_MIRROR: { 533e0dac50fSopenharmony_ci if (GetChildCount() == 0 || mirrorScreenId_ == dmsScreen->dmsId_) { 534e0dac50fSopenharmony_ci WLOGI("AddChild, SCREEN_MIRROR, config is not mirror"); 535e0dac50fSopenharmony_ci break; 536e0dac50fSopenharmony_ci } 537e0dac50fSopenharmony_ci if (screenController_ == nullptr) { 538e0dac50fSopenharmony_ci return false; 539e0dac50fSopenharmony_ci } 540e0dac50fSopenharmony_ci if (mirrorScreenId_ == SCREEN_ID_INVALID || !HasChild(mirrorScreenId_)) { 541e0dac50fSopenharmony_ci WLOGI("AddChild, mirrorScreenId_ is invalid, use default screen"); 542e0dac50fSopenharmony_ci mirrorScreenId_ = screenController_->GetDefaultAbstractScreenId(); 543e0dac50fSopenharmony_ci } 544e0dac50fSopenharmony_ci // Todo displayNode is nullptr 545e0dac50fSopenharmony_ci std::shared_ptr<RSDisplayNode> displayNode = screenController_->GetRSDisplayNodeByScreenId(mirrorScreenId_); 546e0dac50fSopenharmony_ci if (displayNode == nullptr) { 547e0dac50fSopenharmony_ci WLOGFE("AddChild fail, displayNode is nullptr, cannot get DisplayNode"); 548e0dac50fSopenharmony_ci break; 549e0dac50fSopenharmony_ci } 550e0dac50fSopenharmony_ci NodeId nodeId = displayNode->GetId(); 551e0dac50fSopenharmony_ci WLOGI("AddChild, mirrorScreenId_:%{public}" PRIu64", rsId_:%{public}" PRIu64", nodeId:%{public}" PRIu64"", 552e0dac50fSopenharmony_ci mirrorScreenId_, dmsScreen->rsId_, nodeId); 553e0dac50fSopenharmony_ci config = {dmsScreen->rsId_, true, nodeId}; 554e0dac50fSopenharmony_ci break; 555e0dac50fSopenharmony_ci } 556e0dac50fSopenharmony_ci default: 557e0dac50fSopenharmony_ci WLOGE("fail to add child. invalid group combination:%{public}u", combination_); 558e0dac50fSopenharmony_ci return false; 559e0dac50fSopenharmony_ci } 560e0dac50fSopenharmony_ci return true; 561e0dac50fSopenharmony_ci} 562e0dac50fSopenharmony_ci 563e0dac50fSopenharmony_cibool AbstractScreenGroup::AddChild(sptr<AbstractScreen>& dmsScreen, Point& startPoint) 564e0dac50fSopenharmony_ci{ 565e0dac50fSopenharmony_ci if (dmsScreen == nullptr) { 566e0dac50fSopenharmony_ci WLOGE("AddChild, dmsScreen is nullptr."); 567e0dac50fSopenharmony_ci return false; 568e0dac50fSopenharmony_ci } 569e0dac50fSopenharmony_ci ScreenId screenId = dmsScreen->dmsId_; 570e0dac50fSopenharmony_ci WLOGFD("AbstractScreenGroup AddChild dmsScreenId: %{public}" PRIu64"", screenId); 571e0dac50fSopenharmony_ci auto iter = screenMap_.find(screenId); 572e0dac50fSopenharmony_ci if (iter != screenMap_.end()) { 573e0dac50fSopenharmony_ci if (dmsScreen->rsDisplayNode_ != nullptr && dmsScreen->type_ == ScreenType::REAL && 574e0dac50fSopenharmony_ci defaultScreenId_ == screenId) { 575e0dac50fSopenharmony_ci WLOGFD("Add default screen, id: %{public}" PRIu64"", screenId); 576e0dac50fSopenharmony_ci } else { 577e0dac50fSopenharmony_ci WLOGE("AddChild, screenMap_ has dmsScreen:%{public}" PRIu64"", screenId); 578e0dac50fSopenharmony_ci return false; 579e0dac50fSopenharmony_ci } 580e0dac50fSopenharmony_ci } 581e0dac50fSopenharmony_ci struct RSDisplayNodeConfig config; 582e0dac50fSopenharmony_ci if (!GetRSDisplayNodeConfig(dmsScreen, config)) { 583e0dac50fSopenharmony_ci return false; 584e0dac50fSopenharmony_ci } 585e0dac50fSopenharmony_ci if (dmsScreen->rsDisplayNode_ != nullptr && dmsScreen->type_ == ScreenType::REAL && 586e0dac50fSopenharmony_ci defaultScreenId_ == screenId) { 587e0dac50fSopenharmony_ci WLOGFD("Reconnect default screen, screenId: %{public}" PRIu64"", screenId); 588e0dac50fSopenharmony_ci dmsScreen->InitRSDefaultDisplayNode(config, startPoint); 589e0dac50fSopenharmony_ci } else { 590e0dac50fSopenharmony_ci dmsScreen->InitRSDisplayNode(config, startPoint); 591e0dac50fSopenharmony_ci dmsScreen->lastGroupDmsId_ = dmsScreen->groupDmsId_; 592e0dac50fSopenharmony_ci dmsScreen->groupDmsId_ = dmsId_; 593e0dac50fSopenharmony_ci screenMap_.insert(std::make_pair(screenId, dmsScreen)); 594e0dac50fSopenharmony_ci } 595e0dac50fSopenharmony_ci return true; 596e0dac50fSopenharmony_ci} 597e0dac50fSopenharmony_ci 598e0dac50fSopenharmony_cibool AbstractScreenGroup::AddChildren(std::vector<sptr<AbstractScreen>>& dmsScreens, std::vector<Point>& startPoints) 599e0dac50fSopenharmony_ci{ 600e0dac50fSopenharmony_ci size_t size = dmsScreens.size(); 601e0dac50fSopenharmony_ci if (size != startPoints.size()) { 602e0dac50fSopenharmony_ci WLOGE("AddChildren, unequal size."); 603e0dac50fSopenharmony_ci return false; 604e0dac50fSopenharmony_ci } 605e0dac50fSopenharmony_ci bool res = true; 606e0dac50fSopenharmony_ci for (size_t i = 0; i < size; i++) { 607e0dac50fSopenharmony_ci res = AddChild(dmsScreens[i], startPoints[i]) && res; 608e0dac50fSopenharmony_ci } 609e0dac50fSopenharmony_ci return res; 610e0dac50fSopenharmony_ci} 611e0dac50fSopenharmony_ci 612e0dac50fSopenharmony_cibool AbstractScreenGroup::RemoveChild(sptr<AbstractScreen>& dmsScreen) 613e0dac50fSopenharmony_ci{ 614e0dac50fSopenharmony_ci if (dmsScreen == nullptr) { 615e0dac50fSopenharmony_ci WLOGE("RemoveChild, dmsScreen is nullptr."); 616e0dac50fSopenharmony_ci return false; 617e0dac50fSopenharmony_ci } 618e0dac50fSopenharmony_ci ScreenId screenId = dmsScreen->dmsId_; 619e0dac50fSopenharmony_ci dmsScreen->lastGroupDmsId_ = dmsScreen->groupDmsId_; 620e0dac50fSopenharmony_ci dmsScreen->groupDmsId_ = SCREEN_ID_INVALID; 621e0dac50fSopenharmony_ci dmsScreen->startPoint_ = Point(); 622e0dac50fSopenharmony_ci if (dmsScreen->rsDisplayNode_ != nullptr) { 623e0dac50fSopenharmony_ci dmsScreen->rsDisplayNode_->SetDisplayOffset(0, 0); 624e0dac50fSopenharmony_ci dmsScreen->rsDisplayNode_->RemoveFromTree(); 625e0dac50fSopenharmony_ci auto transactionProxy = RSTransactionProxy::GetInstance(); 626e0dac50fSopenharmony_ci if (transactionProxy != nullptr) { 627e0dac50fSopenharmony_ci transactionProxy->FlushImplicitTransaction(); 628e0dac50fSopenharmony_ci } 629e0dac50fSopenharmony_ci dmsScreen->rsDisplayNode_ = nullptr; 630e0dac50fSopenharmony_ci } 631e0dac50fSopenharmony_ci WLOGFD("groupDmsId:%{public}" PRIu64", screenId:%{public}" PRIu64"", 632e0dac50fSopenharmony_ci dmsScreen->groupDmsId_, screenId); 633e0dac50fSopenharmony_ci return screenMap_.erase(screenId); 634e0dac50fSopenharmony_ci} 635e0dac50fSopenharmony_ci 636e0dac50fSopenharmony_cibool AbstractScreenGroup::RemoveDefaultScreen(const sptr<AbstractScreen>& dmsScreen) 637e0dac50fSopenharmony_ci{ 638e0dac50fSopenharmony_ci if (dmsScreen == nullptr) { 639e0dac50fSopenharmony_ci WLOGE("RemoveChild, dmsScreen is nullptr."); 640e0dac50fSopenharmony_ci return false; 641e0dac50fSopenharmony_ci } 642e0dac50fSopenharmony_ci ScreenId screenId = dmsScreen->dmsId_; 643e0dac50fSopenharmony_ci dmsScreen->lastGroupDmsId_ = dmsScreen->groupDmsId_; 644e0dac50fSopenharmony_ci if (dmsScreen->rsDisplayNode_ != nullptr) { 645e0dac50fSopenharmony_ci dmsScreen->rsDisplayNode_->SetDisplayOffset(0, 0); 646e0dac50fSopenharmony_ci dmsScreen->rsDisplayNode_->RemoveFromTree(); 647e0dac50fSopenharmony_ci auto transactionProxy = RSTransactionProxy::GetInstance(); 648e0dac50fSopenharmony_ci if (transactionProxy != nullptr) { 649e0dac50fSopenharmony_ci transactionProxy->FlushImplicitTransaction(); 650e0dac50fSopenharmony_ci } 651e0dac50fSopenharmony_ci } 652e0dac50fSopenharmony_ci defaultScreenId_ = screenId; 653e0dac50fSopenharmony_ci WLOGFD("groupDmsId:%{public}" PRIu64", screenId:%{public}" PRIu64"", 654e0dac50fSopenharmony_ci dmsScreen->groupDmsId_, screenId); 655e0dac50fSopenharmony_ci return true; 656e0dac50fSopenharmony_ci} 657e0dac50fSopenharmony_ci 658e0dac50fSopenharmony_cibool AbstractScreenGroup::HasChild(ScreenId childScreen) const 659e0dac50fSopenharmony_ci{ 660e0dac50fSopenharmony_ci return screenMap_.find(childScreen) != screenMap_.end(); 661e0dac50fSopenharmony_ci} 662e0dac50fSopenharmony_ci 663e0dac50fSopenharmony_cistd::vector<sptr<AbstractScreen>> AbstractScreenGroup::GetChildren() const 664e0dac50fSopenharmony_ci{ 665e0dac50fSopenharmony_ci std::vector<sptr<AbstractScreen>> res; 666e0dac50fSopenharmony_ci for (auto iter = screenMap_.begin(); iter != screenMap_.end(); iter++) { 667e0dac50fSopenharmony_ci res.push_back(iter->second); 668e0dac50fSopenharmony_ci } 669e0dac50fSopenharmony_ci return res; 670e0dac50fSopenharmony_ci} 671e0dac50fSopenharmony_ci 672e0dac50fSopenharmony_cistd::vector<Point> AbstractScreenGroup::GetChildrenPosition() const 673e0dac50fSopenharmony_ci{ 674e0dac50fSopenharmony_ci std::vector<Point> res; 675e0dac50fSopenharmony_ci for (auto iter = screenMap_.begin(); iter != screenMap_.end(); iter++) { 676e0dac50fSopenharmony_ci res.push_back(iter->second->startPoint_); 677e0dac50fSopenharmony_ci } 678e0dac50fSopenharmony_ci return res; 679e0dac50fSopenharmony_ci} 680e0dac50fSopenharmony_ci 681e0dac50fSopenharmony_ciPoint AbstractScreenGroup::GetChildPosition(ScreenId screenId) const 682e0dac50fSopenharmony_ci{ 683e0dac50fSopenharmony_ci Point point; 684e0dac50fSopenharmony_ci auto iter = screenMap_.find(screenId); 685e0dac50fSopenharmony_ci if (iter != screenMap_.end()) { 686e0dac50fSopenharmony_ci point = iter->second->startPoint_; 687e0dac50fSopenharmony_ci } 688e0dac50fSopenharmony_ci return point; 689e0dac50fSopenharmony_ci} 690e0dac50fSopenharmony_ci 691e0dac50fSopenharmony_cisize_t AbstractScreenGroup::GetChildCount() const 692e0dac50fSopenharmony_ci{ 693e0dac50fSopenharmony_ci return screenMap_.size(); 694e0dac50fSopenharmony_ci} 695e0dac50fSopenharmony_ci 696e0dac50fSopenharmony_ciScreenCombination AbstractScreenGroup::GetScreenCombination() const 697e0dac50fSopenharmony_ci{ 698e0dac50fSopenharmony_ci return combination_; 699e0dac50fSopenharmony_ci} 700e0dac50fSopenharmony_ci} // namespace OHOS::Rosen 701