Skip to content

Commit

Permalink
Merge pull request #1102 from reupen/no-antialiasing
Browse files Browse the repository at this point in the history
Allow disabling anti-aliasing for DirectWrite rendered text
  • Loading branch information
reupen authored Jan 25, 2025
2 parents c9fd2eb + 5957267 commit 405bd44
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 12 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@

## Development version

### Features

- A ‘No anti-aliasing’ DirectWrite text rendering mode was added.
[[#1100](https://github.com/reupen/columns_ui/pull/1100)]

Additionally, the previous ‘Automatic’ mode has been renamed ‘Automatic
anti-aliasing’, and a new ‘Default’ mode has been added that selects
‘Automatic anti-aliasing’ or ‘No anti-aliasing’ based on the system ‘Smooth
edges of screen fonts’ setting.

## 3.0.0-alpha.4

- A bug where DirectWrite-rendered text did not use the correct font family on
Expand Down
6 changes: 6 additions & 0 deletions foo_ui_columns/font_manager_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,12 @@ fbh::ConfigBool force_greyscale_antialiasing(

DWRITE_RENDERING_MODE get_rendering_mode()
{
if (rendering_mode.get() == WI_EnumValue(RenderingMode::Automatic)) {
BOOL font_smoothing_enabled{true};
SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &font_smoothing_enabled, 0);
return font_smoothing_enabled ? DWRITE_RENDERING_MODE_DEFAULT : DWRITE_RENDERING_MODE_ALIASED;
}

return static_cast<DWRITE_RENDERING_MODE>(rendering_mode.get());
}

Expand Down
4 changes: 3 additions & 1 deletion foo_ui_columns/font_manager_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ enum class FontMode {
};

enum class RenderingMode : int32_t {
Automatic = DWRITE_RENDERING_MODE_DEFAULT,
Automatic = 99,
NaturalAutomatic = DWRITE_RENDERING_MODE_DEFAULT,
Natural = DWRITE_RENDERING_MODE_NATURAL,
NaturalSymmetric = DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
Aliased = DWRITE_RENDERING_MODE_ALIASED,
GdiClassic = DWRITE_RENDERING_MODE_GDI_CLASSIC,
GdiNatural = DWRITE_RENDERING_MODE_GDI_NATURAL,
};
Expand Down
2 changes: 1 addition & 1 deletion foo_ui_columns/font_manager_v3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ class NOVTABLE FontManager3 : public manager_v3 {
auto axis_values = uih::direct_write::axis_values_to_vector(font_description.axis_values);

return fb2k::service_new<Font>(log_font, wss, font_description.typographic_family_name, std::move(axis_values),
size, static_cast<DWRITE_RENDERING_MODE>(rendering_mode.get()), force_greyscale_antialiasing.get());
size, get_rendering_mode(), force_greyscale_antialiasing.get());
}

void set_font_size(GUID id, float size) override
Expand Down
38 changes: 29 additions & 9 deletions foo_ui_columns/system_appearance_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,20 +163,40 @@ class AppearanceMessageWindow {
}
} break;
case WM_SETTINGCHANGE:
if ((wp == SPI_GETICONTITLELOGFONT && g_font_manager_data.m_common_items_entry
&& g_font_manager_data.m_common_items_entry->font_mode == fonts::FontMode::System)
|| (wp == SPI_GETNONCLIENTMETRICS && g_font_manager_data.m_common_labels_entry
&& g_font_manager_data.m_common_labels_entry->font_mode == fonts::FontMode::System)) {
g_font_manager_data.g_on_common_font_changed(
wp == SPI_GETICONTITLELOGFONT ? fonts::font_type_flag_items : fonts::font_type_flag_labels);
switch (wp) {
case SPI_SETFONTSMOOTHING:
if (fonts::rendering_mode.get() == WI_EnumValue(fonts::RenderingMode::Automatic))
g_font_manager_data.on_rendering_options_change();
break;
case SPI_SETICONTITLELOGFONT:
if (!g_font_manager_data.m_common_items_entry
|| g_font_manager_data.m_common_items_entry->font_mode != fonts::FontMode::System)
break;

g_font_manager_data.g_on_common_font_changed(fonts::font_type_flag_items);

for (auto client_ptr : fonts::client::enumerate()) {
const auto p_data = g_font_manager_data.find_by_id(client_ptr->get_client_guid());
const auto entry = g_font_manager_data.find_by_id(client_ptr->get_client_guid());

if ((wp == SPI_GETNONCLIENTMETRICS && p_data->font_mode == fonts::FontMode::CommonItems)
|| (wp == SPI_GETICONTITLELOGFONT && p_data->font_mode == fonts::FontMode::CommonLabels))
if (entry->font_mode == fonts::FontMode::CommonItems)
g_font_manager_data.dispatch_client_font_changed(client_ptr);
}
break;
case SPI_SETNONCLIENTMETRICS: {
if (!g_font_manager_data.m_common_labels_entry
|| g_font_manager_data.m_common_labels_entry->font_mode != fonts::FontMode::System)
break;

g_font_manager_data.g_on_common_font_changed(fonts::font_type_flag_labels);

for (auto client_ptr : fonts::client::enumerate()) {
const auto entry = g_font_manager_data.find_by_id(client_ptr->get_client_guid());

if (entry->font_mode == fonts::FontMode::CommonLabels)
g_font_manager_data.dispatch_client_font_changed(client_ptr);
}
break;
}
}
break;
case WM_NCDESTROY:
Expand Down
4 changes: 3 additions & 1 deletion foo_ui_columns/tab_text_rendering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ namespace cui::prefs {
namespace {

constexpr auto rendering_modes = {
std::make_tuple(fonts::RenderingMode::Automatic, L"Automatic"),
std::make_tuple(fonts::RenderingMode::Automatic, L"Default"),
std::make_tuple(fonts::RenderingMode::NaturalAutomatic, L"Automatic anti-aliasing"),
std::make_tuple(fonts::RenderingMode::Natural, L"Horizontal anti-aliasing"),
std::make_tuple(fonts::RenderingMode::NaturalSymmetric, L"Symmetric anti-aliasing"),
std::make_tuple(fonts::RenderingMode::Aliased, L"No anti-aliasing"),
std::make_tuple(fonts::RenderingMode::GdiClassic, L"GDI-compatible, classic"),
std::make_tuple(fonts::RenderingMode::GdiNatural, L"GDI-compatible, natural"),
};
Expand Down

0 comments on commit 405bd44

Please sign in to comment.