HarfBuzzFontManagerImpl.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using Avalonia.Media;
  6. using Avalonia.Media.Fonts;
  7. using Avalonia.Platform;
  8. namespace Avalonia.UnitTests
  9. {
  10. public class HarfBuzzFontManagerImpl : IFontManagerImpl
  11. {
  12. private readonly Typeface[] _customTypefaces;
  13. private readonly string _defaultFamilyName;
  14. private static readonly Typeface _defaultTypeface =
  15. new Typeface("resm:Avalonia.UnitTests.Assets?assembly=Avalonia.UnitTests#Noto Mono");
  16. private static readonly Typeface _italicTypeface =
  17. new Typeface("resm:Avalonia.UnitTests.Assets?assembly=Avalonia.UnitTests#Noto Sans");
  18. private static readonly Typeface _emojiTypeface =
  19. new Typeface("resm:Avalonia.UnitTests.Assets?assembly=Avalonia.UnitTests#Twitter Color Emoji");
  20. public HarfBuzzFontManagerImpl(string defaultFamilyName = "resm:Avalonia.UnitTests.Assets?assembly=Avalonia.UnitTests#Noto Mono")
  21. {
  22. _customTypefaces = new[] { _emojiTypeface, _italicTypeface, _defaultTypeface };
  23. _defaultFamilyName = defaultFamilyName;
  24. }
  25. public string GetDefaultFontFamilyName()
  26. {
  27. return _defaultFamilyName;
  28. }
  29. public IEnumerable<string> GetInstalledFontFamilyNames(bool checkForUpdates = false)
  30. {
  31. return _customTypefaces.Select(x => x.FontFamily!.Name);
  32. }
  33. public bool TryMatchCharacter(int codepoint, FontStyle fontStyle, FontWeight fontWeight, FontFamily fontFamily,
  34. CultureInfo culture, out Typeface fontKey)
  35. {
  36. foreach (var customTypeface in _customTypefaces)
  37. {
  38. var glyphTypeface = customTypeface.GlyphTypeface;
  39. if (!glyphTypeface.TryGetGlyph((uint)codepoint, out _))
  40. {
  41. continue;
  42. }
  43. fontKey = customTypeface;
  44. return true;
  45. }
  46. fontKey = default;
  47. return false;
  48. }
  49. public IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
  50. {
  51. var fontFamily = typeface.FontFamily;
  52. if (fontFamily == null)
  53. {
  54. return null;
  55. }
  56. if (fontFamily.IsDefault)
  57. {
  58. fontFamily = _defaultTypeface.FontFamily;
  59. }
  60. if (fontFamily!.Key == null)
  61. {
  62. return null;
  63. }
  64. var fontAssets = FontFamilyLoader.LoadFontAssets(fontFamily.Key);
  65. var asset = fontAssets.First();
  66. var assetLoader = AvaloniaLocator.Current.GetService<IAssetLoader>();
  67. if (assetLoader == null)
  68. {
  69. throw new NotSupportedException("IAssetLoader is not registered.");
  70. }
  71. var stream = assetLoader.Open(asset);
  72. return new HarfBuzzGlyphTypefaceImpl(stream);
  73. }
  74. }
  75. }