1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/ui/base/display_util.h"
#include "ui/display/display.h"
namespace chromeos {
OrientationType GetDisplayNaturalOrientation(const display::Display& display) {
// ROTATE_0 is natural orientation and primary and the size of the display
// is updated along with the rotation. Thus, when width > height for ROTATE_0
// and ROTATE_180, the natural orientation is then landscape. Meanwhile,
// width > height for ROTATE_90 and ROTATE_270 indicates portrait layout at
// ROTATE_0 which is the natural orientation.
display::Display::Rotation rotation = display.rotation();
bool is_landscape = display.is_landscape();
if (rotation == display::Display::ROTATE_90 ||
rotation == display::Display::ROTATE_270) {
is_landscape = !is_landscape;
}
return is_landscape ? OrientationType::kLandscape
: OrientationType::kPortrait;
}
OrientationType RotationToOrientation(OrientationType natural,
display::Display::Rotation rotation) {
if (natural == OrientationType::kLandscape) {
// To be consistent with Android, the rotation of the primary portrait
// on naturally landscape device is 270.
switch (rotation) {
case display::Display::ROTATE_0:
return OrientationType::kLandscapePrimary;
case display::Display::ROTATE_90:
return OrientationType::kPortraitSecondary;
case display::Display::ROTATE_180:
return OrientationType::kLandscapeSecondary;
case display::Display::ROTATE_270:
return OrientationType::kPortraitPrimary;
}
} else { // Natural portrait
switch (rotation) {
case display::Display::ROTATE_0:
return OrientationType::kPortraitPrimary;
case display::Display::ROTATE_90:
return OrientationType::kLandscapePrimary;
case display::Display::ROTATE_180:
return OrientationType::kPortraitSecondary;
case display::Display::ROTATE_270:
return OrientationType::kLandscapeSecondary;
}
}
NOTREACHED();
}
display::Display::Rotation OrientationToRotation(OrientationType natural,
OrientationType orientation) {
if (orientation == OrientationType::kAny)
return display::Display::ROTATE_0;
if (natural == OrientationType::kLandscape) {
// To be consistent with Android, the rotation of the primary portrait
// on naturally landscape device is 270.
switch (orientation) {
case OrientationType::kLandscapePrimary:
return display::Display::ROTATE_0;
case OrientationType::kPortraitPrimary:
return display::Display::ROTATE_270;
case OrientationType::kLandscapeSecondary:
return display::Display::ROTATE_180;
case OrientationType::kPortraitSecondary:
return display::Display::ROTATE_90;
default:
break;
}
} else { // Natural portrait
switch (orientation) {
case OrientationType::kPortraitPrimary:
return display::Display::ROTATE_0;
case OrientationType::kLandscapePrimary:
return display::Display::ROTATE_90;
case OrientationType::kPortraitSecondary:
return display::Display::ROTATE_180;
case OrientationType::kLandscapeSecondary:
return display::Display::ROTATE_270;
default:
break;
}
}
NOTREACHED() << static_cast<int>(orientation);
}
bool IsPrimaryOrientation(OrientationType type) {
return type == OrientationType::kLandscapePrimary ||
type == OrientationType::kPortraitPrimary;
}
bool IsLandscapeOrientation(OrientationType type) {
return type == OrientationType::kLandscape ||
type == OrientationType::kLandscapePrimary ||
type == OrientationType::kLandscapeSecondary;
}
bool IsPortraitOrientation(OrientationType type) {
return type == OrientationType::kPortrait ||
type == OrientationType::kPortraitPrimary ||
type == OrientationType::kPortraitSecondary;
}
OrientationType GetDisplayCurrentOrientation(const display::Display& display) {
DCHECK(display.is_valid());
const display::Display::Rotation rotation = display.rotation();
return RotationToOrientation(GetDisplayNaturalOrientation(display), rotation);
}
bool IsDisplayLayoutPrimary(const display::Display& display) {
DCHECK(display.is_valid());
return IsPrimaryOrientation(GetDisplayCurrentOrientation(display));
}
float GetRepresentativeDeviceScaleFactor(
const std::vector<display::Display>& displays) {
float largest_device_scale_factor = 1.0f;
for (const display::Display& display : displays) {
largest_device_scale_factor =
std::max(largest_device_scale_factor, display.device_scale_factor());
}
return largest_device_scale_factor;
}
} // namespace chromeos
|