No Description
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.

TMP_ResourcesManager.cs 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. namespace TMPro
  4. {
  5. /// <summary>
  6. ///
  7. /// </summary>
  8. public class TMP_ResourceManager
  9. {
  10. // ======================================================
  11. // TEXT SETTINGS MANAGEMENT
  12. // ======================================================
  13. private static TMP_Settings s_TextSettings;
  14. internal static TMP_Settings GetTextSettings()
  15. {
  16. if (s_TextSettings == null)
  17. {
  18. // Try loading the TMP Settings from a Resources folder in the user project.
  19. s_TextSettings = Resources.Load<TMP_Settings>("TextSettings"); // ?? ScriptableObject.CreateInstance<TMP_Settings>();
  20. #if UNITY_EDITOR
  21. if (s_TextSettings == null)
  22. {
  23. // Open TMP Resources Importer to enable the user to import the TMP Essential Resources and option TMP Examples & Extras
  24. TMP_PackageResourceImporterWindow.ShowPackageImporterWindow();
  25. }
  26. #endif
  27. }
  28. return s_TextSettings;
  29. }
  30. // ======================================================
  31. // FONT ASSET MANAGEMENT - Fields, Properties and Functions
  32. // ======================================================
  33. struct FontAssetRef
  34. {
  35. public int nameHashCode;
  36. public int familyNameHashCode;
  37. public int styleNameHashCode;
  38. public long familyNameAndStyleHashCode;
  39. public readonly TMP_FontAsset fontAsset;
  40. public FontAssetRef(int nameHashCode, int familyNameHashCode, int styleNameHashCode, TMP_FontAsset fontAsset)
  41. {
  42. // Use familyNameHashCode for font assets created at runtime as these asset do not typically have a names.
  43. this.nameHashCode = nameHashCode != 0 ? nameHashCode : familyNameHashCode;
  44. this.familyNameHashCode = familyNameHashCode;
  45. this.styleNameHashCode = styleNameHashCode;
  46. this.familyNameAndStyleHashCode = (long) styleNameHashCode << 32 | (uint) familyNameHashCode;
  47. this.fontAsset = fontAsset;
  48. }
  49. }
  50. static readonly Dictionary<int, FontAssetRef> s_FontAssetReferences = new Dictionary<int, FontAssetRef>();
  51. static readonly Dictionary<int, TMP_FontAsset> s_FontAssetNameReferenceLookup = new Dictionary<int, TMP_FontAsset>();
  52. static readonly Dictionary<long, TMP_FontAsset> s_FontAssetFamilyNameAndStyleReferenceLookup = new Dictionary<long, TMP_FontAsset>();
  53. static readonly List<int> s_FontAssetRemovalList = new List<int>(16);
  54. static readonly int k_RegularStyleHashCode = TMP_TextUtilities.GetHashCode("Regular");
  55. /// <summary>
  56. /// Add font asset to resource manager.
  57. /// </summary>
  58. /// <param name="fontAsset">Font asset to be added to the resource manager.</param>
  59. public static void AddFontAsset(TMP_FontAsset fontAsset)
  60. {
  61. int instanceID = fontAsset.instanceID;
  62. if (!s_FontAssetReferences.ContainsKey(instanceID))
  63. {
  64. FontAssetRef fontAssetRef = new FontAssetRef(fontAsset.hashCode, fontAsset.familyNameHashCode, fontAsset.styleNameHashCode, fontAsset);
  65. s_FontAssetReferences.Add(instanceID, fontAssetRef);
  66. // Add font asset to name reference lookup
  67. if (!s_FontAssetNameReferenceLookup.ContainsKey(fontAssetRef.nameHashCode))
  68. s_FontAssetNameReferenceLookup.Add(fontAssetRef.nameHashCode, fontAsset);
  69. // Add font asset to family name and style lookup
  70. if (!s_FontAssetFamilyNameAndStyleReferenceLookup.ContainsKey(fontAssetRef.familyNameAndStyleHashCode))
  71. s_FontAssetFamilyNameAndStyleReferenceLookup.Add(fontAssetRef.familyNameAndStyleHashCode, fontAsset);
  72. }
  73. else
  74. {
  75. FontAssetRef fontAssetRef = s_FontAssetReferences[instanceID];
  76. // Return if font asset name, family and style name have not changed.
  77. if (fontAssetRef.nameHashCode == fontAsset.hashCode && fontAssetRef.familyNameHashCode == fontAsset.familyNameHashCode && fontAssetRef.styleNameHashCode == fontAsset.styleNameHashCode)
  78. return;
  79. // Check if font asset name has changed
  80. if (fontAssetRef.nameHashCode != fontAsset.hashCode)
  81. {
  82. s_FontAssetNameReferenceLookup.Remove(fontAssetRef.nameHashCode);
  83. fontAssetRef.nameHashCode = fontAsset.hashCode;
  84. if (!s_FontAssetNameReferenceLookup.ContainsKey(fontAssetRef.nameHashCode))
  85. s_FontAssetNameReferenceLookup.Add(fontAssetRef.nameHashCode, fontAsset);
  86. }
  87. // Check if family or style name has changed
  88. if (fontAssetRef.familyNameHashCode != fontAsset.familyNameHashCode || fontAssetRef.styleNameHashCode != fontAsset.styleNameHashCode)
  89. {
  90. s_FontAssetFamilyNameAndStyleReferenceLookup.Remove(fontAssetRef.familyNameAndStyleHashCode);
  91. fontAssetRef.familyNameHashCode = fontAsset.familyNameHashCode;
  92. fontAssetRef.styleNameHashCode = fontAsset.styleNameHashCode;
  93. fontAssetRef.familyNameAndStyleHashCode = (long) fontAsset.styleNameHashCode << 32 | (uint) fontAsset.familyNameHashCode;
  94. if (!s_FontAssetFamilyNameAndStyleReferenceLookup.ContainsKey(fontAssetRef.familyNameAndStyleHashCode))
  95. s_FontAssetFamilyNameAndStyleReferenceLookup.Add(fontAssetRef.familyNameAndStyleHashCode, fontAsset);
  96. }
  97. s_FontAssetReferences[instanceID] = fontAssetRef;
  98. }
  99. }
  100. /// <summary>
  101. /// Remove font asset from resource manager.
  102. /// </summary>
  103. /// <param name="fontAsset">Font asset to be removed from the resource manager.</param>
  104. public static void RemoveFontAsset(TMP_FontAsset fontAsset)
  105. {
  106. int instanceID = fontAsset.instanceID;
  107. if (s_FontAssetReferences.TryGetValue(instanceID, out FontAssetRef reference))
  108. {
  109. s_FontAssetNameReferenceLookup.Remove(reference.nameHashCode);
  110. s_FontAssetFamilyNameAndStyleReferenceLookup.Remove(reference.familyNameAndStyleHashCode);
  111. s_FontAssetReferences.Remove(instanceID);
  112. }
  113. }
  114. /// <summary>
  115. /// Try getting a reference to the font asset using the hash code calculated from its file name.
  116. /// </summary>
  117. /// <param name="nameHashcode"></param>
  118. /// <param name="fontAsset"></param>
  119. /// <returns></returns>
  120. internal static bool TryGetFontAssetByName(int nameHashcode, out TMP_FontAsset fontAsset)
  121. {
  122. fontAsset = null;
  123. return s_FontAssetNameReferenceLookup.TryGetValue(nameHashcode, out fontAsset);
  124. }
  125. /// <summary>
  126. /// Try getting a reference to the font asset using the hash code calculated from font's family and style name.
  127. /// </summary>
  128. /// <param name="familyNameHashCode"></param>
  129. /// <param name="styleNameHashCode"></param>
  130. /// <param name="fontAsset"></param>
  131. /// <returns></returns>
  132. internal static bool TryGetFontAssetByFamilyName(int familyNameHashCode, int styleNameHashCode, out TMP_FontAsset fontAsset)
  133. {
  134. fontAsset = null;
  135. if (styleNameHashCode == 0)
  136. styleNameHashCode = k_RegularStyleHashCode;
  137. long familyAndStyleNameHashCode = (long) styleNameHashCode << 32 | (uint) familyNameHashCode;
  138. return s_FontAssetFamilyNameAndStyleReferenceLookup.TryGetValue(familyAndStyleNameHashCode, out fontAsset);
  139. }
  140. /// <summary>
  141. /// Clear all font asset glyph lookup cache.
  142. /// </summary>
  143. public static void ClearFontAssetGlyphCache()
  144. {
  145. RebuildFontAssetCache();
  146. }
  147. /// <summary>
  148. ///
  149. /// </summary>
  150. internal static void RebuildFontAssetCache()
  151. {
  152. // Iterate over loaded font assets to update affected font assets
  153. foreach (var pair in s_FontAssetReferences)
  154. {
  155. FontAssetRef fontAssetRef = pair.Value;
  156. TMP_FontAsset fontAsset = fontAssetRef.fontAsset;
  157. if (fontAsset == null)
  158. {
  159. // Remove font asset from our lookup dictionaries
  160. s_FontAssetNameReferenceLookup.Remove(fontAssetRef.nameHashCode);
  161. s_FontAssetFamilyNameAndStyleReferenceLookup.Remove(fontAssetRef.familyNameAndStyleHashCode);
  162. // Add font asset to our removal list
  163. s_FontAssetRemovalList.Add(pair.Key);
  164. continue;
  165. }
  166. fontAsset.InitializeCharacterLookupDictionary();
  167. fontAsset.AddSynthesizedCharactersAndFaceMetrics();
  168. }
  169. // Remove font assets in our removal list from our font asset references
  170. for (int i = 0; i < s_FontAssetRemovalList.Count; i++)
  171. {
  172. s_FontAssetReferences.Remove(s_FontAssetRemovalList[i]);
  173. }
  174. s_FontAssetRemovalList.Clear();
  175. TMPro_EventManager.ON_FONT_PROPERTY_CHANGED(true, null);
  176. }
  177. // internal static void RebuildFontAssetCache(int instanceID)
  178. // {
  179. // // Iterate over loaded font assets to update affected font assets
  180. // for (int i = 0; i < s_FontAssetReferences.Count; i++)
  181. // {
  182. // TMP_FontAsset fontAsset = s_FontAssetReferences[i];
  183. //
  184. // if (fontAsset.FallbackSearchQueryLookup.Contains(instanceID))
  185. // fontAsset.ReadFontAssetDefinition();
  186. // }
  187. // }
  188. }
  189. }