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