Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Unified Diff: ui/gfx/dpi.cc

Issue 659883002: Enable hidpi on Linux, refactor a bit on Windows to share Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: constants Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/gfx/dpi.cc
diff --git a/ui/gfx/dpi.cc b/ui/gfx/dpi.cc
new file mode 100644
index 0000000000000000000000000000000000000000..fc5f72502815138b4c17b2b566e03b438c78d7dc
--- /dev/null
+++ b/ui/gfx/dpi.cc
@@ -0,0 +1,110 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/dpi.h"
+
+#include <algorithm>
+
+#include "base/logging.h"
+#include "ui/gfx/display.h"
+#include "ui/gfx/point_conversions.h"
+#include "ui/gfx/rect_conversions.h"
+#include "ui/gfx/size_conversions.h"
+
+namespace {
+
+int kDefaultDPI = 96;
+
+float g_device_scale_factor = 0.0f;
+
+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.
+ if (g_device_scale_factor)
+ return g_device_scale_factor;
+ return static_cast<float>(gfx::GetDPI().width()) /
+ static_cast<float>(kDefaultDPI);
+}
+
+} // namespace
+
+
+namespace gfx {
+
+void InitDeviceScaleFactor(float scale) {
+ DCHECK_NE(0.0f, scale);
+ g_device_scale_factor = std::max(1.f, scale);
+}
+
+float GetDeviceScaleFactor() {
+ DCHECK_NE(0.0f, g_device_scale_factor);
+ return g_device_scale_factor;
+}
+
+bool IsDeviceScaleFactorSet() {
+ return g_device_scale_factor != 0.0f;
+}
+
+void ForceHighDPISupportForTesting(float scale) {
+ g_device_scale_factor = scale;
+}
+
+bool IsInHighDPIMode() {
+ return GetDPIScale() > 1.0;
+}
+
+float GetDPIScale() {
+ if (IsHighDPIEnabled()) {
+ if (gfx::Display::HasForceDeviceScaleFactor())
+ return gfx::Display::GetForcedDeviceScaleFactor();
+ float dpi_scale = GetUnforcedDeviceScaleFactor();
+ if (dpi_scale <= 1.25) {
+ // Force 125% and below to 100% scale. We do this to maintain previous
+ // (non-DPI-aware) behavior where only the font size was boosted.
+ dpi_scale = 1.0;
+ }
+ return dpi_scale;
+ }
+ return 1.0;
+}
+
+Point ScreenToDIPPoint(const Point& pixel_point) {
+ return ToFlooredPoint(ScalePoint(pixel_point,
+ 1.0f / GetDeviceScaleFactor()));
+}
+
+Point DIPToScreenPoint(const Point& dip_point) {
+ return ToFlooredPoint(ScalePoint(dip_point, GetDeviceScaleFactor()));
+}
+
+Rect ScreenToDIPRect(const Rect& pixel_bounds) {
+ // 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) {
+ // 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) {
+ // 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) {
+ // Always ceil sizes. Otherwise we may be leaving off part of the bounds.
+ return ToCeiledSize(ScaleSize(dip_size, GetDeviceScaleFactor()));
+}
+
+} // namespace gfx

Powered by Google App Engine
This is Rietveld 408576698