diff --git a/patch/patch.cfg b/patch/patch.cfg index dfe142f51..62b049d50 100644 --- a/patch/patch.cfg +++ b/patch/patch.cfg @@ -611,6 +611,11 @@ patches = [ # Create top-level widget type when Widget::InitParams::child is false. '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. # https://bugs.chromium.org/p/chromium/issues/detail?id=893292#c10 diff --git a/patch/patches/screen_1443650.patch b/patch/patches/screen_1443650.patch new file mode 100644 index 000000000..6cb21fc87 --- /dev/null +++ b/patch/patches/screen_1443650.patch @@ -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 767d02f5b660a..f6926e4ef96fa 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