font_render_params_win.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/gfx/font_render_params.h"
  5. #include <memory>
  6. #include "base/bind.h"
  7. #include "base/callback_helpers.h"
  8. #include "base/files/file_path.h"
  9. #include "base/memory/singleton.h"
  10. #include "base/win/registry.h"
  11. #include "ui/gfx/win/singleton_hwnd_observer.h"
  12. namespace gfx {
  13. namespace {
  14. FontRenderParams::SubpixelRendering GetSubpixelRenderingGeometry() {
  15. DISPLAY_DEVICE display_device = {sizeof(DISPLAY_DEVICE)};
  16. for (int i = 0; EnumDisplayDevices(nullptr, i, &display_device, 0); ++i) {
  17. // TODO(scottmg): We only support the primary device currently.
  18. if (display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
  19. base::FilePath trimmed =
  20. base::FilePath(display_device.DeviceName).BaseName();
  21. base::win::RegKey key(
  22. HKEY_LOCAL_MACHINE,
  23. (L"SOFTWARE\\Microsoft\\Avalon.Graphics\\" + trimmed.value()).c_str(),
  24. KEY_READ);
  25. DWORD structure;
  26. if (key.ReadValueDW(L"PixelStructure", &structure) == ERROR_SUCCESS) {
  27. switch (structure) {
  28. case 0:
  29. return FontRenderParams::SUBPIXEL_RENDERING_NONE;
  30. case 1:
  31. return FontRenderParams::SUBPIXEL_RENDERING_RGB;
  32. case 2:
  33. return FontRenderParams::SUBPIXEL_RENDERING_BGR;
  34. }
  35. return FontRenderParams::SUBPIXEL_RENDERING_NONE;
  36. }
  37. break;
  38. }
  39. }
  40. UINT structure = 0;
  41. if (SystemParametersInfo(SPI_GETFONTSMOOTHINGORIENTATION, 0, &structure, 0)) {
  42. switch (structure) {
  43. case FE_FONTSMOOTHINGORIENTATIONRGB:
  44. return FontRenderParams::SUBPIXEL_RENDERING_RGB;
  45. case FE_FONTSMOOTHINGORIENTATIONBGR:
  46. return FontRenderParams::SUBPIXEL_RENDERING_BGR;
  47. }
  48. }
  49. // No explicit ClearType settings, default to none.
  50. return FontRenderParams::SUBPIXEL_RENDERING_NONE;
  51. }
  52. // Caches font render params and updates them on system notifications.
  53. class CachedFontRenderParams {
  54. public:
  55. static CachedFontRenderParams* GetInstance() {
  56. return base::Singleton<CachedFontRenderParams>::get();
  57. }
  58. CachedFontRenderParams(const CachedFontRenderParams&) = delete;
  59. CachedFontRenderParams& operator=(const CachedFontRenderParams&) = delete;
  60. const FontRenderParams& GetParams() {
  61. if (params_)
  62. return *params_;
  63. params_ = std::make_unique<FontRenderParams>();
  64. params_->antialiasing = false;
  65. params_->subpixel_positioning = false;
  66. params_->autohinter = false;
  67. params_->use_bitmaps = false;
  68. params_->hinting = FontRenderParams::HINTING_MEDIUM;
  69. params_->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_NONE;
  70. BOOL enabled = false;
  71. if (SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &enabled, 0) && enabled) {
  72. params_->antialiasing = true;
  73. params_->subpixel_positioning = true;
  74. UINT type = 0;
  75. if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &type, 0) &&
  76. type == FE_FONTSMOOTHINGCLEARTYPE) {
  77. params_->subpixel_rendering = GetSubpixelRenderingGeometry();
  78. }
  79. }
  80. singleton_hwnd_observer_ =
  81. std::make_unique<SingletonHwndObserver>(base::BindRepeating(
  82. &CachedFontRenderParams::OnWndProc, base::Unretained(this)));
  83. return *params_;
  84. }
  85. private:
  86. friend struct base::DefaultSingletonTraits<CachedFontRenderParams>;
  87. CachedFontRenderParams() {}
  88. ~CachedFontRenderParams() {}
  89. void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
  90. if (message == WM_SETTINGCHANGE) {
  91. // TODO(khushalsagar): This should trigger an update to the
  92. // renderer and gpu processes, where the params are cached.
  93. params_.reset();
  94. singleton_hwnd_observer_.reset(nullptr);
  95. }
  96. }
  97. std::unique_ptr<FontRenderParams> params_;
  98. std::unique_ptr<SingletonHwndObserver> singleton_hwnd_observer_;
  99. };
  100. } // namespace
  101. FontRenderParams GetFontRenderParams(const FontRenderParamsQuery& query,
  102. std::string* family_out) {
  103. if (family_out)
  104. NOTIMPLEMENTED();
  105. // Customized font rendering settings are not supported, only defaults.
  106. return CachedFontRenderParams::GetInstance()->GetParams();
  107. }
  108. float GetFontRenderParamsDeviceScaleFactor() {
  109. return 1.;
  110. }
  111. } // namespace gfx