win: Reland screen_1443650 changes (fixes #3489)

Use ScaleToRoundedRect instead of ScaleToEnclosedRect.
This commit is contained in:
Marshall Greenblatt 2024-11-05 12:24:54 -05:00
parent de32089516
commit 34b05bb541
2 changed files with 47 additions and 0 deletions

View File

@ -629,6 +629,11 @@ patches = [
# Create top-level widget type when Widget::InitParams::child is false. # Create top-level widget type when Widget::InitParams::child is false.
'name': 'ui_views_widget_type' 'name': 'ui_views_widget_type'
}, },
{
# win/linux: Fix rounding errors with Screen[Win] DIP/pixel conversions.
# https://bugs.chromium.org/p/chromium/issues/detail?id=1443650#c18
'name': 'screen_1443650'
},
{ {
# mac: Keep bubble popups on-screen. # mac: Keep bubble popups on-screen.
# https://bugs.chromium.org/p/chromium/issues/detail?id=893292#c10 # https://bugs.chromium.org/p/chromium/issues/detail?id=893292#c10

View File

@ -0,0 +1,42 @@
diff --git ui/display/screen.cc ui/display/screen.cc
index 3090a05e91f31..d9667f9526278 100644
--- ui/display/screen.cc
+++ ui/display/screen.cc
@@ -108,13 +108,13 @@ base::TimeDelta Screen::CalculateIdleTime() const {
gfx::Rect Screen::ScreenToDIPRectInWindow(gfx::NativeWindow window,
const gfx::Rect& screen_rect) const {
float scale = GetDisplayNearestWindow(window).device_scale_factor();
- return ScaleToEnclosingRect(screen_rect, 1.0f / scale);
+ return ScaleToRoundedRect(screen_rect, 1.0f / scale);
}
gfx::Rect Screen::DIPToScreenRectInWindow(gfx::NativeWindow window,
const gfx::Rect& dip_rect) const {
float scale = GetDisplayNearestWindow(window).device_scale_factor();
- return ScaleToEnclosingRect(dip_rect, scale);
+ return ScaleToRoundedRect(dip_rect, scale);
}
bool Screen::GetDisplayWithDisplayId(int64_t display_id,
diff --git ui/display/win/screen_win.cc ui/display/win/screen_win.cc
index db01034339fda..59bfd0e2f75c4 100644
--- ui/display/win/screen_win.cc
+++ ui/display/win/screen_win.cc
@@ -619,7 +619,7 @@ gfx::Rect ScreenWin::ScreenToDIPRect(HWND hwnd, const gfx::Rect& pixel_bounds) {
gfx::PointF(pixel_bounds.origin()), screen_win_display));
const float scale_factor =
1.0f / screen_win_display.display().device_scale_factor();
- return {origin, ScaleToEnclosingRect(pixel_bounds, scale_factor).size()};
+ return {origin, ScaleToRoundedRect(pixel_bounds, scale_factor).size()};
}
// static
@@ -634,7 +634,7 @@ gfx::Rect ScreenWin::DIPToScreenRect(HWND hwnd, const gfx::Rect& dip_bounds) {
const gfx::Point origin =
display::win::DIPToScreenPoint(dip_bounds.origin(), screen_win_display);
const float scale_factor = screen_win_display.display().device_scale_factor();
- return {origin, ScaleToEnclosingRect(dip_bounds, scale_factor).size()};
+ return {origin, ScaleToRoundedRect(dip_bounds, scale_factor).size()};
}
// static