diff --git a/src/Avalonia.Base/Media/FontManager.cs b/src/Avalonia.Base/Media/FontManager.cs
index 88e332f3346..83f84210c51 100644
--- a/src/Avalonia.Base/Media/FontManager.cs
+++ b/src/Avalonia.Base/Media/FontManager.cs
@@ -261,6 +261,58 @@ public bool TryMatchCharacter(int codepoint, FontStyle fontStyle, FontWeight fon
return PlatformImpl.TryMatchCharacter(codepoint, fontStyle, fontWeight, fontStretch, culture, out typeface);
}
+ ///
+ /// Tries to create a synthetic glyph typefacefor specified source glyph typeface and font properties.
+ ///
+ /// The font manager implementation.
+ /// The source glyph typeface.
+ /// The requested font style.
+ /// The requested font weight.
+ /// The created synthetic glyph typeface.
+ ///
+ /// True, if the could create a synthetic glyph typeface, False otherwise.
+ ///
+ internal static bool TryCreateSyntheticGlyphTypeface(IFontManagerImpl fontManager, IGlyphTypeface glyphTypeface, FontStyle style, FontWeight weight,
+ [NotNullWhen(true)] out IGlyphTypeface? syntheticGlyphTypeface)
+ {
+ if (fontManager == null)
+ {
+ syntheticGlyphTypeface = null;
+
+ return false;
+ }
+
+ if (glyphTypeface is IGlyphTypeface2 glyphTypeface2)
+ {
+ var fontSimulations = FontSimulations.None;
+
+ if (style != FontStyle.Normal && glyphTypeface2.Style != style)
+ {
+ fontSimulations |= FontSimulations.Oblique;
+ }
+
+ if ((int)weight >= 600 && glyphTypeface2.Weight < weight)
+ {
+ fontSimulations |= FontSimulations.Bold;
+ }
+
+ if (fontSimulations != FontSimulations.None && glyphTypeface2.TryGetStream(out var stream))
+ {
+ using (stream)
+ {
+ fontManager.TryCreateGlyphTypeface(stream, fontSimulations,
+ out syntheticGlyphTypeface);
+
+ return syntheticGlyphTypeface != null;
+ }
+ }
+ }
+
+ syntheticGlyphTypeface = null;
+
+ return false;
+ }
+
private bool TryGetFontCollection(Uri source, [NotNullWhen(true)] out IFontCollection? fontCollection)
{
Debug.Assert(source.IsAbsoluteUri);
diff --git a/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs b/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs
index 9002fd0fde2..8e8cc5fd184 100644
--- a/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs
+++ b/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
@@ -72,33 +71,9 @@ public override bool TryGetGlyphTypeface(string familyName, FontStyle style, Fon
if (TryGetNearestMatch(glyphTypefaces, key, out glyphTypeface))
{
- if (glyphTypeface is IGlyphTypeface2 glyphTypeface2)
+ if(_fontManager != null && FontManager.TryCreateSyntheticGlyphTypeface(_fontManager, glyphTypeface, style, weight, out var syntheticGlyphTypeface))
{
- var fontSimulations = FontSimulations.None;
-
- if (style != FontStyle.Normal && glyphTypeface2.Style != style)
- {
- fontSimulations |= FontSimulations.Oblique;
- }
-
- if ((int)weight >= 600 && glyphTypeface2.Weight < weight)
- {
- fontSimulations |= FontSimulations.Bold;
- }
-
- if (fontSimulations != FontSimulations.None && glyphTypeface2.TryGetStream(out var stream))
- {
- using (stream)
- {
- if(_fontManager is not null && _fontManager.TryCreateGlyphTypeface(stream, fontSimulations, out glyphTypeface) &&
- glyphTypefaces.TryAdd(key, glyphTypeface))
- {
- return true;
- }
-
- return false;
- }
- }
+ glyphTypeface = syntheticGlyphTypeface;
}
return true;
diff --git a/src/Avalonia.Base/Media/Fonts/SystemFontCollection.cs b/src/Avalonia.Base/Media/Fonts/SystemFontCollection.cs
index 9fee004eaf4..2f1e65c23ff 100644
--- a/src/Avalonia.Base/Media/Fonts/SystemFontCollection.cs
+++ b/src/Avalonia.Base/Media/Fonts/SystemFontCollection.cs
@@ -86,13 +86,11 @@ public override bool TryGetGlyphTypeface(string familyName, FontStyle style, Fon
{
glyphTypeface = nearestMatch;
}
- else
+
+ //Try to create a synthetic glyph typeface
+ if (FontManager.TryCreateSyntheticGlyphTypeface(_fontManager.PlatformImpl, glyphTypeface, style, weight, out var syntheticGlyphTypeface))
{
- //Try to create a synthetic glyph typeface
- if (TryCreateSyntheticGlyphTypeface(glyphTypeface, style, weight, out var syntheticGlyphTypeface))
- {
- glyphTypeface = syntheticGlyphTypeface;
- }
+ glyphTypeface = syntheticGlyphTypeface;
}
}
@@ -101,40 +99,6 @@ public override bool TryGetGlyphTypeface(string familyName, FontStyle style, Fon
return glyphTypeface != null;
}
- private bool TryCreateSyntheticGlyphTypeface(IGlyphTypeface glyphTypeface, FontStyle style, FontWeight weight,
- [NotNullWhen(true)] out IGlyphTypeface? syntheticGlyphTypeface)
- {
- if (glyphTypeface is IGlyphTypeface2 glyphTypeface2)
- {
- var fontSimulations = FontSimulations.None;
-
- if (style != FontStyle.Normal && glyphTypeface2.Style != style)
- {
- fontSimulations |= FontSimulations.Oblique;
- }
-
- if ((int)weight >= 600 && glyphTypeface2.Weight < weight)
- {
- fontSimulations |= FontSimulations.Bold;
- }
-
- if (fontSimulations != FontSimulations.None && glyphTypeface2.TryGetStream(out var stream))
- {
- using (stream)
- {
- _fontManager.PlatformImpl.TryCreateGlyphTypeface(stream, fontSimulations,
- out syntheticGlyphTypeface);
-
- return syntheticGlyphTypeface != null;
- }
- }
- }
-
- syntheticGlyphTypeface = null;
-
- return false;
- }
-
public override void Initialize(IFontManagerImpl fontManager)
{
//We initialize the system font collection during construction.