csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.1 KiB
69 lines
2.1 KiB
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using Avalonia.Platform;
|
|
|
|
namespace Avalonia.Media.Fonts
|
|
{
|
|
internal class SystemFontCollection : FontCollectionBase
|
|
{
|
|
private readonly FontManager _fontManager;
|
|
private readonly string[] _familyNames;
|
|
|
|
public SystemFontCollection(FontManager fontManager)
|
|
{
|
|
_fontManager = fontManager;
|
|
_familyNames = fontManager.PlatformImpl.GetInstalledFontFamilyNames();
|
|
}
|
|
|
|
public override Uri Key => FontManager.SystemFontsKey;
|
|
|
|
public override FontFamily this[int index]
|
|
{
|
|
get
|
|
{
|
|
var familyName = _familyNames[index];
|
|
|
|
return new FontFamily(familyName);
|
|
}
|
|
}
|
|
|
|
public override int Count => _familyNames.Length;
|
|
|
|
public override bool TryGetGlyphTypeface(string familyName, FontStyle style, FontWeight weight,
|
|
FontStretch stretch, [NotNullWhen(true)] out IGlyphTypeface? glyphTypeface)
|
|
{
|
|
glyphTypeface = null;
|
|
|
|
var key = new FontCollectionKey(style, weight, stretch);
|
|
|
|
var glyphTypefaces = _glyphTypefaceCache.GetOrAdd(familyName, (key) => new ConcurrentDictionary<FontCollectionKey, IGlyphTypeface?>());
|
|
|
|
if (!glyphTypefaces.TryGetValue(key, out glyphTypeface))
|
|
{
|
|
_fontManager.PlatformImpl.TryCreateGlyphTypeface(familyName, style, weight, stretch, out glyphTypeface);
|
|
|
|
if (!glyphTypefaces.TryAdd(key, glyphTypeface))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return glyphTypeface != null;
|
|
}
|
|
|
|
public override void Initialize(IFontManagerImpl fontManager)
|
|
{
|
|
//We initialize the system font collection during construction.
|
|
}
|
|
|
|
public override IEnumerator<FontFamily> GetEnumerator()
|
|
{
|
|
foreach (var familyName in _familyNames)
|
|
{
|
|
yield return new FontFamily(familyName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|