Skip to content

Commit

Permalink
Make font aliasing optional
Browse files Browse the repository at this point in the history
  • Loading branch information
BAndysc committed Dec 28, 2024
1 parent 13fe73f commit 82339f9
Show file tree
Hide file tree
Showing 19 changed files with 70 additions and 17 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ While Windows 9x used the bitmap font MS Sans Serif for its distinctive appearan

Tahoma is available on Windows and macOS, but not Linux. A free alternative, 'Wine Tahoma Regular,' is distributed under the GNU Lesser General Public License, but I’m unsure if it’s compatible with the MIT license. Any insights would be appreciated.

#### Font aliasing

For the old look and feel, Classic.Avalonia disables antialiasing (smoothing) for font rendering. If for some reason, you would like to use Classic.Avalonia **with** font antialiasing, set property `FontAliasing` on the `ClassicTheme`:

```
<classic:ClassicTheme FontAliasing="False" />
```

## Custom Controls

`Classic.Avalonia` introduces several custom controls with a classic appearance and behavior.
Expand Down
2 changes: 1 addition & 1 deletion samples/AvaloniaVisualBasic/Controls/MDIWindow.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<TextBlock Text="{TemplateBinding Title}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
RenderOptions.TextRenderingMode="Alias"
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}"
FontFamily="{DynamicResource {x:Static commonControls:NonClientMetrics.CaptionFontKey}}"
FontSize="{DynamicResource {x:Static commonControls:NonClientMetrics.CaptionFontSizeKey}}"
IsHitTestVisible="False"
Expand Down
2 changes: 1 addition & 1 deletion samples/AvaloniaVisualBasic/Forms/Views/FormEditView.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
<TextBlock Text="Form1"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
RenderOptions.TextRenderingMode="Alias"
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}"
FontFamily="{DynamicResource {x:Static commonControls:NonClientMetrics.CaptionFontKey}}"
FontSize="{DynamicResource {x:Static commonControls:NonClientMetrics.CaptionFontSizeKey}}"
IsHitTestVisible="False"
Expand Down
13 changes: 13 additions & 0 deletions src/Classic.Avalonia.Theme/ClassicTheme.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
using Avalonia.Markup.Xaml;
using Avalonia.Metadata;
using Avalonia.Styling;
using Classic.CommonControls;

[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Classic.Avalonia.Theme")]

namespace Classic.Avalonia.Theme;

public class ClassicTheme : Styles
{
public static readonly StyledProperty<bool> FontAliasingProperty = AvaloniaProperty.Register<ClassicTheme, bool>(nameof(FontAliasing), defaultValue: true);
public static ThemeVariant Standard { get; } = new("Standard", ThemeVariant.Light);
public static ThemeVariant Classic { get; } = new("Classic", ThemeVariant.Light);
public static ThemeVariant Brick { get; } = new("Brick", ThemeVariant.Light);
Expand Down Expand Up @@ -52,6 +54,11 @@ static void UpdateRangeClasses(RangeBase bar)
window.Classes.Add("__classic_theme_is_mac");
});
}

FontAliasingProperty.Changed.AddClassHandler<ClassicTheme>((theme, e) =>
{
theme.Resources[SystemParameters.FontAliasingKey] = e.GetNewValue<bool>();
});
}

/// <summary>
Expand All @@ -62,4 +69,10 @@ public ClassicTheme(IServiceProvider? sp = null)
{
AvaloniaXamlLoader.Load(sp, this);
}

