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_display.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include "abstract_screen_controller.h" 19e0dac50fSopenharmony_ci#include "display_manager_config.h" 20e0dac50fSopenharmony_ci#include "display_manager_service.h" 21e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 22e0dac50fSopenharmony_ci 23e0dac50fSopenharmony_cinamespace OHOS::Rosen { 24e0dac50fSopenharmony_cinamespace { 25e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "AbstractDisplay"}; 26e0dac50fSopenharmony_ciconstexpr int32_t PAD_SCREEN_WIDTH = 2560; 27e0dac50fSopenharmony_ciconstexpr int32_t PHONE_SCREEN_WIDTH = 2160; 28e0dac50fSopenharmony_ciconstexpr float INCH_2_MM = 25.4f; 29e0dac50fSopenharmony_ci} 30e0dac50fSopenharmony_ci 31e0dac50fSopenharmony_ciAbstractDisplay::AbstractDisplay(DisplayId id, sptr<SupportedScreenModes>& info, sptr<AbstractScreen>& absScreen) 32e0dac50fSopenharmony_ci : id_(id) 33e0dac50fSopenharmony_ci{ 34e0dac50fSopenharmony_ci if (info == nullptr || absScreen == nullptr) { 35e0dac50fSopenharmony_ci WLOGFE("info or absScreen is nullptr"); 36e0dac50fSopenharmony_ci return; 37e0dac50fSopenharmony_ci } 38e0dac50fSopenharmony_ci screenId_ = absScreen->dmsId_; 39e0dac50fSopenharmony_ci screenGroupId_ = absScreen->groupDmsId_; 40e0dac50fSopenharmony_ci width_ = static_cast<int32_t>(info->width_); 41e0dac50fSopenharmony_ci height_ = static_cast<int32_t>(info->height_); 42e0dac50fSopenharmony_ci refreshRate_ = info->refreshRate_; 43e0dac50fSopenharmony_ci orientation_ = absScreen->orientation_; 44e0dac50fSopenharmony_ci name_ = absScreen->GetScreenName(); 45e0dac50fSopenharmony_ci static_cast<void>(RequestRotation(absScreen->rotation_)); 46e0dac50fSopenharmony_ci if (width_ > height_) { 47e0dac50fSopenharmony_ci displayOrientation_ = DisplayOrientation::LANDSCAPE; 48e0dac50fSopenharmony_ci } else { 49e0dac50fSopenharmony_ci displayOrientation_ = DisplayOrientation::PORTRAIT; 50e0dac50fSopenharmony_ci } 51e0dac50fSopenharmony_ci if (info->width_ < info->height_) { 52e0dac50fSopenharmony_ci isDefaultVertical_ = true; 53e0dac50fSopenharmony_ci } else { 54e0dac50fSopenharmony_ci isDefaultVertical_ = false; 55e0dac50fSopenharmony_ci } 56e0dac50fSopenharmony_ci 57e0dac50fSopenharmony_ci CalculateXYDpi(absScreen->GetPhyWidth(), absScreen->GetPhyHeight()); 58e0dac50fSopenharmony_ci auto numbersConfig = DisplayManagerConfig::GetIntNumbersConfig(); 59e0dac50fSopenharmony_ci if (numbersConfig.count("dpi") != 0) { 60e0dac50fSopenharmony_ci uint32_t densityDpi = static_cast<uint32_t>(numbersConfig["dpi"][0]); 61e0dac50fSopenharmony_ci if (densityDpi >= DOT_PER_INCH_MINIMUM_VALUE && densityDpi <= DOT_PER_INCH_MAXIMUM_VALUE) { 62e0dac50fSopenharmony_ci virtualPixelRatio_ = static_cast<float>(densityDpi) / BASELINE_DENSITY; 63e0dac50fSopenharmony_ci absScreen->SetVirtualPixelRatio(virtualPixelRatio_); 64e0dac50fSopenharmony_ci return; 65e0dac50fSopenharmony_ci } 66e0dac50fSopenharmony_ci } 67e0dac50fSopenharmony_ci if ((info->width_ >= PHONE_SCREEN_WIDTH) || (info->height_ >= PHONE_SCREEN_WIDTH)) { 68e0dac50fSopenharmony_ci if ((info->width_ == PAD_SCREEN_WIDTH) || (info->height_ == PAD_SCREEN_WIDTH)) { 69e0dac50fSopenharmony_ci virtualPixelRatio_ = 2.0f; // Pad is 2.0 70e0dac50fSopenharmony_ci } else { 71e0dac50fSopenharmony_ci virtualPixelRatio_ = 3.0f; // Phone is 3.0 72e0dac50fSopenharmony_ci } 73e0dac50fSopenharmony_ci } else { 74e0dac50fSopenharmony_ci virtualPixelRatio_ = 1.0f; // Other is 1.0 75e0dac50fSopenharmony_ci } 76e0dac50fSopenharmony_ci absScreen->SetVirtualPixelRatio(virtualPixelRatio_); 77e0dac50fSopenharmony_ci} 78e0dac50fSopenharmony_ci 79e0dac50fSopenharmony_civoid AbstractDisplay::CalculateXYDpi(uint32_t phyWidth, uint32_t phyHeight) 80e0dac50fSopenharmony_ci{ 81e0dac50fSopenharmony_ci if (phyWidth == 0 || phyHeight == 0) { 82e0dac50fSopenharmony_ci return; 83e0dac50fSopenharmony_ci } 84e0dac50fSopenharmony_ci 85e0dac50fSopenharmony_ci phyWidth_ = phyWidth; 86e0dac50fSopenharmony_ci phyHeight_ = phyHeight; 87e0dac50fSopenharmony_ci xDpi_ = width_ * INCH_2_MM / phyWidth_; 88e0dac50fSopenharmony_ci yDpi_ = height_ * INCH_2_MM / phyHeight_; 89e0dac50fSopenharmony_ci} 90e0dac50fSopenharmony_ci 91e0dac50fSopenharmony_ciDisplayId AbstractDisplay::GetId() const 92e0dac50fSopenharmony_ci{ 93e0dac50fSopenharmony_ci return id_; 94e0dac50fSopenharmony_ci} 95e0dac50fSopenharmony_ci 96e0dac50fSopenharmony_ciint32_t AbstractDisplay::GetWidth() const 97e0dac50fSopenharmony_ci{ 98e0dac50fSopenharmony_ci return width_; 99e0dac50fSopenharmony_ci} 100e0dac50fSopenharmony_ci 101e0dac50fSopenharmony_ciint32_t AbstractDisplay::GetHeight() const 102e0dac50fSopenharmony_ci{ 103e0dac50fSopenharmony_ci return height_; 104e0dac50fSopenharmony_ci} 105e0dac50fSopenharmony_ci 106e0dac50fSopenharmony_ciuint32_t AbstractDisplay::GetRefreshRate() const 107e0dac50fSopenharmony_ci{ 108e0dac50fSopenharmony_ci return refreshRate_; 109e0dac50fSopenharmony_ci} 110e0dac50fSopenharmony_ci 111e0dac50fSopenharmony_cifloat AbstractDisplay::GetVirtualPixelRatio() const 112e0dac50fSopenharmony_ci{ 113e0dac50fSopenharmony_ci return virtualPixelRatio_; 114e0dac50fSopenharmony_ci} 115e0dac50fSopenharmony_ci 116e0dac50fSopenharmony_ciint32_t AbstractDisplay::GetOffsetX() const 117e0dac50fSopenharmony_ci{ 118e0dac50fSopenharmony_ci return offsetX_; 119e0dac50fSopenharmony_ci} 120e0dac50fSopenharmony_ci 121e0dac50fSopenharmony_ciint32_t AbstractDisplay::GetOffsetY() const 122e0dac50fSopenharmony_ci{ 123e0dac50fSopenharmony_ci return offsetY_; 124e0dac50fSopenharmony_ci} 125e0dac50fSopenharmony_ci 126e0dac50fSopenharmony_civoid AbstractDisplay::SetOffsetX(int32_t offsetX) 127e0dac50fSopenharmony_ci{ 128e0dac50fSopenharmony_ci offsetX_ = offsetX; 129e0dac50fSopenharmony_ci} 130e0dac50fSopenharmony_ci 131e0dac50fSopenharmony_civoid AbstractDisplay::SetOffsetY(int32_t offsetY) 132e0dac50fSopenharmony_ci{ 133e0dac50fSopenharmony_ci offsetY_ = offsetY; 134e0dac50fSopenharmony_ci} 135e0dac50fSopenharmony_ci 136e0dac50fSopenharmony_civoid AbstractDisplay::SetWidth(int32_t width) 137e0dac50fSopenharmony_ci{ 138e0dac50fSopenharmony_ci width_ = width; 139e0dac50fSopenharmony_ci UpdateXDpi(); 140e0dac50fSopenharmony_ci} 141e0dac50fSopenharmony_ci 142e0dac50fSopenharmony_civoid AbstractDisplay::SetHeight(int32_t height) 143e0dac50fSopenharmony_ci{ 144e0dac50fSopenharmony_ci height_ = height; 145e0dac50fSopenharmony_ci UpdateYDpi(); 146e0dac50fSopenharmony_ci} 147e0dac50fSopenharmony_ci 148e0dac50fSopenharmony_civoid AbstractDisplay::UpdateXDpi() 149e0dac50fSopenharmony_ci{ 150e0dac50fSopenharmony_ci if (phyWidth_ != UINT32_MAX) { 151e0dac50fSopenharmony_ci xDpi_ = width_ * INCH_2_MM / phyWidth_; 152e0dac50fSopenharmony_ci } 153e0dac50fSopenharmony_ci} 154e0dac50fSopenharmony_ci 155e0dac50fSopenharmony_civoid AbstractDisplay::UpdateYDpi() 156e0dac50fSopenharmony_ci{ 157e0dac50fSopenharmony_ci if (phyHeight_ != UINT32_MAX) { 158e0dac50fSopenharmony_ci yDpi_ = height_ * INCH_2_MM / phyHeight_; 159e0dac50fSopenharmony_ci } 160e0dac50fSopenharmony_ci} 161e0dac50fSopenharmony_ci 162e0dac50fSopenharmony_civoid AbstractDisplay::SetOffset(int32_t offsetX, int32_t offsetY) 163e0dac50fSopenharmony_ci{ 164e0dac50fSopenharmony_ci offsetX_ = offsetX; 165e0dac50fSopenharmony_ci offsetY_ = offsetY; 166e0dac50fSopenharmony_ci} 167e0dac50fSopenharmony_ci 168e0dac50fSopenharmony_civoid AbstractDisplay::SetRefreshRate(uint32_t refreshRate) 169e0dac50fSopenharmony_ci{ 170e0dac50fSopenharmony_ci refreshRate_ = refreshRate; 171e0dac50fSopenharmony_ci} 172e0dac50fSopenharmony_ci 173e0dac50fSopenharmony_civoid AbstractDisplay::SetVirtualPixelRatio(float virtualPixelRatio) 174e0dac50fSopenharmony_ci{ 175e0dac50fSopenharmony_ci virtualPixelRatio_ = virtualPixelRatio; 176e0dac50fSopenharmony_ci} 177e0dac50fSopenharmony_ci 178e0dac50fSopenharmony_civoid AbstractDisplay::SetId(DisplayId id) 179e0dac50fSopenharmony_ci{ 180e0dac50fSopenharmony_ci id_ = id; 181e0dac50fSopenharmony_ci} 182e0dac50fSopenharmony_ci 183e0dac50fSopenharmony_civoid AbstractDisplay::SetOrientation(Orientation orientation) 184e0dac50fSopenharmony_ci{ 185e0dac50fSopenharmony_ci orientation_ = orientation; 186e0dac50fSopenharmony_ci} 187e0dac50fSopenharmony_ci 188e0dac50fSopenharmony_civoid AbstractDisplay::SetDisplayOrientation(DisplayOrientation displayOrientation) 189e0dac50fSopenharmony_ci{ 190e0dac50fSopenharmony_ci displayOrientation_ = displayOrientation; 191e0dac50fSopenharmony_ci} 192e0dac50fSopenharmony_ci 193e0dac50fSopenharmony_cibool AbstractDisplay::RequestRotation(Rotation rotation) 194e0dac50fSopenharmony_ci{ 195e0dac50fSopenharmony_ci WLOGD("request rotation from %{public}u to %{public}u, display %{public}" PRIu64"", rotation_, rotation, id_); 196e0dac50fSopenharmony_ci if (rotation_ == rotation) { 197e0dac50fSopenharmony_ci WLOGFE("rotation not change %{public}u", rotation); 198e0dac50fSopenharmony_ci return false; 199e0dac50fSopenharmony_ci } 200e0dac50fSopenharmony_ci if (IsVertical(rotation) != IsVertical(rotation_)) { 201e0dac50fSopenharmony_ci std::swap(width_, height_); 202e0dac50fSopenharmony_ci } 203e0dac50fSopenharmony_ci rotation_ = rotation; 204e0dac50fSopenharmony_ci return true; 205e0dac50fSopenharmony_ci} 206e0dac50fSopenharmony_ci 207e0dac50fSopenharmony_ciRotation AbstractDisplay::GetRotation() const 208e0dac50fSopenharmony_ci{ 209e0dac50fSopenharmony_ci return rotation_; 210e0dac50fSopenharmony_ci} 211e0dac50fSopenharmony_ci 212e0dac50fSopenharmony_ciOrientation AbstractDisplay::GetOrientation() const 213e0dac50fSopenharmony_ci{ 214e0dac50fSopenharmony_ci return orientation_; 215e0dac50fSopenharmony_ci} 216e0dac50fSopenharmony_ci 217e0dac50fSopenharmony_ciDisplayOrientation AbstractDisplay::GetDisplayOrientation() const 218e0dac50fSopenharmony_ci{ 219e0dac50fSopenharmony_ci return displayOrientation_; 220e0dac50fSopenharmony_ci} 221e0dac50fSopenharmony_ci 222e0dac50fSopenharmony_civoid AbstractDisplay::SetFreezeFlag(FreezeFlag freezeFlag) 223e0dac50fSopenharmony_ci{ 224e0dac50fSopenharmony_ci freezeFlag_ = freezeFlag; 225e0dac50fSopenharmony_ci} 226e0dac50fSopenharmony_ci 227e0dac50fSopenharmony_ciFreezeFlag AbstractDisplay::GetFreezeFlag() const 228e0dac50fSopenharmony_ci{ 229e0dac50fSopenharmony_ci return freezeFlag_; 230e0dac50fSopenharmony_ci} 231e0dac50fSopenharmony_ci 232e0dac50fSopenharmony_cibool AbstractDisplay::BindAbstractScreen(sptr<AbstractScreen> abstractScreen) 233e0dac50fSopenharmony_ci{ 234e0dac50fSopenharmony_ci if (abstractScreen == nullptr) { 235e0dac50fSopenharmony_ci WLOGE("display bind screen error, cannot get screen. display:%{public}" PRIu64"", id_); 236e0dac50fSopenharmony_ci return false; 237e0dac50fSopenharmony_ci } 238e0dac50fSopenharmony_ci ScreenId dmsScreenId = abstractScreen->dmsId_; 239e0dac50fSopenharmony_ci sptr<SupportedScreenModes> info = abstractScreen->GetActiveScreenMode(); 240e0dac50fSopenharmony_ci if (info == nullptr) { 241e0dac50fSopenharmony_ci WLOGE("display bind screen error, cannot get info. display:%{public}" PRIu64", screen:%{public}" PRIu64"", 242e0dac50fSopenharmony_ci id_, dmsScreenId); 243e0dac50fSopenharmony_ci return false; 244e0dac50fSopenharmony_ci } 245e0dac50fSopenharmony_ci 246e0dac50fSopenharmony_ci Point point = abstractScreen->GetGroup()->GetChildPosition(dmsScreenId); 247e0dac50fSopenharmony_ci offsetX_ = point.posX_; 248e0dac50fSopenharmony_ci offsetY_ = point.posY_; 249e0dac50fSopenharmony_ci width_ = static_cast<int32_t>(info->width_); 250e0dac50fSopenharmony_ci height_ = static_cast<int32_t>(info->height_); 251e0dac50fSopenharmony_ci refreshRate_ = info->refreshRate_; 252e0dac50fSopenharmony_ci screenId_ = dmsScreenId; 253e0dac50fSopenharmony_ci WLOGD("display bind to screen. display:%{public}" PRIu64", screen:%{public}" PRIu64"", id_, dmsScreenId); 254e0dac50fSopenharmony_ci return true; 255e0dac50fSopenharmony_ci} 256e0dac50fSopenharmony_ci 257e0dac50fSopenharmony_ciScreenId AbstractDisplay::GetAbstractScreenId() const 258e0dac50fSopenharmony_ci{ 259e0dac50fSopenharmony_ci return screenId_; 260e0dac50fSopenharmony_ci} 261e0dac50fSopenharmony_ci 262e0dac50fSopenharmony_ciScreenId AbstractDisplay::GetAbstractScreenGroupId() const 263e0dac50fSopenharmony_ci{ 264e0dac50fSopenharmony_ci return screenGroupId_; 265e0dac50fSopenharmony_ci} 266e0dac50fSopenharmony_ci 267e0dac50fSopenharmony_cisptr<DisplayInfo> AbstractDisplay::ConvertToDisplayInfo() const 268e0dac50fSopenharmony_ci{ 269e0dac50fSopenharmony_ci sptr<DisplayInfo> displayInfo = new(std::nothrow) DisplayInfo(); 270e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 271e0dac50fSopenharmony_ci return displayInfo; 272e0dac50fSopenharmony_ci } 273e0dac50fSopenharmony_ci 274e0dac50fSopenharmony_ci displayInfo->name_ = name_; 275e0dac50fSopenharmony_ci displayInfo->SetDisplayId(id_); 276e0dac50fSopenharmony_ci displayInfo->SetWidth(width_); 277e0dac50fSopenharmony_ci displayInfo->SetHeight(height_); 278e0dac50fSopenharmony_ci displayInfo->SetRefreshRate(refreshRate_); 279e0dac50fSopenharmony_ci displayInfo->SetScreenId(screenId_); 280e0dac50fSopenharmony_ci displayInfo->SetScreenGroupId(screenGroupId_); 281e0dac50fSopenharmony_ci displayInfo->SetVirtualPixelRatio(virtualPixelRatio_); 282e0dac50fSopenharmony_ci displayInfo->SetXDpi(xDpi_); 283e0dac50fSopenharmony_ci displayInfo->SetYDpi(yDpi_); 284e0dac50fSopenharmony_ci displayInfo->SetDpi(virtualPixelRatio_ * DOT_PER_INCH); 285e0dac50fSopenharmony_ci displayInfo->SetRotation(rotation_); 286e0dac50fSopenharmony_ci displayInfo->SetOrientation(orientation_); 287e0dac50fSopenharmony_ci displayInfo->SetOffsetX(offsetX_); 288e0dac50fSopenharmony_ci displayInfo->SetOffsetY(offsetY_); 289e0dac50fSopenharmony_ci displayInfo->displayState_ = displayState_; 290e0dac50fSopenharmony_ci displayInfo->SetWaterfallDisplayCompressionStatus(waterfallDisplayCompressionStatus_); 291e0dac50fSopenharmony_ci displayInfo->SetDisplayOrientation(displayOrientation_); 292e0dac50fSopenharmony_ci displayInfo->SetIsDefaultVertical(isDefaultVertical_); 293e0dac50fSopenharmony_ci return displayInfo; 294e0dac50fSopenharmony_ci} 295e0dac50fSopenharmony_ci} // namespace OHOS::Rosen