Chromium Code Reviews| Index: chrome/browser/ui/libgtkui/gtk_ui.cc |
| diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc |
| index 1f6cdf048caf135278199b4babfc9d713c60116a..219c31738906acc8bc9d3aea0b339166cfe1aef3 100644 |
| --- a/chrome/browser/ui/libgtkui/gtk_ui.cc |
| +++ b/chrome/browser/ui/libgtkui/gtk_ui.cc |
| @@ -7,6 +7,8 @@ |
| #include <math.h> |
| #include <pango/pango.h> |
| #include <X11/Xcursor/Xcursor.h> |
| + |
| +#include <cmath> |
| #include <set> |
| #include <utility> |
| @@ -84,6 +86,8 @@ namespace libgtkui { |
| namespace { |
| +const double kDefaultDPI = 96; |
| + |
| class GtkButtonImageSource : public gfx::ImageSkiaSource { |
| public: |
| GtkButtonImageSource(const char* idr_string, gfx::Size size) |
| @@ -350,44 +354,42 @@ gfx::FontRenderParams GetGtkFontRenderParams() { |
| return params; |
| } |
| -double GetDPI() { |
| - // Linux chrome currently does not support dynamic DPI changes. |
| - // Keep using the first value detected. |
| - static double dpi = -1.f; |
| - if (dpi < 0) { |
| - const double kDefaultDPI = 96; |
| - |
| - if (display::Display::HasForceDeviceScaleFactor()) { |
| - dpi = display::Display::GetForcedDeviceScaleFactor() * kDefaultDPI; |
| - return dpi; |
| - } |
| +double GetDpi() { |
| + if (display::Display::HasForceDeviceScaleFactor()) |
| + return display::Display::GetForcedDeviceScaleFactor() * kDefaultDPI; |
| - GtkSettings* gtk_settings = gtk_settings_get_default(); |
| - CHECK(gtk_settings); |
| - gint gtk_dpi = -1; |
| - g_object_get(gtk_settings, "gtk-xft-dpi", >k_dpi, NULL); |
| + GtkSettings* gtk_settings = gtk_settings_get_default(); |
| + CHECK(gtk_settings); |
| + gint gtk_dpi = -1; |
| + g_object_get(gtk_settings, "gtk-xft-dpi", >k_dpi, NULL); |
| - // GTK multiplies the DPI by 1024 before storing it. |
| - dpi = (gtk_dpi > 0) ? gtk_dpi / 1024.0 : kDefaultDPI; |
| + // GTK multiplies the DPI by 1024 before storing it. |
| + return (gtk_dpi > 0) ? gtk_dpi / 1024.0 : kDefaultDPI; |
| +} |
| - // DSF is always >=1.0 on win/cros and lower DSF has never been considered |
| - // nor tested. |
| - dpi = std::max(kDefaultDPI, dpi); |
| - } |
| - return dpi; |
| +float GetRawDeviceScaleFactor() { |
| + if (display::Display::HasForceDeviceScaleFactor()) |
| + return display::Display::GetForcedDeviceScaleFactor(); |
| + return GetDpi() / kDefaultDPI; |
| } |
| -// Queries GTK for its font DPI setting and returns the number of pixels in a |
| -// point. |
| -double GetPixelsInPoint(float device_scale_factor) { |
| - double dpi = GetDPI(); |
| +// Returns the font size for the *raw* device scale factor in points. |
| +// The |device_scale_factor| is used to cancel the scale to be applied by UI |
| +// and to compensate the scale when the device_scale_factor is floored. |
| +double GetFontSizePixelsInPoint(float device_scale_factor) { |
|
Evan Stade
2016/11/03 16:38:03
perhaps this param could be called ui_scale_factor
oshima
2016/11/05 15:15:05
changed to ui_device_scale_factor.
|
| + // There are 72 points in an inch. |
| + double point = GetDpi() / 72.0; |
| // Take device_scale_factor into account — if Chrome already scales the |
| // entire UI up by 2x, we should not also scale up. |
| - dpi /= device_scale_factor; |
| - |
| - // There are 72 points in an inch. |
| - return dpi / 72.0; |
| + point /= device_scale_factor; |
| + |
| + // Allow the scale lower than 1.0 only for fonts. Don't always use |
| + // the raw value however, beacuse the 1.0~1.3 is rounded to 1.0. |
|
Evan Stade
2016/11/03 16:38:03
why not allow users to bump font size slightly? Th
oshima
2016/11/05 15:15:05
I want to keep the current behavior for dsf>1 case
|
| + float raw_scale = GetRawDeviceScaleFactor(); |
| + if (raw_scale < 1.0f) |
| + return point * raw_scale / device_scale_factor; |
| + return point; |
| } |
| views::LinuxUI::NonClientMiddleClickAction GetDefaultMiddleClickAction() { |
| @@ -411,8 +413,7 @@ Gtk2UI::Gtk2UI() |
| : default_font_size_pixels_(0), |
| default_font_style_(gfx::Font::NORMAL), |
| default_font_weight_(gfx::Font::Weight::NORMAL), |
| - middle_click_action_(GetDefaultMiddleClickAction()), |
| - device_scale_factor_(1.0) { |
| + middle_click_action_(GetDefaultMiddleClickAction()) { |
| GtkInitFromCommandLine(*base::CommandLine::ForCurrentProcess()); |
| } |
| @@ -810,7 +811,7 @@ void Gtk2UI::LoadGtkValues() { |
| colors_[ThemeProperties::COLOR_BACKGROUND_TAB_TEXT] = |
| color_utils::BlendTowardOppositeLuma(label_color, 50); |
| - UpdateDefaultFont(); |
| + UpdateDeviceScaleFactor(); |
| // Build the various icon tints. |
| GetNormalButtonTintHSL(&button_tint_); |
| @@ -1030,8 +1031,8 @@ void Gtk2UI::UpdateDefaultFont() { |
| const double size_points = pango_font_description_get_size(desc) / |
| static_cast<double>(PANGO_SCALE); |
| default_font_size_pixels_ = static_cast<int>( |
| - GetPixelsInPoint(device_scale_factor_) * size_points + 0.5); |
| - query.point_size = static_cast<int>(size_points); |
| + GetFontSizePixelsInPoint(GetDeviceScaleFactor()) * size_points); |
| + query.point_size = static_cast<int>(size_points); |
| } |
| query.style = gfx::Font::NORMAL; |
| @@ -1051,20 +1052,20 @@ void Gtk2UI::ResetStyle() { |
| NativeThemeGtk2::instance()->NotifyObservers(); |
| } |
| -void Gtk2UI::UpdateDeviceScaleFactor(float device_scale_factor) { |
| - device_scale_factor_ = device_scale_factor; |
| +void Gtk2UI::UpdateDeviceScaleFactor() { |
| + // Note: Linux chrome currently does not support dynamic DPI |
| + // changes. This is to allow flags to override the DPI settings |
| + // during startup. |
| + float scale = GetRawDeviceScaleFactor(); |
| + |
| + // Blacklist scaling factors <130% (crbug.com/484400) and round |
| + // to 1 decimal to prevent rendering problems (crbug.com/485183). |
| + device_scale_factor_ = scale < 1.3f ? 1.0f : roundf(scale * 10) / 10; |
| UpdateDefaultFont(); |
| } |
| float Gtk2UI::GetDeviceScaleFactor() const { |
| - if (display::Display::HasForceDeviceScaleFactor()) |
| - return display::Display::GetForcedDeviceScaleFactor(); |
| - const int kCSSDefaultDPI = 96; |
| - const float scale = GetDPI() / kCSSDefaultDPI; |
| - |
| - // Blacklist scaling factors <130% (crbug.com/484400) and round |
| - // to 1 decimal to prevent rendering problems (crbug.com/485183). |
| - return scale < 1.3f ? 1.0f : roundf(scale * 10) / 10; |
| + return device_scale_factor_; |
| } |
| } // namespace libgtkui |