public bool FontAliasing
{
get => GetValue(FontAliasingProperty);
set => SetValue(FontAliasingProperty, value);
}
}
1 change: 0 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/AutoAttachTitleBar.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
<TextBlock Text="{Binding $parent[Window].Title}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
RenderOptions.TextRenderingMode="Alias"
FontFamily="{DynamicResource {x:Static common:NonClientMetrics.CaptionFontKey}}"
FontSize="{DynamicResource {x:Static common:NonClientMetrics.CaptionFontSizeKey}}"
IsHitTestVisible="False"
Expand Down
3 changes: 2 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/CalendarDatePicker.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<Design.PreviewWith>
<Border Height="200"
Expand Down Expand Up @@ -79,7 +80,7 @@
DisplayDateStart="{TemplateBinding DisplayDateStart}"
FirstDayOfWeek="{TemplateBinding FirstDayOfWeek}"
IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}"
RenderOptions.TextRenderingMode="Alias"
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}"
RenderOptions.EdgeMode="Aliased"
SelectedDate="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedDate,
Mode=TwoWay}" />
Expand Down
3 changes: 2 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/ComboBox.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:controls="clr-namespace:Classic.Avalonia.Theme.Controls"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<Design.PreviewWith>
<ComboBox Width="200" IsEnabled="False"></ComboBox>
Expand Down Expand Up @@ -102,7 +103,7 @@
<Border x:Name="DropDownBorder"
Background="{DynamicResource {x:Static common:SystemColors.WindowBrushKey}}"
BorderThickness="1"
RenderOptions.TextRenderingMode="Alias"
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}"
BorderBrush="{DynamicResource {x:Static common:SystemColors.WindowFrameBrushKey}}">
<ScrollViewer Name="DropDownScrollViewer"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
Expand Down
3 changes: 2 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/DatePicker.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
xmlns:sys="using:System"
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<Design.PreviewWith>
<Border Padding="20">
Expand Down Expand Up @@ -166,7 +167,7 @@
Placement="Bottom"
PlacementTarget="{Binding #PART_FlyoutButton}"
WindowManagerAddShadowHint="False">
<DatePickerPresenter Name="PART_PickerPresenter" RenderOptions.TextRenderingMode="Alias" />
<DatePickerPresenter Name="PART_PickerPresenter" utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}" />
</Popup>
</Grid>
</classic:ClassicBorderDecorator>
Expand Down
3 changes: 2 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/FlyoutPresenter.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<ControlTheme x:Key="{x:Type FlyoutPresenter}"
TargetType="FlyoutPresenter">
Expand All @@ -19,7 +20,7 @@
Background="{TemplateBinding Background}"
RenderOptions.EdgeMode="Aliased"
RenderOptions.BitmapInterpolationMode="None"
RenderOptions.TextRenderingMode="Alias"
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}">
Expand Down
3 changes: 2 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/ManagedFileChooser.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
xmlns:converters="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<Design.PreviewWith>
<dialogs:ManagedFileChooser Width="555" Height="384"/>
Expand Down Expand Up @@ -80,7 +81,7 @@
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
Padding="{TemplateBinding Padding}"
RenderOptions.TextRenderingMode="Alias">
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}">
<DockPanel Margin="5">
<DockPanel Margin="0,0,75,5"
DockPanel.Dock="Top">
Expand Down
1 change: 0 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/Menu.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
<ItemsPresenter Name="PART_ItemsPresenter"
Margin="1"
Grid.IsSharedSizeScope="True"
RenderOptions.TextRenderingMode="Alias"
ItemsPanel="{TemplateBinding ItemsPanel}" />
</ScrollViewer>
</classic:ClassicBorderDecorator>
Expand Down
3 changes: 2 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/MenuFlyoutPresenter.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<ControlTheme x:Key="{x:Type MenuFlyoutPresenter}"
TargetType="MenuFlyoutPresenter">
Expand All @@ -15,7 +16,7 @@
BorderBrush="{x:Static classic:ClassicBorderDecorator.ClassicBorderBrush}"
RenderOptions.EdgeMode="Aliased"
RenderOptions.BitmapInterpolationMode="None"
RenderOptions.TextRenderingMode="Alias"
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}"
BorderThickness="2">
<ScrollViewer HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
Theme="{StaticResource SimpleMenuScrollViewer}"
Expand Down
4 changes: 2 additions & 2 deletions src/Classic.Avalonia.Theme/Styles/MenuItem.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
xmlns:sys="using:System"
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<conv:PlatformKeyGestureConverter x:Key="KeyGestureConverter" />

