Browse Source

Implement basic font rendering tuning.

Ability to disable anti-aliasing for pixel perfect fonts like Courier New. Ability to disable hinting to forget about jagged WPF rendering.
pull/731/head
13.beta2 10 years ago
parent
commit
87916e5c27
  1. 16902
      data/resources/StringResources.resx
  2. 64
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml
  3. 55
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs
  4. 44
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs

16902
data/resources/StringResources.resx

File diff suppressed because it is too large Load Diff

64
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml

@ -1,33 +1,41 @@ @@ -1,33 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<gui:OptionPanel
x:Class="ICSharpCode.AvalonEdit.AddIn.Options.GeneralEditorOptions" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:winforms="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:core="http://icsharpcode.net/sharpdevelop/core" xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop" xmlns:local="clr-namespace:ICSharpCode.AvalonEdit.AddIn.Options" xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets">
<StackPanel>
<GroupBox
Header="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.FontGroupBox}">
<gui:FontSelector x:Name="fontSelectionPanel" />
</GroupBox>
<GroupBox
Header="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.GeneralOptionsGroupBox}">
<?xml version="1.0" encoding="utf-8"?>
<gui:OptionPanel
x:Class="ICSharpCode.AvalonEdit.AddIn.Options.GeneralEditorOptions" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:winforms="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:core="http://icsharpcode.net/sharpdevelop/core" xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop" xmlns:local="clr-namespace:ICSharpCode.AvalonEdit.AddIn.Options" xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets">
<StackPanel>
<GroupBox
Header="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.FontGroupBox}">
<widgets:StackPanelWithSpacing SpaceBetweenItems="5">
<gui:FontSelector x:Name="fontSelectionPanel" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.WordWrap}"
Content="{core:Localize Dialog.Options.IDEOptions.OutputPanel.WordWrap}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableFolding}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.FoldingCheckBox}" />
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableTextAntialiasing}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.EnableTextAntialiasing}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableChangeMarkerMargin}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.ChangeMarkerMarginCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableQuickClassBrowser}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.ShowQuickClassBrowserCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.ShowLineNumbers}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Markers.LineNumberCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.ShowHiddenDefinitions}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Markers.ShowHiddenDefinitionsCheckBox}" />
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableTextHinting}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.EnableTextHinting}" />
</widgets:StackPanelWithSpacing>
</GroupBox>
</StackPanel>
</GroupBox>
<GroupBox
Header="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.GeneralOptionsGroupBox}">
<widgets:StackPanelWithSpacing SpaceBetweenItems="5">
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.WordWrap}"
Content="{core:Localize Dialog.Options.IDEOptions.OutputPanel.WordWrap}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableFolding}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.FoldingCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableChangeMarkerMargin}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.ChangeMarkerMarginCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableQuickClassBrowser}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.ShowQuickClassBrowserCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.ShowLineNumbers}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Markers.LineNumberCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.ShowHiddenDefinitions}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Markers.ShowHiddenDefinitionsCheckBox}" />
</widgets:StackPanelWithSpacing>
</GroupBox>
</StackPanel>
</gui:OptionPanel>

55
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs

@ -165,7 +165,41 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -165,7 +165,41 @@ namespace ICSharpCode.AvalonEdit.Rendering
cachedElements = new TextViewCachedElements();
}
}
void SetupTextRendering()
{
if (Options.EnableTextAntialiasing)
{
if (Options.EnableTextHinting)
{
if (CurrentZoom == 1.0)
{
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display);
TextOptions.SetTextRenderingMode(this, TextRenderingMode.ClearType);
TextOptions.SetTextHintingMode(this, TextHintingMode.Auto);
}
else
{
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Ideal);
TextOptions.SetTextRenderingMode(this, TextRenderingMode.Grayscale);
TextOptions.SetTextHintingMode(this, TextHintingMode.Auto);
}
}
else
{
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Ideal);
TextOptions.SetTextRenderingMode(this, TextRenderingMode.Grayscale);
TextOptions.SetTextHintingMode(this, TextHintingMode.Animated);
}
}
else
{
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display);
TextOptions.SetTextRenderingMode(this, TextRenderingMode.Aliased);
TextOptions.SetTextHintingMode(this, TextHintingMode.Auto);
}
}
/// <inheritdoc cref="IWeakEventListener.ReceiveWeakEvent"/>
protected virtual bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{
@ -224,7 +258,8 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -224,7 +258,8 @@ namespace ICSharpCode.AvalonEdit.Rendering
columnRulerRenderer.SetRuler(Options.ColumnRulerPosition, ColumnRulerPen);
else
columnRulerRenderer.SetRuler(-1, ColumnRulerPen);
SetupTextRendering();
UpdateBuiltinElementGeneratorsFromOptions();
Redraw();
}
@ -1418,7 +1453,19 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -1418,7 +1453,19 @@ namespace ICSharpCode.AvalonEdit.Rendering
}
ScrollViewer IScrollInfo.ScrollOwner { get; set; }
/// <summary>
/// Gets the zoom level;
/// </summary>
public double CurrentZoom
{
get
{
dynamic scrollOwner = ((IScrollInfo) this).ScrollOwner;
return scrollOwner?.CurrentZoom ?? 1.0;
}
}
void IScrollInfo.LineUp()
{
((IScrollInfo)this).SetVerticalOffset(scrollOffset.Y - DefaultLineHeight);
@ -1999,6 +2046,8 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -1999,6 +2046,8 @@ namespace ICSharpCode.AvalonEdit.Rendering
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property == TextView.ActualHeightProperty)
SetupTextRendering();
if (TextFormatterFactory.PropertyChangeAffectsTextFormatter(e.Property)) {
// first, create the new text formatter:
RecreateTextFormatter();

44
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs

@ -493,5 +493,49 @@ namespace ICSharpCode.AvalonEdit @@ -493,5 +493,49 @@ namespace ICSharpCode.AvalonEdit
}
}
}
bool enableTextAntialiasing = true;
/// <summary>
/// Gets/Sets if anti-aliasing should be applied while text rendering.
/// </summary>
[DefaultValue(true)]
public bool EnableTextAntialiasing
{
get
{
return enableTextAntialiasing;
}
set
{
if (enableTextAntialiasing != value)
{
enableTextAntialiasing = value;
OnPropertyChanged("EnableTextAntialiasing");
}
}
}
bool enableTextHinting = true;
/// <summary>
/// Gets/Sets if TrueType hinting should be applied while text rendering.
/// </summary>
[DefaultValue(true)]
public bool EnableTextHinting
{
get
{
return enableTextHinting;
}
set
{
if (enableTextHinting != value)
{
enableTextHinting = value;
OnPropertyChanged("EnableTextHinting");
}
}
}
}
}

Loading…
Cancel
Save