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 "screen.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include <cstdint> 19e0dac50fSopenharmony_ci#include <new> 20e0dac50fSopenharmony_ci#include <refbase.h> 21e0dac50fSopenharmony_ci 22e0dac50fSopenharmony_ci#include "class_var_definition.h" 23e0dac50fSopenharmony_ci#include "display_manager_adapter.h" 24e0dac50fSopenharmony_ci#include "screen_info.h" 25e0dac50fSopenharmony_ci#include "singleton_container.h" 26e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 27e0dac50fSopenharmony_ci 28e0dac50fSopenharmony_cinamespace OHOS::Rosen { 29e0dac50fSopenharmony_cinamespace { 30e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "Screen"}; 31e0dac50fSopenharmony_ci} 32e0dac50fSopenharmony_ciclass Screen::Impl : public RefBase { 33e0dac50fSopenharmony_cipublic: 34e0dac50fSopenharmony_ci explicit Impl(sptr<ScreenInfo> info) 35e0dac50fSopenharmony_ci { 36e0dac50fSopenharmony_ci screenInfo_ = info; 37e0dac50fSopenharmony_ci } 38e0dac50fSopenharmony_ci ~Impl() = default; 39e0dac50fSopenharmony_ci DEFINE_VAR_FUNC_GET_SET_WITH_LOCK(sptr<ScreenInfo>, ScreenInfo, screenInfo); 40e0dac50fSopenharmony_ci}; 41e0dac50fSopenharmony_ci 42e0dac50fSopenharmony_ciScreen::Screen(sptr<ScreenInfo> info) 43e0dac50fSopenharmony_ci : pImpl_(new Impl(info)) 44e0dac50fSopenharmony_ci{ 45e0dac50fSopenharmony_ci} 46e0dac50fSopenharmony_ci 47e0dac50fSopenharmony_ciScreen::~Screen() 48e0dac50fSopenharmony_ci{ 49e0dac50fSopenharmony_ci} 50e0dac50fSopenharmony_ci 51e0dac50fSopenharmony_cibool Screen::IsGroup() const 52e0dac50fSopenharmony_ci{ 53e0dac50fSopenharmony_ci UpdateScreenInfo(); 54e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetIsScreenGroup(); 55e0dac50fSopenharmony_ci} 56e0dac50fSopenharmony_ci 57e0dac50fSopenharmony_cistd::string Screen::GetName() const 58e0dac50fSopenharmony_ci{ 59e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetName(); 60e0dac50fSopenharmony_ci} 61e0dac50fSopenharmony_ci 62e0dac50fSopenharmony_ciScreenId Screen::GetId() const 63e0dac50fSopenharmony_ci{ 64e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetScreenId(); 65e0dac50fSopenharmony_ci} 66e0dac50fSopenharmony_ci 67e0dac50fSopenharmony_ciuint32_t Screen::GetWidth() const 68e0dac50fSopenharmony_ci{ 69e0dac50fSopenharmony_ci auto modeId = GetModeId(); 70e0dac50fSopenharmony_ci auto modes = GetSupportedModes(); 71e0dac50fSopenharmony_ci if (modeId < 0 || modeId >= modes.size()) { 72e0dac50fSopenharmony_ci return 0; 73e0dac50fSopenharmony_ci } 74e0dac50fSopenharmony_ci return modes[modeId]->width_; 75e0dac50fSopenharmony_ci} 76e0dac50fSopenharmony_ci 77e0dac50fSopenharmony_ciuint32_t Screen::GetHeight() const 78e0dac50fSopenharmony_ci{ 79e0dac50fSopenharmony_ci UpdateScreenInfo(); 80e0dac50fSopenharmony_ci auto modeId = GetModeId(); 81e0dac50fSopenharmony_ci auto modes = GetSupportedModes(); 82e0dac50fSopenharmony_ci if (modeId < 0 || modeId >= modes.size()) { 83e0dac50fSopenharmony_ci return 0; 84e0dac50fSopenharmony_ci } 85e0dac50fSopenharmony_ci return modes[modeId]->height_; 86e0dac50fSopenharmony_ci} 87e0dac50fSopenharmony_ci 88e0dac50fSopenharmony_ciuint32_t Screen::GetVirtualWidth() const 89e0dac50fSopenharmony_ci{ 90e0dac50fSopenharmony_ci UpdateScreenInfo(); 91e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetVirtualWidth(); 92e0dac50fSopenharmony_ci} 93e0dac50fSopenharmony_ci 94e0dac50fSopenharmony_ciuint32_t Screen::GetVirtualHeight() const 95e0dac50fSopenharmony_ci{ 96e0dac50fSopenharmony_ci UpdateScreenInfo(); 97e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetVirtualHeight(); 98e0dac50fSopenharmony_ci} 99e0dac50fSopenharmony_ci 100e0dac50fSopenharmony_cifloat Screen::GetVirtualPixelRatio() const 101e0dac50fSopenharmony_ci{ 102e0dac50fSopenharmony_ci UpdateScreenInfo(); 103e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetVirtualPixelRatio(); 104e0dac50fSopenharmony_ci} 105e0dac50fSopenharmony_ci 106e0dac50fSopenharmony_ciRotation Screen::GetRotation() const 107e0dac50fSopenharmony_ci{ 108e0dac50fSopenharmony_ci UpdateScreenInfo(); 109e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetRotation(); 110e0dac50fSopenharmony_ci} 111e0dac50fSopenharmony_ci 112e0dac50fSopenharmony_ciOrientation Screen::GetOrientation() const 113e0dac50fSopenharmony_ci{ 114e0dac50fSopenharmony_ci UpdateScreenInfo(); 115e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetOrientation(); 116e0dac50fSopenharmony_ci} 117e0dac50fSopenharmony_ci 118e0dac50fSopenharmony_cibool Screen::IsReal() const 119e0dac50fSopenharmony_ci{ 120e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetType() == ScreenType::REAL; 121e0dac50fSopenharmony_ci} 122e0dac50fSopenharmony_ci 123e0dac50fSopenharmony_ciDMError Screen::SetOrientation(Orientation orientation) const 124e0dac50fSopenharmony_ci{ 125e0dac50fSopenharmony_ci WLOGFD("Orientation %{public}u", orientation); 126e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetOrientation(GetId(), orientation); 127e0dac50fSopenharmony_ci} 128e0dac50fSopenharmony_ci 129e0dac50fSopenharmony_ciDMError Screen::GetScreenSupportedColorGamuts(std::vector<ScreenColorGamut>& colorGamuts) const 130e0dac50fSopenharmony_ci{ 131e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenSupportedColorGamuts(GetId(), colorGamuts); 132e0dac50fSopenharmony_ci} 133e0dac50fSopenharmony_ci 134e0dac50fSopenharmony_ciDMError Screen::GetScreenColorGamut(ScreenColorGamut& colorGamut) const 135e0dac50fSopenharmony_ci{ 136e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenColorGamut(GetId(), colorGamut); 137e0dac50fSopenharmony_ci} 138e0dac50fSopenharmony_ci 139e0dac50fSopenharmony_ciDMError Screen::SetScreenColorGamut(int32_t colorGamutIdx) 140e0dac50fSopenharmony_ci{ 141e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenColorGamut(GetId(), colorGamutIdx); 142e0dac50fSopenharmony_ci} 143e0dac50fSopenharmony_ci 144e0dac50fSopenharmony_ciDMError Screen::GetScreenGamutMap(ScreenGamutMap& gamutMap) const 145e0dac50fSopenharmony_ci{ 146e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenGamutMap(GetId(), gamutMap); 147e0dac50fSopenharmony_ci} 148e0dac50fSopenharmony_ci 149e0dac50fSopenharmony_ciDMError Screen::SetScreenGamutMap(ScreenGamutMap gamutMap) 150e0dac50fSopenharmony_ci{ 151e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenGamutMap(GetId(), gamutMap); 152e0dac50fSopenharmony_ci} 153e0dac50fSopenharmony_ci 154e0dac50fSopenharmony_ciDMError Screen::SetScreenColorTransform() 155e0dac50fSopenharmony_ci{ 156e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenColorTransform(GetId()); 157e0dac50fSopenharmony_ci} 158e0dac50fSopenharmony_ci 159e0dac50fSopenharmony_ciDMError Screen::GetPixelFormat(GraphicPixelFormat& pixelFormat) const 160e0dac50fSopenharmony_ci{ 161e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetPixelFormat(GetId(), pixelFormat); 162e0dac50fSopenharmony_ci} 163e0dac50fSopenharmony_ci 164e0dac50fSopenharmony_ciDMError Screen::SetPixelFormat(GraphicPixelFormat pixelFormat) 165e0dac50fSopenharmony_ci{ 166e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetPixelFormat(GetId(), pixelFormat); 167e0dac50fSopenharmony_ci} 168e0dac50fSopenharmony_ci 169e0dac50fSopenharmony_ciDMError Screen::GetSupportedHDRFormats(std::vector<ScreenHDRFormat>& hdrFormats) const 170e0dac50fSopenharmony_ci{ 171e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetSupportedHDRFormats(GetId(), hdrFormats); 172e0dac50fSopenharmony_ci} 173e0dac50fSopenharmony_ci 174e0dac50fSopenharmony_ciDMError Screen::GetScreenHDRFormat(ScreenHDRFormat& hdrFormat) const 175e0dac50fSopenharmony_ci{ 176e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenHDRFormat(GetId(), hdrFormat); 177e0dac50fSopenharmony_ci} 178e0dac50fSopenharmony_ci 179e0dac50fSopenharmony_ciDMError Screen::SetScreenHDRFormat(int32_t modeIdx) 180e0dac50fSopenharmony_ci{ 181e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenHDRFormat(GetId(), modeIdx); 182e0dac50fSopenharmony_ci} 183e0dac50fSopenharmony_ci 184e0dac50fSopenharmony_ciDMError Screen::GetSupportedColorSpaces(std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const 185e0dac50fSopenharmony_ci{ 186e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetSupportedColorSpaces(GetId(), colorSpaces); 187e0dac50fSopenharmony_ci} 188e0dac50fSopenharmony_ci 189e0dac50fSopenharmony_ciDMError Screen::GetScreenColorSpace(GraphicCM_ColorSpaceType& colorSpace) const 190e0dac50fSopenharmony_ci{ 191e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenColorSpace(GetId(), colorSpace); 192e0dac50fSopenharmony_ci} 193e0dac50fSopenharmony_ci 194e0dac50fSopenharmony_ciDMError Screen::SetScreenColorSpace(GraphicCM_ColorSpaceType colorSpace) 195e0dac50fSopenharmony_ci{ 196e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenColorSpace(GetId(), colorSpace); 197e0dac50fSopenharmony_ci} 198e0dac50fSopenharmony_ci 199e0dac50fSopenharmony_ciScreenId Screen::GetParentId() const 200e0dac50fSopenharmony_ci{ 201e0dac50fSopenharmony_ci UpdateScreenInfo(); 202e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetParentId(); 203e0dac50fSopenharmony_ci} 204e0dac50fSopenharmony_ci 205e0dac50fSopenharmony_ciuint32_t Screen::GetModeId() const 206e0dac50fSopenharmony_ci{ 207e0dac50fSopenharmony_ci UpdateScreenInfo(); 208e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetModeId(); 209e0dac50fSopenharmony_ci} 210e0dac50fSopenharmony_ci 211e0dac50fSopenharmony_cistd::vector<sptr<SupportedScreenModes>> Screen::GetSupportedModes() const 212e0dac50fSopenharmony_ci{ 213e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo()->GetModes(); 214e0dac50fSopenharmony_ci} 215e0dac50fSopenharmony_ci 216e0dac50fSopenharmony_ciDMError Screen::SetScreenActiveMode(uint32_t modeId) 217e0dac50fSopenharmony_ci{ 218e0dac50fSopenharmony_ci ScreenId screenId = GetId(); 219e0dac50fSopenharmony_ci if (modeId >= GetSupportedModes().size()) { 220e0dac50fSopenharmony_ci return DMError::DM_ERROR_INVALID_PARAM; 221e0dac50fSopenharmony_ci } 222e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenActiveMode(screenId, modeId); 223e0dac50fSopenharmony_ci} 224e0dac50fSopenharmony_ci 225e0dac50fSopenharmony_civoid Screen::UpdateScreenInfo(sptr<ScreenInfo> info) const 226e0dac50fSopenharmony_ci{ 227e0dac50fSopenharmony_ci if (info == nullptr) { 228e0dac50fSopenharmony_ci WLOGFE("ScreenInfo is invalid"); 229e0dac50fSopenharmony_ci return; 230e0dac50fSopenharmony_ci } 231e0dac50fSopenharmony_ci pImpl_->SetScreenInfo(info); 232e0dac50fSopenharmony_ci} 233e0dac50fSopenharmony_ci 234e0dac50fSopenharmony_civoid Screen::UpdateScreenInfo() const 235e0dac50fSopenharmony_ci{ 236e0dac50fSopenharmony_ci auto screenInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenInfo(GetId()); 237e0dac50fSopenharmony_ci UpdateScreenInfo(screenInfo); 238e0dac50fSopenharmony_ci} 239e0dac50fSopenharmony_ci 240e0dac50fSopenharmony_ciDMError Screen::SetDensityDpi(uint32_t dpi) const 241e0dac50fSopenharmony_ci{ 242e0dac50fSopenharmony_ci if (dpi > DOT_PER_INCH_MAXIMUM_VALUE || dpi < DOT_PER_INCH_MINIMUM_VALUE) { 243e0dac50fSopenharmony_ci WLOGE("Invalid input dpi value, valid input range for DPI is %{public}u ~ %{public}u", 244e0dac50fSopenharmony_ci DOT_PER_INCH_MINIMUM_VALUE, DOT_PER_INCH_MAXIMUM_VALUE); 245e0dac50fSopenharmony_ci return DMError::DM_ERROR_INVALID_PARAM; 246e0dac50fSopenharmony_ci } 247e0dac50fSopenharmony_ci // Calculate display density, Density = Dpi / 160. 248e0dac50fSopenharmony_ci float density = static_cast<float>(dpi) / 160; // 160 is the coefficient between density and dpi. 249e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualPixelRatio(GetId(), density); 250e0dac50fSopenharmony_ci} 251e0dac50fSopenharmony_ci 252e0dac50fSopenharmony_ciDMError Screen::SetDensityDpiSystem(uint32_t dpi) const 253e0dac50fSopenharmony_ci{ 254e0dac50fSopenharmony_ci if (dpi > DOT_PER_INCH_MAXIMUM_VALUE || dpi < DOT_PER_INCH_MINIMUM_VALUE) { 255e0dac50fSopenharmony_ci WLOGE("Invalid input dpi value, valid input range for DPI is %{public}u ~ %{public}u", 256e0dac50fSopenharmony_ci DOT_PER_INCH_MINIMUM_VALUE, DOT_PER_INCH_MAXIMUM_VALUE); 257e0dac50fSopenharmony_ci return DMError::DM_ERROR_INVALID_PARAM; 258e0dac50fSopenharmony_ci } 259e0dac50fSopenharmony_ci float density = static_cast<float>(dpi) / 160; // 160 is the coefficient between density and dpi. 260e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualPixelRatioSystem(GetId(), density); 261e0dac50fSopenharmony_ci} 262e0dac50fSopenharmony_ci 263e0dac50fSopenharmony_ciDMError Screen::SetResolution(uint32_t width, uint32_t height, uint32_t dpi) const 264e0dac50fSopenharmony_ci{ 265e0dac50fSopenharmony_ci if (width <= 0 || height <= 0 || dpi > DOT_PER_INCH_MAXIMUM_VALUE || dpi < DOT_PER_INCH_MINIMUM_VALUE) { 266e0dac50fSopenharmony_ci WLOGFE("Invalid param, w:%{public}u h:%{public}u dpi:%{public}u", width, height, dpi); 267e0dac50fSopenharmony_ci return DMError::DM_ERROR_INVALID_PARAM; 268e0dac50fSopenharmony_ci } 269e0dac50fSopenharmony_ci // Calculate display density, Density = Dpi / 160. 270e0dac50fSopenharmony_ci float density = static_cast<float>(dpi) / 160; // 160 is the coefficient between density and dpi. 271e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().SetResolution(GetId(), width, height, density); 272e0dac50fSopenharmony_ci} 273e0dac50fSopenharmony_ci 274e0dac50fSopenharmony_ciDMError Screen::GetDensityInCurResolution(float& virtualPixelRatio) const 275e0dac50fSopenharmony_ci{ 276e0dac50fSopenharmony_ci return SingletonContainer::Get<ScreenManagerAdapter>().GetDensityInCurResolution(GetId(), virtualPixelRatio); 277e0dac50fSopenharmony_ci} 278e0dac50fSopenharmony_ci 279e0dac50fSopenharmony_cisptr<ScreenInfo> Screen::GetScreenInfo() const 280e0dac50fSopenharmony_ci{ 281e0dac50fSopenharmony_ci UpdateScreenInfo(); 282e0dac50fSopenharmony_ci return pImpl_->GetScreenInfo(); 283e0dac50fSopenharmony_ci} 284e0dac50fSopenharmony_ci} // namespace OHOS::Rosen