File: display_util.cc

package info (click to toggle)
chromium 139.0.7258.127-2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,122,156 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (131 lines) | stat: -rw-r--r-- 4,923 bytes parent folder | download | duplicates (6)
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