#include "ui/display/display_util.h"
#include "build/build_config.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/gfx/icc_profile.h"
namespace display {
void DisplayUtil::DisplayToScreenInfo(ScreenInfo* screen_info,
const Display& display) {
screen_info->rect = display.bounds();
screen_info->available_rect = display.work_area();
screen_info->device_scale_factor = display.device_scale_factor();
screen_info->display_color_spaces = display.GetColorSpaces();
screen_info->depth = display.color_depth();
screen_info->depth_per_component = display.depth_per_component();
screen_info->is_monochrome = display.is_monochrome();
screen_info->orientation_angle = display.PanelRotationAsDegree();
#if defined(USE_AURA)
if (screen_info->orientation_angle == 90)
screen_info->orientation_angle = 270;
else if (screen_info->orientation_angle == 270)
screen_info->orientation_angle = 90;
#endif
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
screen_info->orientation_type = GetOrientationTypeForMobile(display);
#else
screen_info->orientation_type = GetOrientationTypeForDesktop(display);
#endif
auto* screen = Screen::Get();
screen_info->is_extended = screen && screen->GetNumDisplays() > 1;
screen_info->is_primary =
screen && (screen->GetPrimaryDisplay().id() == display.id());
screen_info->is_internal = display.IsInternal();
screen_info->display_id = display.id();
screen_info->label = display.label();
}
void DisplayUtil::GetDefaultScreenInfo(ScreenInfo* screen_info) {
return GetNativeViewScreenInfo(screen_info, gfx::NativeView());
}
void DisplayUtil::GetNativeViewScreenInfo(ScreenInfo* screen_info,
gfx::NativeView native_view) {
Screen* screen = Screen::Get();
if (!screen) {
*screen_info = ScreenInfo();
return;
}
Display display = native_view ? screen->GetDisplayNearestView(native_view)
: screen->GetPrimaryDisplay();
DisplayToScreenInfo(screen_info, display);
}
mojom::ScreenOrientation DisplayUtil::GetOrientationTypeForMobile(
const Display& display) {
int angle = display.PanelRotationAsDegree();
const gfx::Rect& bounds = display.bounds();
bool natural_portrait = false;
if (angle == 0 || angle == 180)
natural_portrait = bounds.height() >= bounds.width();
else
natural_portrait = bounds.height() <= bounds.width();
switch (angle) {
case 0:
return natural_portrait ? mojom::ScreenOrientation::kPortraitPrimary
: mojom::ScreenOrientation::kLandscapePrimary;
case 90:
return natural_portrait ? mojom::ScreenOrientation::kLandscapePrimary
: mojom::ScreenOrientation::kPortraitSecondary;
case 180:
return natural_portrait ? mojom::ScreenOrientation::kPortraitSecondary
: mojom::ScreenOrientation::kLandscapeSecondary;
case 270:
return natural_portrait ? mojom::ScreenOrientation::kLandscapeSecondary
: mojom::ScreenOrientation::kPortraitPrimary;
default:
NOTREACHED();
}
}
mojom::ScreenOrientation DisplayUtil::GetOrientationTypeForDesktop(
const Display& display) {
static int primary_landscape_angle = -1;
static int primary_portrait_angle = -1;
int angle = display.PanelRotationAsDegree();
const gfx::Rect& bounds = display.bounds();
bool is_portrait = bounds.height() >= bounds.width();
if (is_portrait && primary_portrait_angle == -1)
primary_portrait_angle = angle;
if (!is_portrait && primary_landscape_angle == -1)
primary_landscape_angle = angle;
if (is_portrait) {
return primary_portrait_angle == angle
? mojom::ScreenOrientation::kPortraitPrimary
: mojom::ScreenOrientation::kPortraitSecondary;
}
return primary_landscape_angle == angle
? mojom::ScreenOrientation::kLandscapePrimary
: mojom::ScreenOrientation::kLandscapeSecondary;
}
uint32_t DisplayUtil::GetAudioFormats() {
Screen* screen = Screen::Get();
if (screen) {
auto display = screen->GetAllDisplays();
if (display.size() == 1) {
return display.front().audio_formats();
}
}
return 0;
}
}