From 13eb047cb14384f087d6385bcc309e68b7ea84c2 Mon Sep 17 00:00:00 2001 From: BobLd <38405645+BobLd@users.noreply.github.com> Date: Wed, 17 Jul 2024 03:52:05 +0100 Subject: [PATCH] Use culture identifier instead of CultureInfo in NameTable (#16310) --- .../Media/Fonts/Tables/Name/NameTable.cs | 32 ++++++++----------- src/Avalonia.Base/Media/IGlyphTypeface2.cs | 4 +-- src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs | 6 ++-- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/Avalonia.Base/Media/Fonts/Tables/Name/NameTable.cs b/src/Avalonia.Base/Media/Fonts/Tables/Name/NameTable.cs index f94482222c..e2a5cbb681 100644 --- a/src/Avalonia.Base/Media/Fonts/Tables/Name/NameTable.cs +++ b/src/Avalonia.Base/Media/Fonts/Tables/Name/NameTable.cs @@ -3,26 +3,24 @@ // Ported from: https://github.com/SixLabors/Fonts/blob/034a440aece357341fcc6b02db58ffbe153e54ef/src/SixLabors.Fonts using System.Collections.Generic; -using System.Globalization; using System.IO; -using System.Linq; namespace Avalonia.Media.Fonts.Tables.Name { internal class NameTable { internal const string TableName = "name"; - internal static OpenTypeTag Tag = OpenTypeTag.Parse(TableName); + internal static readonly OpenTypeTag Tag = OpenTypeTag.Parse(TableName); private readonly NameRecord[] _names; - internal NameTable(NameRecord[] names, IReadOnlyList languages) + internal NameTable(NameRecord[] names, IReadOnlyList languages) { _names = names; Languages = languages; } - public IReadOnlyList Languages { get; } + public IReadOnlyList Languages { get; } /// /// Gets the name of the font. @@ -30,7 +28,7 @@ namespace Avalonia.Media.Fonts.Tables.Name /// /// The name of the font. /// - public string Id(CultureInfo culture) + public string Id(ushort culture) => GetNameById(culture, KnownNameIds.UniqueFontID); /// @@ -39,7 +37,7 @@ namespace Avalonia.Media.Fonts.Tables.Name /// /// The name of the font. /// - public string FontName(CultureInfo culture) + public string FontName(ushort culture) => GetNameById(culture, KnownNameIds.FullFontName); /// @@ -48,7 +46,7 @@ namespace Avalonia.Media.Fonts.Tables.Name /// /// The name of the font. /// - public string FontFamilyName(CultureInfo culture) + public string FontFamilyName(ushort culture) => GetNameById(culture, KnownNameIds.FontFamilyName); /// @@ -57,12 +55,12 @@ namespace Avalonia.Media.Fonts.Tables.Name /// /// The name of the font. /// - public string FontSubFamilyName(CultureInfo culture) + public string FontSubFamilyName(ushort culture) => GetNameById(culture, KnownNameIds.FontSubfamilyName); - public string GetNameById(CultureInfo culture, KnownNameIds nameId) + public string GetNameById(ushort culture, KnownNameIds nameId) { - var languageId = culture.LCID; + var languageId = culture; NameRecord? usaVersion = null; NameRecord? firstWindows = null; NameRecord? first = null; @@ -97,7 +95,7 @@ namespace Avalonia.Media.Fonts.Tables.Name string.Empty; } - public string GetNameById(CultureInfo culture, ushort nameId) + public string GetNameById(ushort culture, ushort nameId) => GetNameById(culture, (KnownNameIds)nameId); public static NameTable Load(IGlyphTypeface glyphTypeface) @@ -160,7 +158,7 @@ namespace Avalonia.Media.Fonts.Tables.Name readable.LoadValue(reader); } - var cultures = new List(); + var cultures = new List(); foreach (var nameRecord in names) { @@ -169,16 +167,12 @@ namespace Avalonia.Media.Fonts.Tables.Name continue; } - var culture = new CultureInfo(nameRecord.LanguageID); - - if (!cultures.Contains(culture)) + if (!cultures.Contains(nameRecord.LanguageID)) { - cultures.Add(culture); + cultures.Add(nameRecord.LanguageID); } } - //var languages = languageNames.Select(x => x.Value).ToArray(); - return new NameTable(names, cultures); } } diff --git a/src/Avalonia.Base/Media/IGlyphTypeface2.cs b/src/Avalonia.Base/Media/IGlyphTypeface2.cs index d2e0e4d2dd..2c7ea58bcb 100644 --- a/src/Avalonia.Base/Media/IGlyphTypeface2.cs +++ b/src/Avalonia.Base/Media/IGlyphTypeface2.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Globalization; using System.IO; using Avalonia.Media.Fonts; @@ -17,8 +16,9 @@ namespace Avalonia.Media /// /// Gets the localized family names. + /// Keys are culture identifiers. /// - IReadOnlyDictionary FamilyNames { get; } + IReadOnlyDictionary FamilyNames { get; } /// /// Gets supported font features. diff --git a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs index e1fe0251d2..cdf7807b01 100644 --- a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs @@ -100,9 +100,9 @@ namespace Avalonia.Skia _nameTable = NameTable.Load(this); - FamilyName = _nameTable.FontFamilyName(CultureInfo.InvariantCulture); + FamilyName = _nameTable.FontFamilyName((ushort)CultureInfo.InvariantCulture.LCID); - var familyNames = new Dictionary(_nameTable.Languages.Count); + var familyNames = new Dictionary(_nameTable.Languages.Count); foreach (var language in _nameTable.Languages) { @@ -112,7 +112,7 @@ namespace Avalonia.Skia FamilyNames = familyNames; } - public IReadOnlyDictionary FamilyNames { get; } + public IReadOnlyDictionary FamilyNames { get; } public IReadOnlyList SupportedFeatures {