Expand All @@ -20,7 +21,7 @@
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
RenderOptions.TextRenderingMode="Alias">
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="19" />
Expand Down Expand Up @@ -86,7 +87,6 @@
<ItemsPresenter Name="PART_ItemsPresenter"
Margin="1"
Grid.IsSharedSizeScope="True"
RenderOptions.TextRenderingMode="Alias"
ItemsPanel="{TemplateBinding ItemsPanel}" />
</ScrollViewer>
</classic:ClassicBorderDecorator>
Expand Down
3 changes: 2 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/TimePicker.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
xmlns:sys="using:System"
xmlns:classic="clr-namespace:Classic.Avalonia.Theme"
xmlns:common="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia"
xmlns:utils="clr-namespace:Classic.Avalonia.Theme.Utils"
x:ClassModifier="internal">
<Design.PreviewWith>
<Border Padding="20">
Expand Down Expand Up @@ -201,7 +202,7 @@
Placement="Bottom"
PlacementTarget="{TemplateBinding}"
WindowManagerAddShadowHint="False">
<TimePickerPresenter Name="PART_PickerPresenter" RenderOptions.TextRenderingMode="Alias" />
<TimePickerPresenter Name="PART_PickerPresenter" utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}" />
</Popup>
</Grid>
</classic:ClassicBorderDecorator>
Expand Down
1 change: 0 additions & 1 deletion src/Classic.Avalonia.Theme/Styles/ToolTip.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
ContentTemplate="{TemplateBinding ContentTemplate}"
RenderOptions.EdgeMode="Aliased"
RenderOptions.BitmapInterpolationMode="None"
RenderOptions.TextRenderingMode="Alias"
CornerRadius="{TemplateBinding CornerRadius}" />
</ControlTemplate>
</Setter>
Expand Down
4 changes: 2 additions & 2 deletions src/Classic.Avalonia.Theme/Styles/Window.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<ControlTemplate>
<Panel RenderOptions.EdgeMode="Aliased"
RenderOptions.BitmapInterpolationMode="None"
RenderOptions.TextRenderingMode="Alias">
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}">
<Border Name="PART_TransparencyFallback"
IsHitTestVisible="False"
Margin="2" />
Expand Down Expand Up @@ -88,7 +88,7 @@
<ControlTemplate>
<Panel RenderOptions.EdgeMode="Aliased"
RenderOptions.BitmapInterpolationMode="None"
RenderOptions.TextRenderingMode="Alias">
utils:FontUtils.FontAliasing="{DynamicResource {x:Static common:SystemParameters.FontAliasingKey}}">
<Border Name="PART_TransparencyFallback"
IsHitTestVisible="False" />
<Border Background="{TemplateBinding Background}"
Expand Down
22 changes: 22 additions & 0 deletions src/Classic.Avalonia.Theme/Utils/FontUtils.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media;

namespace Classic.Avalonia.Theme.Utils;

internal class FontUtils
{
public static readonly AttachedProperty<bool?> FontAliasingProperty = AvaloniaProperty.RegisterAttached<FontUtils, Control, bool?>("FontAliasing");

public static bool? GetFontAliasing(AvaloniaObject element) => element.GetValue(FontAliasingProperty);

public static void SetFontAliasing(AvaloniaObject element, bool? value) => element.SetValue(FontAliasingProperty, value);

static FontUtils()
{
FontAliasingProperty.Changed.AddClassHandler<Control>((c, e) =>
{
RenderOptions.SetTextRenderingMode(c, e.GetNewValue<bool?>() is true ? TextRenderingMode.Alias : TextRenderingMode.SubpixelAntialias);
});
}
}
3 changes: 3 additions & 0 deletions src/Classic.CommonControls.Avalonia/SystemParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,7 @@ public static class SystemParameters
public static SystemResourceKey MenuPopupAnimationKey { get; } = new(SystemResourceKeyID.MenuPopupAnimation);
public static SystemResourceKey ToolTipPopupAnimationKey { get; } = new(SystemResourceKeyID.ToolTipPopupAnimation);
public static SystemResourceKey PowerLineStatusKey { get; } = new(SystemResourceKeyID.PowerLineStatus);

// Classic.Avalonia Custom
public static SystemResourceKey FontAliasingKey { get; } = new(SystemResourceKeyID.FontAliasing);
}
5 changes: 4 additions & 1 deletion src/Classic.CommonControls.Avalonia/SystemResourceKey.cs
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,10 @@ internal enum SystemResourceKeyID
InactiveSelectionHighlightBrush,
InactiveSelectionHighlightTextBrush,

InternalSystemColorsExtendedEnd
InternalSystemColorsExtendedEnd,

// Classic.Avalonia Custom
FontAliasing
}

public class SystemResourceKey
Expand Down

0 comments on commit 82339f9

Please sign in to comment.