| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/browser/renderer_host/screen_state.h" |
| |
| namespace content { |
| |
| ScreenState::ScreenState() = default; |
| |
| void ScreenState::CopyDefinedAttributes(const ScreenState& other) { |
| if (!other.visible_viewport_size.IsEmpty()) |
| visible_viewport_size = other.visible_viewport_size; |
| if (!other.physical_backing_size.IsEmpty()) |
| physical_backing_size = other.physical_backing_size; |
| if (!other.screen_info_size.IsEmpty()) |
| screen_info_size = other.screen_info_size; |
| if (other.orientation_type != display::mojom::ScreenOrientation::kUndefined) |
| orientation_type = other.orientation_type; |
| has_unlocked_orientation_lock = other.has_unlocked_orientation_lock; |
| is_expecting_fullscreen_rotation = other.is_expecting_fullscreen_rotation; |
| is_fullscreen = other.is_fullscreen; |
| is_picture_in_picture = other.is_picture_in_picture; |
| on_physical_backing_changed_received = |
| other.on_physical_backing_changed_received; |
| on_sync_display_properties_changed_received = |
| other.on_sync_display_properties_changed_received; |
| any_non_rotation_size_changed = other.any_non_rotation_size_changed; |
| if (other.local_surface_id.is_valid()) |
| local_surface_id = other.local_surface_id; |
| } |
| |
| bool ScreenState::EqualOrientations(const ScreenState& other) { |
| return !IsRotation(visible_viewport_size, other.visible_viewport_size) && |
| !IsRotation(physical_backing_size, other.physical_backing_size) && |
| !ExpectsResizeForOrientationChange(orientation_type, |
| other.orientation_type); |
| } |
| |
| bool ScreenState::IsRotated(const ScreenState& other) { |
| return IsRotation(visible_viewport_size, other.visible_viewport_size) && |
| IsRotation(physical_backing_size, other.physical_backing_size) && |
| ExpectsResizeForOrientationChange(orientation_type, |
| other.orientation_type); |
| } |
| |
| bool ScreenState::IsValid() { |
| return !visible_viewport_size.IsEmpty() && !physical_backing_size.IsEmpty() && |
| !screen_info_size.IsEmpty() && |
| orientation_type != display::mojom::ScreenOrientation::kUndefined; |
| } |
| |
| bool ScreenState::EqualVisualProperties(const ScreenState& other) const { |
| return visible_viewport_size == other.visible_viewport_size && |
| physical_backing_size == other.physical_backing_size && |
| screen_info_size == other.screen_info_size && |
| orientation_type == other.orientation_type && |
| is_fullscreen == other.is_fullscreen; |
| } |
| |
| // static |
| bool ScreenState::IsRotation(const gfx::Size& old_size, |
| const gfx::Size& new_size) { |
| // The size change can sometimes include both the rotation and top-controls |
| // adjustments at the same time. So we can't rely on it being a direct swap. |
| if (old_size.width() > old_size.height() && |
| new_size.width() < new_size.height()) { |
| return true; |
| } else if (old_size.width() < old_size.height() && |
| new_size.width() > new_size.height()) { |
| return true; |
| } |
| return false; |
| } |
| |
| // static |
| bool ScreenState::IsSingleAxisResize(const gfx::Size& old_size, |
| const gfx::Size& new_size) { |
| if (old_size.width() == new_size.width() && |
| old_size.height() != new_size.height()) { |
| return true; |
| } |
| if (old_size.height() == new_size.height() && |
| old_size.width() != new_size.width()) { |
| return true; |
| } |
| return false; |
| } |
| |
| // static |
| bool ScreenState::ExpectsResizeForOrientationChange( |
| display::mojom::ScreenOrientation current, |
| display::mojom::ScreenOrientation pending) { |
| switch (current) { |
| case display::mojom::ScreenOrientation::kUndefined: |
| return false; |
| case display::mojom::ScreenOrientation::kPortraitPrimary: |
| case display::mojom::ScreenOrientation::kPortraitSecondary: |
| return pending == display::mojom::ScreenOrientation::kLandscapePrimary || |
| pending == display::mojom::ScreenOrientation::kLandscapeSecondary; |
| case display::mojom::ScreenOrientation::kLandscapePrimary: |
| case display::mojom::ScreenOrientation::kLandscapeSecondary: |
| return pending == display::mojom::ScreenOrientation::kPortraitPrimary || |
| pending == display::mojom::ScreenOrientation::kPortraitSecondary; |
| } |
| return false; |
| } |
| |
| } // namespace content |