using System.Collections.Generic; using UnityEngine; namespace TMPro { /// /// /// public class TMP_ResourceManager { // ====================================================== // TEXT SETTINGS MANAGEMENT // ====================================================== private static TMP_Settings s_TextSettings; internal static TMP_Settings GetTextSettings() { if (s_TextSettings == null) { // Try loading the TMP Settings from a Resources folder in the user project. s_TextSettings = Resources.Load("TextSettings"); // ?? ScriptableObject.CreateInstance(); #if UNITY_EDITOR if (s_TextSettings == null) { // Open TMP Resources Importer to enable the user to import the TMP Essential Resources and option TMP Examples & Extras TMP_PackageResourceImporterWindow.ShowPackageImporterWindow(); } #endif } return s_TextSettings; } // ====================================================== // FONT ASSET MANAGEMENT - Fields, Properties and Functions // ====================================================== struct FontAssetRef { public int nameHashCode; public int familyNameHashCode; public int styleNameHashCode; public long familyNameAndStyleHashCode; public readonly TMP_FontAsset fontAsset; public FontAssetRef(int nameHashCode, int familyNameHashCode, int styleNameHashCode, TMP_FontAsset fontAsset) { // Use familyNameHashCode for font assets created at runtime as these asset do not typically have a names. this.nameHashCode = nameHashCode != 0 ? nameHashCode : familyNameHashCode; this.familyNameHashCode = familyNameHashCode; this.styleNameHashCode = styleNameHashCode; this.familyNameAndStyleHashCode = (long) styleNameHashCode << 32 | (uint) familyNameHashCode; this.fontAsset = fontAsset; } } static readonly Dictionary s_FontAssetReferences = new Dictionary(); static readonly Dictionary s_FontAssetNameReferenceLookup = new Dictionary(); static readonly Dictionary s_FontAssetFamilyNameAndStyleReferenceLookup = new Dictionary(); static readonly List s_FontAssetRemovalList = new List(16); static readonly int k_RegularStyleHashCode = TMP_TextUtilities.GetHashCode("Regular"); /// /// Add font asset to resource manager. /// /// Font asset to be added to the resource manager. public static void AddFontAsset(TMP_FontAsset fontAsset) { int instanceID = fontAsset.instanceID; if (!s_FontAssetReferences.ContainsKey(instanceID)) { FontAssetRef fontAssetRef = new FontAssetRef(fontAsset.hashCode, fontAsset.familyNameHashCode, fontAsset.styleNameHashCode, fontAsset); s_FontAssetReferences.Add(instanceID, fontAssetRef); // Add font asset to name reference lookup if (!s_FontAssetNameReferenceLookup.ContainsKey(fontAssetRef.nameHashCode)) s_FontAssetNameReferenceLookup.Add(fontAssetRef.nameHashCode, fontAsset); // Add font asset to family name and style lookup if (!s_FontAssetFamilyNameAndStyleReferenceLookup.ContainsKey(fontAssetRef.familyNameAndStyleHashCode)) s_FontAssetFamilyNameAndStyleReferenceLookup.Add(fontAssetRef.familyNameAndStyleHashCode, fontAsset); } else { FontAssetRef fontAssetRef = s_FontAssetReferences[instanceID]; // Return if font asset name, family and style name have not changed. if (fontAssetRef.nameHashCode == fontAsset.hashCode && fontAssetRef.familyNameHashCode == fontAsset.familyNameHashCode && fontAssetRef.styleNameHashCode == fontAsset.styleNameHashCode) return; // Check if font asset name has changed if (fontAssetRef.nameHashCode != fontAsset.hashCode) { s_FontAssetNameReferenceLookup.Remove(fontAssetRef.nameHashCode); fontAssetRef.nameHashCode = fontAsset.hashCode; if (!s_FontAssetNameReferenceLookup.ContainsKey(fontAssetRef.nameHashCode)) s_FontAssetNameReferenceLookup.Add(fontAssetRef.nameHashCode, fontAsset); } // Check if family or style name has changed if (fontAssetRef.familyNameHashCode != fontAsset.familyNameHashCode || fontAssetRef.styleNameHashCode != fontAsset.styleNameHashCode) { s_FontAssetFamilyNameAndStyleReferenceLookup.Remove(fontAssetRef.familyNameAndStyleHashCode); fontAssetRef.familyNameHashCode = fontAsset.familyNameHashCode; fontAssetRef.styleNameHashCode = fontAsset.styleNameHashCode; fontAssetRef.familyNameAndStyleHashCode = (long) fontAsset.styleNameHashCode << 32 | (uint) fontAsset.familyNameHashCode; if (!s_FontAssetFamilyNameAndStyleReferenceLookup.ContainsKey(fontAssetRef.familyNameAndStyleHashCode)) s_FontAssetFamilyNameAndStyleReferenceLookup.Add(fontAssetRef.familyNameAndStyleHashCode, fontAsset); } s_FontAssetReferences[instanceID] = fontAssetRef; } } /// /// Remove font asset from resource manager. /// /// Font asset to be removed from the resource manager. public static void RemoveFontAsset(TMP_FontAsset fontAsset) { int instanceID = fontAsset.instanceID; if (s_FontAssetReferences.TryGetValue(instanceID, out FontAssetRef reference)) { s_FontAssetNameReferenceLookup.Remove(reference.nameHashCode); s_FontAssetFamilyNameAndStyleReferenceLookup.Remove(reference.familyNameAndStyleHashCode); s_FontAssetReferences.Remove(instanceID); } } /// /// Try getting a reference to the font asset using the hash code calculated from its file name. /// /// /// /// internal static bool TryGetFontAssetByName(int nameHashcode, out TMP_FontAsset fontAsset) { fontAsset = null; return s_FontAssetNameReferenceLookup.TryGetValue(nameHashcode, out fontAsset); } /// /// Try getting a reference to the font asset using the hash code calculated from font's family and style name. /// /// /// /// /// internal static bool TryGetFontAssetByFamilyName(int familyNameHashCode, int styleNameHashCode, out TMP_FontAsset fontAsset) { fontAsset = null; if (styleNameHashCode == 0) styleNameHashCode = k_RegularStyleHashCode; long familyAndStyleNameHashCode = (long) styleNameHashCode << 32 | (uint) familyNameHashCode; return s_FontAssetFamilyNameAndStyleReferenceLookup.TryGetValue(familyAndStyleNameHashCode, out fontAsset); } /// /// Clear all font asset glyph lookup cache. /// public static void ClearFontAssetGlyphCache() { RebuildFontAssetCache(); } /// /// /// internal static void RebuildFontAssetCache() { // Iterate over loaded font assets to update affected font assets foreach (var pair in s_FontAssetReferences) { FontAssetRef fontAssetRef = pair.Value; TMP_FontAsset fontAsset = fontAssetRef.fontAsset; if (fontAsset == null) { // Remove font asset from our lookup dictionaries s_FontAssetNameReferenceLookup.Remove(fontAssetRef.nameHashCode); s_FontAssetFamilyNameAndStyleReferenceLookup.Remove(fontAssetRef.familyNameAndStyleHashCode); // Add font asset to our removal list s_FontAssetRemovalList.Add(pair.Key); continue; } fontAsset.InitializeCharacterLookupDictionary(); fontAsset.AddSynthesizedCharactersAndFaceMetrics(); } // Remove font assets in our removal list from our font asset references for (int i = 0; i < s_FontAssetRemovalList.Count; i++) { s_FontAssetReferences.Remove(s_FontAssetRemovalList[i]); } s_FontAssetRemovalList.Clear(); TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, null); } // internal static void RebuildFontAssetCache(int instanceID) // { // // Iterate over loaded font assets to update affected font assets // for (int i = 0; i < s_FontAssetReferences.Count; i++) // { // TMP_FontAsset fontAsset = s_FontAssetReferences[i]; // // if (fontAsset.FallbackSearchQueryLookup.Contains(instanceID)) // fontAsset.ReadFontAssetDefinition(); // } // } } }