Skip to content

Commit 2f7ca3b

Browse files
committed
Implement basic font rendering tuning for code editor.
Ability to disable anti-aliasing for 'pixel-perfect' fonts like Courier New. Ability to disable hinting to forget about jagged default WPF rendering.
1 parent 19611ad commit 2f7ca3b

File tree

2 files changed

+105
-4
lines changed

2 files changed

+105
-4
lines changed

ICSharpCode.AvalonEdit/Rendering/TextView.cs

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,41 @@ void RecreateCachedElements()
165165
cachedElements = new TextViewCachedElements();
166166
}
167167
}
168-
168+
169+
void SetupTextRendering()
170+
{
171+
if (Options.EnableTextAntialiasing)
172+
{
173+
if (Options.EnableTextHinting)
174+
{
175+
if (CurrentZoom == 1.0)
176+
{
177+
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display);
178+
TextOptions.SetTextRenderingMode(this, TextRenderingMode.ClearType);
179+
TextOptions.SetTextHintingMode(this, TextHintingMode.Auto);
180+
}
181+
else
182+
{
183+
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Ideal);
184+
TextOptions.SetTextRenderingMode(this, TextRenderingMode.Grayscale);
185+
TextOptions.SetTextHintingMode(this, TextHintingMode.Auto);
186+
}
187+
}
188+
else
189+
{
190+
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Ideal);
191+
TextOptions.SetTextRenderingMode(this, TextRenderingMode.Grayscale);
192+
TextOptions.SetTextHintingMode(this, TextHintingMode.Animated);
193+
}
194+
}
195+
else
196+
{
197+
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display);
198+
TextOptions.SetTextRenderingMode(this, TextRenderingMode.Aliased);
199+
TextOptions.SetTextHintingMode(this, TextHintingMode.Auto);
200+
}
201+
}
202+
169203
/// <inheritdoc cref="IWeakEventListener.ReceiveWeakEvent"/>
170204
protected virtual bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
171205
{
@@ -224,7 +258,8 @@ protected virtual void OnOptionChanged(PropertyChangedEventArgs e)
224258
columnRulerRenderer.SetRuler(Options.ColumnRulerPosition, ColumnRulerPen);
225259
else
226260
columnRulerRenderer.SetRuler(-1, ColumnRulerPen);
227-
261+
262+
SetupTextRendering();
228263
UpdateBuiltinElementGeneratorsFromOptions();
229264
Redraw();
230265
}
@@ -1424,7 +1459,26 @@ void SetScrollOffset(Vector vector)
14241459
}
14251460

14261461
ScrollViewer IScrollInfo.ScrollOwner { get; set; }
1427-
1462+
1463+
/// <summary>
1464+
/// Gets the zoom level;
1465+
/// </summary>
1466+
public double CurrentZoom
1467+
{
1468+
get
1469+
{
1470+
dynamic scrollOwner = ((IScrollInfo) this).ScrollOwner;
1471+
1472+
if (scrollOwner != null
1473+
&& scrollOwner.GetType().GetProperty("CurrentZoom") != null)
1474+
{
1475+
return scrollOwner.CurrentZoom;
1476+
}
1477+
1478+
return 1.0;
1479+
}
1480+
}
1481+
14281482
void IScrollInfo.LineUp()
14291483
{
14301484
((IScrollInfo)this).SetVerticalOffset(scrollOffset.Y - DefaultLineHeight);
@@ -2005,6 +2059,9 @@ public DocumentLine GetDocumentLineByVisualTop(double visualTop)
20052059
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
20062060
{
20072061
base.OnPropertyChanged(e);
2062+
if (e.Property == TextView.ActualHeightProperty) {
2063+
SetupTextRendering();
2064+
}
20082065
if (TextFormatterFactory.PropertyChangeAffectsTextFormatter(e.Property)) {
20092066
// first, create the new text formatter:
20102067
RecreateTextFormatter();
@@ -2113,4 +2170,4 @@ public virtual double EmptyLineSelectionWidth
21132170
get { return 1; }
21142171
}
21152172
}
2116-
}
2173+
}

ICSharpCode.AvalonEdit/TextEditorOptions.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,5 +493,49 @@ public bool AllowToggleOverstrikeMode {
493493
}
494494
}
495495
}
496+
497+
bool enableTextAntialiasing = true;
498+
499+
/// <summary>
500+
/// Gets/Sets if anti-aliasing should be applied while text rendering.
501+
/// </summary>
502+
[DefaultValue(true)]
503+
public bool EnableTextAntialiasing
504+
{
505+
get
506+
{
507+
return enableTextAntialiasing;
508+
}
509+
set
510+
{
511+
if (enableTextAntialiasing != value)
512+
{
513+
enableTextAntialiasing = value;
514+
OnPropertyChanged("EnableTextAntialiasing");
515+
}
516+
}
517+
}
518+
519+
bool enableTextHinting = true;
520+
521+
/// <summary>
522+
/// Gets/Sets if TrueType hinting should be applied while text rendering.
523+
/// </summary>
524+
[DefaultValue(true)]
525+
public bool EnableTextHinting
526+
{
527+
get
528+
{
529+
return enableTextHinting;
530+
}
531+
set
532+
{
533+
if (enableTextHinting != value)
534+
{
535+
enableTextHinting = value;
536+
OnPropertyChanged("EnableTextHinting");
537+
}
538+
}
539+
}
496540
}
497541
}

0 commit comments

Comments
 (0)