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 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<gui:OptionPanel <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"> 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> <StackPanel>
<GroupBox <GroupBox
Header="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.FontGroupBox}"> 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}">
<widgets:StackPanelWithSpacing SpaceBetweenItems="5"> <widgets:StackPanelWithSpacing SpaceBetweenItems="5">
<gui:FontSelector x:Name="fontSelectionPanel" />
<CheckBox <CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.WordWrap}" IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableTextAntialiasing}"
Content="{core:Localize Dialog.Options.IDEOptions.OutputPanel.WordWrap}" /> Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.EnableTextAntialiasing}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableFolding}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.FoldingCheckBox}" />
<CheckBox <CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableChangeMarkerMargin}" IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableTextHinting}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.ChangeMarkerMarginCheckBox}" /> Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.EnableTextHinting}" />
<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> </widgets:StackPanelWithSpacing>
</GroupBox> </GroupBox>
</StackPanel> <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> </gui:OptionPanel>

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

@ -165,7 +165,41 @@ namespace ICSharpCode.AvalonEdit.Rendering
cachedElements = new TextViewCachedElements(); 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"/> /// <inheritdoc cref="IWeakEventListener.ReceiveWeakEvent"/>
protected virtual bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e) protected virtual bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{ {
@ -224,7 +258,8 @@ namespace ICSharpCode.AvalonEdit.Rendering
columnRulerRenderer.SetRuler(Options.ColumnRulerPosition, ColumnRulerPen); columnRulerRenderer.SetRuler(Options.ColumnRulerPosition, ColumnRulerPen);
else else
columnRulerRenderer.SetRuler(-1, ColumnRulerPen); columnRulerRenderer.SetRuler(-1, ColumnRulerPen);
SetupTextRendering();
UpdateBuiltinElementGeneratorsFromOptions(); UpdateBuiltinElementGeneratorsFromOptions();
Redraw(); Redraw();
} }
@ -1418,7 +1453,19 @@ namespace ICSharpCode.AvalonEdit.Rendering
} }
ScrollViewer IScrollInfo.ScrollOwner { get; set; } 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() void IScrollInfo.LineUp()
{ {
((IScrollInfo)this).SetVerticalOffset(scrollOffset.Y - DefaultLineHeight); ((IScrollInfo)this).SetVerticalOffset(scrollOffset.Y - DefaultLineHeight);
@ -1999,6 +2046,8 @@ namespace ICSharpCode.AvalonEdit.Rendering
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{ {
base.OnPropertyChanged(e); base.OnPropertyChanged(e);
if (e.Property == TextView.ActualHeightProperty)
SetupTextRendering();
if (TextFormatterFactory.PropertyChangeAffectsTextFormatter(e.Property)) { if (TextFormatterFactory.PropertyChangeAffectsTextFormatter(e.Property)) {
// first, create the new text formatter: // first, create the new text formatter:
RecreateTextFormatter(); RecreateTextFormatter();

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

@ -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