Index: ui/gfx/win/dpi.cc |
diff --git a/ui/gfx/win/dpi.cc b/ui/gfx/win/dpi.cc |
index e93a38d8bd00cee34c1fae4fc8007d56709d6d57..8639a35e2e106ff4326050f266ce6d5462ed8100 100644 |
--- a/ui/gfx/win/dpi.cc |
+++ b/ui/gfx/win/dpi.cc |
@@ -38,7 +38,7 @@ float GetUnforcedDeviceScaleFactor() { |
// If the global device scale factor is initialized use it. This is to ensure |
// we use the same scale factor across all callsites. We don't use the |
// GetDeviceScaleFactor function here because it fires a DCHECK if the |
- // g_device_scale_factor global is 0. |
+ // g_device_scale_factor global is 0. |
if (g_device_scale_factor) |
return g_device_scale_factor; |
return static_cast<float>(gfx::GetDPI().width()) / |
@@ -184,7 +184,7 @@ float GetDeviceScaleFactor() { |
Point ScreenToDIPPoint(const Point& pixel_point) { |
return ToFlooredPoint(ScalePoint(pixel_point, |
- 1.0f / GetDeviceScaleFactor())); |
+ 1.0f / GetDeviceScaleFactor())); |
} |
Point DIPToScreenPoint(const Point& dip_point) { |
@@ -192,32 +192,30 @@ Point DIPToScreenPoint(const Point& dip_point) { |
} |
Rect ScreenToDIPRect(const Rect& pixel_bounds) { |
- // TODO(kevers): Switch to non-deprecated method for float to int conversions. |
- return ToFlooredRectDeprecated( |
- ScaleRect(pixel_bounds, 1.0f / GetDeviceScaleFactor())); |
+ // It's important we scale the origin and size separately. If we instead |
+ // calculated the size from the floored origin and ceiled right the size could |
+ // vary depending upon where the two points land. That would cause problems |
+ // for the places this code is used (in particular mapping from native window |
+ // bounds to DIPs). |
+ return Rect(ScreenToDIPPoint(pixel_bounds.origin()), |
+ ScreenToDIPSize(pixel_bounds.size())); |
} |
Rect DIPToScreenRect(const Rect& dip_bounds) { |
- // We scale the origin by the scale factor and round up via ceil. This |
- // ensures that we get the original logical origin back when we scale down. |
- // We round the size down after scaling. It may be better to round this up |
- // on the same lines as the origin. |
- // TODO(ananta) |
- // Investigate if rounding size up on the same lines as origin is workable. |
- return gfx::Rect( |
- gfx::ToCeiledPoint(gfx::ScalePoint( |
- dip_bounds.origin(), GetDeviceScaleFactor())), |
- gfx::ToFlooredSize(gfx::ScaleSize( |
- dip_bounds.size(), GetDeviceScaleFactor()))); |
+ // See comment in ScreenToDIPRect for why we calculate size like this. |
+ return Rect(DIPToScreenPoint(dip_bounds.origin()), |
+ DIPToScreenSize(dip_bounds.size())); |
} |
Size ScreenToDIPSize(const Size& size_in_pixels) { |
- return ToFlooredSize( |
+ // Always ceil sizes. Otherwise we may be leaving off part of the bounds. |
+ return ToCeiledSize( |
ScaleSize(size_in_pixels, 1.0f / GetDeviceScaleFactor())); |
} |
Size DIPToScreenSize(const Size& dip_size) { |
- return ToFlooredSize(ScaleSize(dip_size, GetDeviceScaleFactor())); |
+ // Always ceil sizes. Otherwise we may be leaving off part of the bounds. |
+ return ToCeiledSize(ScaleSize(dip_size, GetDeviceScaleFactor())); |
} |
int GetSystemMetricsInDIP(int metric) { |