From cecb4c90ddc73d564c3fbad6167faa9d5635534c Mon Sep 17 00:00:00 2001 From: "13.beta2" Date: Mon, 11 Jan 2016 00:23:48 +0300 Subject: [PATCH] Implement basic font rendering tuning for code editor. (1/2: Main+AddIns part) Ability to disable anti-aliasing for 'pixel-perfect' fonts like Courier New. Ability to disable hinting to forget about jagged default WPF rendering. --- data/resources/StringResources.resx | 6 + .../Src/Options/GeneralEditorOptions.xaml | 10 +- .../Project/ZoomScrollViewer.cs | 120 ++++++++++++++++++ .../Project/ZoomScrollViewer.xaml | 21 +++ 4 files changed, 156 insertions(+), 1 deletion(-) diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index d9f7fd02b78..214ba99511e 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -8445,5 +8445,11 @@ Press Esc to cancel this operation. Enable App.xaml parsing + + + Enable anti-aliasing + + + Enable hinting \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml index 576ec15bef7..0720da5ae03 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml @@ -4,7 +4,15 @@ - + + + + + diff --git a/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.cs b/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.cs index 969c4812f7b..bafd6a0e741 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.cs @@ -186,4 +186,124 @@ public object ConvertBack(object value, Type targetType, object parameter, Syste throw new NotImplementedException(); } } + + sealed class ZoomToTextFormattingModeConverter : IMultiValueConverter + { + public static readonly ZoomToTextFormattingModeConverter Instance = new ZoomToTextFormattingModeConverter(); + + public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + var zoom = value[0] != null ? (double) value[0] : 1.0; + var antialiasing = value[1] != DependencyProperty.UnsetValue ? (bool) value[1] : true; + var hinting = value[2] != DependencyProperty.UnsetValue ? (bool) value[2] : true; + + if (antialiasing) + { + if (hinting) + { + if (zoom == 1.0) + { + return TextFormattingMode.Display; + } + else + { + return TextFormattingMode.Ideal; + } + } + else + { + return TextFormattingMode.Ideal; + } + } + else + { + return TextFormattingMode.Display; + } + } + + public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } + + sealed class ZoomToTextRenderingModeConverter : IMultiValueConverter + { + public static readonly ZoomToTextRenderingModeConverter Instance = new ZoomToTextRenderingModeConverter(); + + public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + var zoom = value[0] != null ? (double) value[0] : 1.0; + var antialiasing = value[1] != DependencyProperty.UnsetValue ? (bool) value[1] : true; + var hinting = value[2] != DependencyProperty.UnsetValue ? (bool) value[2] : true; + + if (antialiasing) + { + if (hinting) + { + if (zoom == 1.0) + { + return TextRenderingMode.ClearType; + } + else + { + return TextRenderingMode.Grayscale; + } + } + else + { + return TextRenderingMode.Grayscale; + } + } + else + { + return TextRenderingMode.Aliased; + } + } + + public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } + + sealed class ZoomToTextHintingModeConverter : IMultiValueConverter + { + public static readonly ZoomToTextHintingModeConverter Instance = new ZoomToTextHintingModeConverter(); + + public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + var zoom = value[0] != null ? (double) value[0] : 1.0; + var antialiasing = value[1] != DependencyProperty.UnsetValue ? (bool) value[1] : true; + var hinting = value[2] != DependencyProperty.UnsetValue ? (bool) value[2] : true; + + if (antialiasing) + { + if (hinting) + { + if (zoom == 1.0) + { + return TextHintingMode.Fixed; + } + else + { + return TextHintingMode.Fixed; + } + } + else + { + return TextHintingMode.Animated; + } + } + else + { + return TextHintingMode.Fixed; + } + } + + public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.xaml b/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.xaml index 6034140ef0e..674e076538a 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.xaml +++ b/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ZoomScrollViewer.xaml @@ -24,6 +24,27 @@ + + + + + + + + + + + + + + + + + + + + +