1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "session/screen/include/screen_property.h"
17 #include "parameters.h"
18 
19 namespace OHOS::Rosen {
20 namespace {
21 constexpr int32_t PHONE_SCREEN_WIDTH = 1344;
22 constexpr int32_t PHONE_SCREEN_HEIGHT = 2772;
23 constexpr float PHONE_SCREEN_DENSITY = 3.5f;
24 constexpr float ELSE_SCREEN_DENSITY = 1.5f;
25 constexpr float INCH_2_MM = 25.4f;
26 constexpr int32_t HALF_VALUE = 2;
27 constexpr int32_t TRUNCATE_THREE_DECIMALS = 1000;
28 }
29 
SetRotation(float rotation)30 void ScreenProperty::SetRotation(float rotation)
31 {
32     rotation_ = rotation;
33 }
34 
GetRotation() const35 float ScreenProperty::GetRotation() const
36 {
37     return rotation_;
38 }
39 
SetPhysicalRotation(float rotation)40 void ScreenProperty::SetPhysicalRotation(float rotation)
41 {
42     physicalRotation_ = rotation;
43 }
44 
GetPhysicalRotation() const45 float ScreenProperty::GetPhysicalRotation() const
46 {
47     return physicalRotation_;
48 }
49 
SetScreenComponentRotation(float rotation)50 void ScreenProperty::SetScreenComponentRotation(float rotation)
51 {
52     screenComponentRotation_ = rotation;
53 }
54 
GetScreenComponentRotation() const55 float ScreenProperty::GetScreenComponentRotation() const
56 {
57     return screenComponentRotation_;
58 }
59 
SetBounds(const RRect & bounds)60 void ScreenProperty::SetBounds(const RRect& bounds)
61 {
62     bounds_ = bounds;
63     UpdateXDpi();
64     UpdateYDpi();
65 }
66 
GetBounds() const67 RRect ScreenProperty::GetBounds() const
68 {
69     return bounds_;
70 }
71 
SetScaleX(float scaleX)72 void ScreenProperty::SetScaleX(float scaleX)
73 {
74     scaleX_ = scaleX;
75 }
76 
GetScaleX() const77 float ScreenProperty::GetScaleX() const
78 {
79     return scaleX_;
80 }
81 
SetScaleY(float scaleY)82 void ScreenProperty::SetScaleY(float scaleY)
83 {
84     scaleY_ = scaleY;
85 }
86 
GetScaleY() const87 float ScreenProperty::GetScaleY() const
88 {
89     return scaleY_;
90 }
91 
SetPivotX(float pivotX)92 void ScreenProperty::SetPivotX(float pivotX)
93 {
94     pivotX_ = pivotX;
95 }
96 
GetPivotX() const97 float ScreenProperty::GetPivotX() const
98 {
99     return pivotX_;
100 }
101 
SetPivotY(float pivotY)102 void ScreenProperty::SetPivotY(float pivotY)
103 {
104     pivotY_ = pivotY;
105 }
106 
GetPivotY() const107 float ScreenProperty::GetPivotY() const
108 {
109     return pivotY_;
110 }
111 
SetTranslateX(float translateX)112 void ScreenProperty::SetTranslateX(float translateX)
113 {
114     translateX_ = translateX;
115 }
116 
GetTranslateX() const117 float ScreenProperty::GetTranslateX() const
118 {
119     return translateX_;
120 }
121 
SetTranslateY(float translateY)122 void ScreenProperty::SetTranslateY(float translateY)
123 {
124     translateY_ = translateY;
125 }
126 
GetTranslateY() const127 float ScreenProperty::GetTranslateY() const
128 {
129     return translateY_;
130 }
131 
SetPhyBounds(const RRect & phyBounds)132 void ScreenProperty::SetPhyBounds(const RRect& phyBounds)
133 {
134     phyBounds_ = phyBounds;
135 }
136 
GetPhyBounds() const137 RRect ScreenProperty::GetPhyBounds() const
138 {
139     return phyBounds_;
140 }
141 
GetDensity()142 float ScreenProperty::GetDensity()
143 {
144     return virtualPixelRatio_;
145 }
146 
GetDefaultDensity()147 float ScreenProperty::GetDefaultDensity()
148 {
149     return defaultDensity_;
150 }
151 
SetDefaultDensity(float defaultDensity)152 void ScreenProperty::SetDefaultDensity(float defaultDensity)
153 {
154     defaultDensity_ = defaultDensity;
155 }
156 
GetDensityInCurResolution() const157 float ScreenProperty::GetDensityInCurResolution() const
158 {
159     return densityInCurResolution_;
160 }
161 
SetDensityInCurResolution(float densityInCurResolution)162 void ScreenProperty::SetDensityInCurResolution(float densityInCurResolution)
163 {
164     densityInCurResolution_ = densityInCurResolution;
165 }
166 
SetPhyWidth(uint32_t phyWidth)167 void ScreenProperty::SetPhyWidth(uint32_t phyWidth)
168 {
169     phyWidth_ = phyWidth;
170 }
171 
GetPhyWidth() const172 int32_t ScreenProperty::GetPhyWidth() const
173 {
174     return phyWidth_;
175 }
176 
SetPhyHeight(uint32_t phyHeight)177 void ScreenProperty::SetPhyHeight(uint32_t phyHeight)
178 {
179     phyHeight_ = phyHeight;
180 }
181 
GetPhyHeight() const182 int32_t ScreenProperty::GetPhyHeight() const
183 {
184     return phyHeight_;
185 }
186 
SetDpiPhyBounds(uint32_t phyWidth,uint32_t phyHeight)187 void ScreenProperty::SetDpiPhyBounds(uint32_t phyWidth, uint32_t phyHeight)
188 {
189     dpiPhyWidth_ = phyWidth;
190     dpiPhyHeight_ = phyHeight;
191 }
192 
SetRefreshRate(uint32_t refreshRate)193 void ScreenProperty::SetRefreshRate(uint32_t refreshRate)
194 {
195     refreshRate_ = refreshRate;
196 }
197 
GetRefreshRate() const198 uint32_t ScreenProperty::GetRefreshRate() const
199 {
200     return refreshRate_;
201 }
202 
SetPropertyChangeReason(std::string propertyChangeReason)203 void ScreenProperty::SetPropertyChangeReason(std::string propertyChangeReason)
204 {
205     propertyChangeReason_ = propertyChangeReason;
206 }
207 
GetPropertyChangeReason() const208 std::string ScreenProperty::GetPropertyChangeReason() const
209 {
210     return propertyChangeReason_;
211 }
212 
SetVirtualPixelRatio(float virtualPixelRatio)213 void ScreenProperty::SetVirtualPixelRatio(float virtualPixelRatio)
214 {
215     virtualPixelRatio_ = virtualPixelRatio;
216 }
217 
GetVirtualPixelRatio() const218 float ScreenProperty::GetVirtualPixelRatio() const
219 {
220     return virtualPixelRatio_;
221 }
222 
SetScreenRotation(Rotation rotation)223 void ScreenProperty::SetScreenRotation(Rotation rotation)
224 {
225     bool enableRotation = system::GetParameter("persist.window.rotation.enabled", "1") == "1";
226     if (!enableRotation) {
227         return;
228     }
229     if (IsVertical(rotation) != IsVertical(screenRotation_)) {
230         std::swap(bounds_.rect_.width_, bounds_.rect_.height_);
231         int32_t width = bounds_.rect_.width_;
232         int32_t height = bounds_.rect_.height_;
233         if (IsVertical(screenRotation_)) {
234             bounds_.rect_.left_ -= static_cast<float>(width - height) / static_cast<float>(HALF_VALUE) -
235                 static_cast<float>(offsetY_);
236             bounds_.rect_.top_ += static_cast<float>(width - height) / static_cast<float>(HALF_VALUE);
237         } else {
238             bounds_.rect_.left_ += static_cast<float>(height - width) / static_cast<float>(HALF_VALUE);
239             bounds_.rect_.top_ -= static_cast<float>(height - width) / static_cast<float>(HALF_VALUE) +
240                 static_cast<float>(offsetY_);
241         }
242     }
243     switch (rotation) {
244         case Rotation::ROTATION_90:
245             rotation_ = 90.f;
246             break;
247         case Rotation::ROTATION_180:
248             rotation_ = 180.f;
249             break;
250         case Rotation::ROTATION_270:
251             rotation_ = 270.f;
252             break;
253         default:
254             rotation_ = 0.f;
255             break;
256     }
257     screenRotation_ = rotation;
258 }
259 
SetRotationAndScreenRotationOnly(Rotation rotation)260 void ScreenProperty::SetRotationAndScreenRotationOnly(Rotation rotation)
261 {
262     bool enableRotation = (system::GetParameter("persist.window.rotation.enabled", "1") == "1");
263     if (!enableRotation) {
264         return;
265     }
266     switch (rotation) {
267         case Rotation::ROTATION_90:
268             rotation_ = 90.f;
269             break;
270         case Rotation::ROTATION_180:
271             rotation_ = 180.f;
272             break;
273         case Rotation::ROTATION_270:
274             rotation_ = 270.f;
275             break;
276         default:
277             rotation_ = 0.f;
278             break;
279     }
280     screenRotation_ = rotation;
281 }
282 
UpdateScreenRotation(Rotation rotation)283 void ScreenProperty::UpdateScreenRotation(Rotation rotation)
284 {
285     screenRotation_ = rotation;
286 }
287 
GetScreenRotation() const288 Rotation ScreenProperty::GetScreenRotation() const
289 {
290     return screenRotation_;
291 }
292 
UpdateDeviceRotation(Rotation rotation)293 void ScreenProperty::UpdateDeviceRotation(Rotation rotation)
294 {
295     deviceRotation_ = rotation;
296 }
297 
GetDeviceRotation() const298 Rotation ScreenProperty::GetDeviceRotation() const
299 {
300     return deviceRotation_;
301 }
302 
SetOrientation(Orientation orientation)303 void ScreenProperty::SetOrientation(Orientation orientation)
304 {
305     orientation_ = orientation;
306 }
307 
GetOrientation() const308 Orientation ScreenProperty::GetOrientation() const
309 {
310     return orientation_;
311 }
312 
SetDisplayState(DisplayState displayState)313 void ScreenProperty::SetDisplayState(DisplayState displayState)
314 {
315     displayState_ = displayState;
316 }
317 
GetDisplayState() const318 DisplayState ScreenProperty::GetDisplayState() const
319 {
320     return displayState_;
321 }
322 
SetDisplayOrientation(DisplayOrientation displayOrientation)323 void ScreenProperty::SetDisplayOrientation(DisplayOrientation displayOrientation)
324 {
325     displayOrientation_ = displayOrientation;
326 }
327 
GetDisplayOrientation() const328 DisplayOrientation ScreenProperty::GetDisplayOrientation() const
329 {
330     return displayOrientation_;
331 }
332 
SetDeviceOrientation(DisplayOrientation displayOrientation)333 void ScreenProperty::SetDeviceOrientation(DisplayOrientation displayOrientation)
334 {
335     deviceOrientation_ = displayOrientation;
336 }
337 
GetDeviceOrientation() const338 DisplayOrientation ScreenProperty::GetDeviceOrientation() const
339 {
340     return deviceOrientation_;
341 }
342 
UpdateXDpi()343 void ScreenProperty::UpdateXDpi()
344 {
345     if (dpiPhyWidth_ != UINT32_MAX) {
346         int32_t width = phyBounds_.rect_.width_;
347         xDpi_ = width * INCH_2_MM / dpiPhyWidth_;
348         xDpi_ = std::floor(xDpi_ * TRUNCATE_THREE_DECIMALS) / TRUNCATE_THREE_DECIMALS;
349     }
350 }
351 
UpdateYDpi()352 void ScreenProperty::UpdateYDpi()
353 {
354     if (dpiPhyHeight_ != UINT32_MAX) {
355         int32_t height_ = phyBounds_.rect_.height_;
356         yDpi_ = height_ * INCH_2_MM / dpiPhyHeight_;
357         yDpi_ = std::floor(yDpi_ * TRUNCATE_THREE_DECIMALS) / TRUNCATE_THREE_DECIMALS;
358     }
359 }
360 
UpdateVirtualPixelRatio(const RRect & bounds)361 void ScreenProperty::UpdateVirtualPixelRatio(const RRect& bounds)
362 {
363     int32_t width = bounds.rect_.width_;
364     int32_t height = bounds.rect_.height_;
365 
366     if (width == PHONE_SCREEN_WIDTH && height == PHONE_SCREEN_HEIGHT) { // telephone
367         virtualPixelRatio_ = PHONE_SCREEN_DENSITY;
368     } else {
369         virtualPixelRatio_ = ELSE_SCREEN_DENSITY;
370     }
371     defaultDensity_ = virtualPixelRatio_;
372 }
373 
CalcDefaultDisplayOrientation()374 void ScreenProperty::CalcDefaultDisplayOrientation()
375 {
376     if (bounds_.rect_.width_ > bounds_.rect_.height_) {
377         displayOrientation_ = DisplayOrientation::LANDSCAPE;
378         deviceOrientation_ = DisplayOrientation::LANDSCAPE;
379     } else {
380         displayOrientation_ = DisplayOrientation::PORTRAIT;
381         deviceOrientation_ = DisplayOrientation::PORTRAIT;
382     }
383 }
384 
CalculateXYDpi(uint32_t phyWidth,uint32_t phyHeight)385 void ScreenProperty::CalculateXYDpi(uint32_t phyWidth, uint32_t phyHeight)
386 {
387     if (phyWidth == 0 || phyHeight == 0) {
388         return;
389     }
390 
391     phyWidth_ = phyWidth;
392     phyHeight_ = phyHeight;
393     int32_t width_ = phyBounds_.rect_.width_;
394     int32_t height_ = phyBounds_.rect_.height_;
395     xDpi_ = width_ * INCH_2_MM / phyWidth_;
396     yDpi_ = height_ * INCH_2_MM / phyHeight_;
397     xDpi_ = std::floor(xDpi_ * TRUNCATE_THREE_DECIMALS) / TRUNCATE_THREE_DECIMALS;
398     yDpi_ = std::floor(yDpi_ * TRUNCATE_THREE_DECIMALS) / TRUNCATE_THREE_DECIMALS;
399 }
400 
GetXDpi()401 float ScreenProperty::GetXDpi()
402 {
403     return xDpi_;
404 }
405 
GetYDpi()406 float ScreenProperty::GetYDpi()
407 {
408     return yDpi_;
409 }
410 
SetOffsetX(int32_t offsetX)411 void ScreenProperty::SetOffsetX(int32_t offsetX)
412 {
413     offsetX_ = offsetX;
414 }
415 
GetOffsetX() const416 int32_t ScreenProperty::GetOffsetX() const
417 {
418     return offsetX_;
419 }
420 
SetOffsetY(int32_t offsetY)421 void ScreenProperty::SetOffsetY(int32_t offsetY)
422 {
423     offsetY_ = offsetY;
424 }
425 
GetOffsetY() const426 int32_t ScreenProperty::GetOffsetY() const
427 {
428     return offsetY_;
429 }
430 
SetOffset(int32_t offsetX,int32_t offsetY)431 void ScreenProperty::SetOffset(int32_t offsetX, int32_t offsetY)
432 {
433     offsetX_ = offsetX;
434     offsetY_ = offsetY;
435 }
436 
SetScreenType(ScreenType type)437 void ScreenProperty::SetScreenType(ScreenType type)
438 {
439     type_ = type;
440 }
441 
GetScreenType() const442 ScreenType ScreenProperty::GetScreenType() const
443 {
444     return type_;
445 }
446 
SetScreenRequestedOrientation(Orientation orientation)447 void ScreenProperty::SetScreenRequestedOrientation(Orientation orientation)
448 {
449     screenRequestedOrientation_ = orientation;
450 }
451 
GetScreenRequestedOrientation() const452 Orientation ScreenProperty::GetScreenRequestedOrientation() const
453 {
454     return screenRequestedOrientation_;
455 }
456 
SetDefaultDeviceRotationOffset(uint32_t defaultRotationOffset)457 void ScreenProperty::SetDefaultDeviceRotationOffset(uint32_t defaultRotationOffset)
458 {
459     defaultDeviceRotationOffset_ = defaultRotationOffset;
460 }
461 
GetDefaultDeviceRotationOffset() const462 uint32_t ScreenProperty::GetDefaultDeviceRotationOffset() const
463 {
464     return defaultDeviceRotationOffset_;
465 }
466 } // namespace OHOS::Rosen
467