Decompiled source of BombRushRUSFontFix v1.0.0

BombRushRUSFontFix.dll

Decompiled 11 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Reptile;
using TMPro;
using UnityEngine;
using UnityEngine.TextCore;
using UnityEngine.TextCore.LowLevel;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: AssemblyCompany("BombRushRUSFontFix")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("BombRushRUSFontFix")]
[assembly: AssemblyTitle("BombRushRUSFontFix")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BombRushRUSFontFix
{
	[BepInPlugin("ru.bombrush.rusfontfix", "Bomb Rush RUS Font Fix", "1.0.0")]
	[BepInProcess("Bomb Rush Cyberfunk.exe")]
	public sealed class Plugin : BaseUnityPlugin
	{
		public const string PluginGuid = "ru.bombrush.rusfontfix";

		public const string PluginName = "Bomb Rush RUS Font Fix";

		public const string PluginVersion = "1.0.0";

		private ConfigEntry<bool> _enabled;

		private ConfigEntry<bool> _matchOriginalRendering;

		private ConfigEntry<float> _outlineWidthMultiplier;

		private ConfigEntry<float> _mainButtonUnderlayDilateMultiplier;

		private ConfigEntry<float> _mainButtonOutlineWidth;

		private Harmony _harmony;

		internal static Plugin Instance { get; private set; }

		internal RuntimeFontManager Fonts { get; private set; }

		internal bool IsEnabled
		{
			get
			{
				if (_enabled != null)
				{
					return _enabled.Value;
				}
				return true;
			}
		}

		internal float OutlineWidthMultiplier
		{
			get
			{
				if (!MatchOriginalRendering)
				{
					return _outlineWidthMultiplier?.Value ?? 2f;
				}
				return 1f;
			}
		}

		internal float MainButtonUnderlayDilateMultiplier
		{
			get
			{
				if (!MatchOriginalRendering)
				{
					return _mainButtonUnderlayDilateMultiplier?.Value ?? 1.5f;
				}
				return 1f;
			}
		}

		internal float MainButtonOutlineWidth
		{
			get
			{
				if (!MatchOriginalRendering)
				{
					return _mainButtonOutlineWidth?.Value ?? 0.12f;
				}
				return 0f;
			}
		}

		private bool MatchOriginalRendering
		{
			get
			{
				if (_matchOriginalRendering != null)
				{
					return _matchOriginalRendering.Value;
				}
				return true;
			}
		}

		private void Awake()
		{
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Expected O, but got Unknown
			Instance = this;
			_enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Replace the Russian UI font profiles for which a matching Cyrillic font is available.");
			_matchOriginalRendering = ((BaseUnityPlugin)this).Config.Bind<bool>("Visual", "MatchOriginalRendering", true, "Use the original English TMP material values. Disable to enable the manual outline and underlay adjustments below.");
			_outlineWidthMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Visual", "OutlineWidthMultiplier", 2f, "Multiplier for authored English outline widths. Restart the game after changing it.");
			_mainButtonUnderlayDilateMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Visual", "MainButtonUnderlayDilateMultiplier", 1.5f, "Multiplier for the Induction backdrop/pressed underlay thickness. Restart the game after changing it.");
			_mainButtonOutlineWidth = ((BaseUnityPlugin)this).Config.Bind<float>("Visual", "MainButtonOutlineWidth", 0.12f, "Symmetric outline added to Induction backdrop/pressed states. Set to 0 to disable. Restart the game after changing it.");
			Fonts = new RuntimeFontManager(((BaseUnityPlugin)this).Logger, ((BaseUnityPlugin)this).Info.Location);
			Fonts.Initialize();
			_harmony = new Harmony("ru.bombrush.rusfontfix");
			_harmony.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)string.Format("{0} {1} loaded; {2} runtime fonts ready.", "Bomb Rush RUS Font Fix", "1.0.0", Fonts.LoadedFontCount));
		}

		private void OnDestroy()
		{
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Fonts?.Dispose();
			Instance = null;
		}
	}
	internal sealed class RuntimeFontManager : IDisposable
	{
		private sealed class FontDefinition
		{
			public string Key { get; }

			public string FileName { get; }

			public int PointSize { get; }

			public int Padding { get; }

			public int AtlasWidth { get; }

			public int AtlasHeight { get; }

			public int RenderMode { get; }

			public float LineHeight { get; }

			public float AscentLine { get; }

			public float CapLine { get; }

			public float MeanLine { get; }

			public float DescentLine { get; }

			public float TabWidth { get; }

			public FontDefinition(string key, string fileName, int pointSize, int padding, int atlasWidth, int atlasHeight, int renderMode, float lineHeight, float ascentLine, float capLine, float meanLine, float descentLine, float tabWidth)
			{
				Key = key;
				FileName = fileName;
				PointSize = pointSize;
				Padding = padding;
				AtlasWidth = atlasWidth;
				AtlasHeight = atlasHeight;
				RenderMode = renderMode;
				LineHeight = lineHeight;
				AscentLine = ascentLine;
				CapLine = capLine;
				MeanLine = meanLine;
				DescentLine = descentLine;
				TabWidth = tabWidth;
			}
		}

		private const string PrewarmCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя .,!?;:-–—…'\"«»()[]{}+/%°";

		private static readonly FontDefinition[] Definitions = new FontDefinition[12]
		{
			new FontDefinition("ForgottenRegular", "ForgottenFuturist-Regular.ttf", 55, 10, 1024, 1024, 4165, 66f, 50.93f, 38f, 28f, -15.07f, 11f),
			new FontDefinition("ForgottenBold", "ForgottenFuturist-Bold.ttf", 55, 10, 1024, 1024, 4165, 66f, 50.93f, 38f, 28f, -15.07f, 11f),
			new FontDefinition("Induction", "induction.ttf", 109, 10, 2048, 2048, 4165, 109.218f, 87.2f, 72f, 70f, -22.018f, 61f),
			new FontDefinition("InductionBackdrop", "induction.ttf", 35, 10, 1024, 1024, 4165, 35.07f, 28f, 22f, 22f, -7.07f, 20f),
			new FontDefinition("Polyester2070", "2070POLYESTER-Regular.ttf", 57, 8, 1024, 1024, 4165, 52.44f, 42.75f, 35f, 25f, -9.69f, 20f),
			new FontDefinition("Coolvetica", "coolvetica rg.otf", 76, 8, 1024, 1024, 4165, 91.2f, 73.492f, 50f, 37f, -17.708f, 18f),
			new FontDefinition("FerriteBlack", "FerriteCoreDX-Black.ttf", 31, 8, 1024, 512, 4165, 37.2f, 31f, 21f, 16f, -6.2f, 14f),
			new FontDefinition("ForcedSquare", "FORCED SQUARE.ttf", 36, 16, 1024, 1024, 4165, 29.196f, 21.708f, 19f, 15f, -6.192f, 12f),
			new FontDefinition("Karnivore", "Karnivore-Bold.ttf", 90, 9, 1024, 1024, 4165, 111.96f, 98.91f, 68f, 68f, -13.05f, 41f),
			new FontDefinition("ModernDos", "ModernDOS8x16-Regular.ttf", 74, 8, 512, 512, 8230, 74f, 55.5f, 47f, 33f, -18.5f, 37f),
			new FontDefinition("Pitviper", "Pitviper-Regular.ttf", 30, 8, 512, 512, 4165, 28.53f, 22.53f, 21f, 21f, -6f, 17f),
			new FontDefinition("ProphitDot", "V5PRD_ProphitDot.ttf", 70, 8, 1024, 1024, 4165, 70f, 55.72f, 42f, 35f, -14.28f, 21f)
		};

		private static readonly Dictionary<string, string> ProfileToFontKey = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
		{
			["CharacterNameTextCyrillic"] = "InductionBackdrop",
			["DefaultTextCyrillic"] = "ForgottenRegular",
			["DefaultTextBoldCyrillic"] = "ForgottenBold",
			["DefaultTextHighlightedCyrillic"] = "ForgottenRegular",
			["DefaultTextThinCyrillic"] = "ForgottenRegular",
			["FlavorTextCyrillic"] = "ForgottenRegular",
			["GameplayHUDGraffitiTextCyrillic"] = "FerriteBlack",
			["GameplayHUDHeaderTextCyrillic"] = "Coolvetica",
			["GameplayHudCrewTextCyrillic"] = "Polyester2070",
			["GameplayHUDStatusTextCyrillic"] = "Pitviper",
			["LoadingTextCyrilic"] = "ProphitDot",
			["MainButtonTextCyrillic"] = "Induction",
			["MainButtonTextBackdropCyrillic"] = "InductionBackdrop",
			["MainButtonTextHighlightedCyrillic"] = "InductionBackdrop",
			["MainButtonTextPressedCyrillic"] = "InductionBackdrop",
			["MenuTitleTextCyrillic"] = "Coolvetica",
			["MenuTimeLineTextCyrillic"] = "FerriteBlack",
			["MenuTimeLineSelectedTextCyrillic"] = "FerriteBlack",
			["MicroBoyTextOutlineCyrillic"] = "Karnivore",
			["MicroBoyTextWithoutOutlineCyrillic"] = "Karnivore",
			["DottedTextCyrillic"] = "ProphitDot",
			["PhoneClockTextCyrillic"] = "FerriteBlack",
			["PhoneFortuneTextCyrillic"] = "ModernDos",
			["PhoneMainTextCyrillic"] = "Polyester2070",
			["PhoneOnScreenNotificationTextCyrillic"] = "Polyester2070",
			["PhoneNotificationTextCyrillic"] = "ForcedSquare",
			["SplashScreenTextCyrillic"] = "Induction",
			["YesNoBackdropCyrillic"] = "FerriteBlack",
			["YesNoCyrillic"] = "FerriteBlack"
		};

		private static readonly Dictionary<string, string> ProfileToLatinProfile = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
		{
			["MicroBoyTextOutlineCyrillic"] = "MicroBoyTextLatin",
			["MicroBoyTextWithoutOutlineCyrillic"] = "MicroBoyTextWithoutOultineLatin"
		};

		private readonly ManualLogSource _log;

		private readonly string _fontDirectory;

		private readonly Dictionary<string, TMP_FontAsset> _fonts = new Dictionary<string, TMP_FontAsset>(StringComparer.OrdinalIgnoreCase);

		private readonly Dictionary<string, Material> _materials = new Dictionary<string, Material>(StringComparer.OrdinalIgnoreCase);

		private readonly Dictionary<string, Material> _styleSources = new Dictionary<string, Material>(StringComparer.OrdinalIgnoreCase);

		private readonly List<Font> _unityFonts = new List<Font>();

		public int LoadedFontCount => _fonts.Count;

		public RuntimeFontManager(ManualLogSource log, string pluginAssemblyPath)
		{
			_log = log;
			_fontDirectory = Path.Combine(Path.GetDirectoryName(pluginAssemblyPath) ?? string.Empty, "Fonts");
		}

		public void Initialize()
		{
			FontDefinition[] definitions = Definitions;
			foreach (FontDefinition definition in definitions)
			{
				TryLoad(definition);
			}
		}

		public bool TryGetFont(string profileName, out TMP_FontAsset fontAsset)
		{
			fontAsset = null;
			if (!ProfileToFontKey.TryGetValue(profileName, out var value))
			{
				return false;
			}
			if (_fonts.TryGetValue(value, out fontAsset))
			{
				return (Object)(object)fontAsset != (Object)null;
			}
			return false;
		}

		public void AddFallback(TMP_FontAsset fontAsset, TMP_FontAsset fallback)
		{
			if (!((Object)(object)fontAsset == (Object)null) && !((Object)(object)fallback == (Object)null) && !((Object)(object)fontAsset == (Object)(object)fallback))
			{
				if (fontAsset.fallbackFontAssetTable == null)
				{
					fontAsset.fallbackFontAssetTable = new List<TMP_FontAsset>();
				}
				if (!fontAsset.fallbackFontAssetTable.Contains(fallback))
				{
					fontAsset.fallbackFontAssetTable.Add(fallback);
				}
			}
		}

		public Material GetStyledMaterial(string profileName, TMP_FontAsset fontAsset, Material original)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			if (_materials.TryGetValue(profileName, out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Material material = ((TMP_Asset)fontAsset).material;
			if ((Object)(object)material == (Object)null)
			{
				return original;
			}
			Material val = GetLatinStyleSource(profileName) ?? original ?? material;
			Material val2 = new Material(val)
			{
				name = profileName + " (Bomb Rush RUS Font Fix)",
				hideFlags = (HideFlags)61
			};
			BindRuntimeAtlas(material, val2);
			float num = (val2.HasProperty("_OutlineWidth") ? val2.GetFloat("_OutlineWidth") : 0f);
			bool num2 = IsMicroBoyProfile(profileName);
			float num3 = Mathf.Max(0f, Plugin.Instance?.OutlineWidthMultiplier ?? 2f);
			float num4 = ((!num2 && num > 0.0001f) ? Mathf.Clamp(num * num3, 0f, 1f) : num);
			float num5 = (IsMainButtonUnderlayProfile(profileName) ? Mathf.Clamp(Plugin.Instance?.MainButtonOutlineWidth ?? 0.12f, 0f, 1f) : 0f);
			if (num5 > 0.0001f)
			{
				num4 = Mathf.Max(num4, num5);
				CopyColor(val2, "_UnderlayColor", "_OutlineColor");
			}
			if (val2.HasProperty("_OutlineWidth"))
			{
				val2.SetFloat("_OutlineWidth", num4);
			}
			float num6 = GetFloat(val2, "_UnderlayDilate");
			int num7;
			float num8;
			if (IsMainButtonUnderlayProfile(profileName))
			{
				num7 = (val2.IsKeywordEnabled(ShaderUtilities.Keyword_Underlay) ? 1 : 0);
				if (num7 != 0)
				{
					num8 = Mathf.Max(0f, Plugin.Instance?.MainButtonUnderlayDilateMultiplier ?? 1.5f);
					goto IL_0193;
				}
			}
			else
			{
				num7 = 0;
			}
			num8 = 1f;
			goto IL_0193;
			IL_0193:
			float num9 = num8;
			float num10 = ((num7 != 0) ? Mathf.Clamp(num6 * num9, -1f, 1f) : num6);
			if (val2.HasProperty("_UnderlayDilate"))
			{
				val2.SetFloat("_UnderlayDilate", num10);
			}
			ShaderUtilities.UpdateShaderRatios(val2);
			if (!num2 && num4 > 0.0001f)
			{
				val2.EnableKeyword(ShaderUtilities.Keyword_Outline);
			}
			else
			{
				val2.DisableKeyword(ShaderUtilities.Keyword_Outline);
			}
			float num11 = GetFloat(val2, "_UnderlayOffsetX");
			float num12 = GetFloat(val2, "_UnderlayOffsetY");
			_log.LogInfo((object)("Styled material: " + profileName + "; source=" + ((Object)val).name + "; " + $"shader={((Object)val2.shader).name}; authoredOutline={num:0.###}; " + $"outlineMultiplier={num3:0.###}; " + $"mainButtonOutline={num5:0.###}; outline={num4:0.###}; " + $"authoredUnderlayDilate={num6:0.###}; " + $"underlayMultiplier={num9:0.###}; " + $"underlayDilate={num10:0.###}; " + $"underlayOffset=({num11:0.###},{num12:0.###}); " + "keywords=[" + string.Join(",", val2.shaderKeywords) + "]"));
			_materials[profileName] = val2;
			return val2;
		}

		public void Dispose()
		{
			foreach (Material item in _materials.Values.Where((Material value) => (Object)(object)value != (Object)null))
			{
				Object.Destroy((Object)(object)item);
			}
			foreach (TMP_FontAsset item2 in _fonts.Values.Where((TMP_FontAsset value) => (Object)(object)value != (Object)null))
			{
				Object.Destroy((Object)(object)item2);
			}
			foreach (Font item3 in _unityFonts.Where((Font value) => (Object)(object)value != (Object)null))
			{
				Object.Destroy((Object)(object)item3);
			}
			_materials.Clear();
			_styleSources.Clear();
			_fonts.Clear();
			_unityFonts.Clear();
		}

		private void TryLoad(FontDefinition definition)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Expected O, but got Unknown
			string text = Path.Combine(_fontDirectory, definition.FileName);
			if (!File.Exists(text))
			{
				_log.LogWarning((object)("Font file is missing: " + text));
				return;
			}
			Font val = new Font(text);
			if ((Object)(object)val == (Object)null)
			{
				_log.LogError((object)("Unity could not load font file: " + text));
				return;
			}
			((Object)val).hideFlags = (HideFlags)61;
			_unityFonts.Add(val);
			TMP_FontAsset val2 = TMP_FontAsset.CreateFontAsset(val, definition.PointSize, definition.Padding, (GlyphRenderMode)definition.RenderMode, definition.AtlasWidth, definition.AtlasHeight, (AtlasPopulationMode)1, true);
			if ((Object)(object)val2 == (Object)null)
			{
				_log.LogError((object)("TextMeshPro could not create a font asset for " + definition.FileName + "."));
				return;
			}
			((Object)val).name = "BombRushRUSFontFix_" + definition.Key;
			((Object)val2).name = "BombRushRUSFontFix_" + definition.Key + "_SDF";
			((Object)val2).hideFlags = (HideFlags)61;
			ApplyOriginalMetrics(val2, definition);
			string text2 = default(string);
			val2.TryAddCharacters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя .,!?;:-–—…'\"«»()[]{}+/%°", ref text2, true);
			if (!string.IsNullOrEmpty(text2))
			{
				_log.LogWarning((object)(definition.FileName + " is missing characters: " + text2));
			}
			_fonts[definition.Key] = val2;
			_log.LogInfo((object)("Loaded runtime TMP font: " + definition.FileName + " -> " + ((Object)val2).name));
		}

		private Material GetLatinStyleSource(string profileName)
		{
			if (_styleSources.TryGetValue(profileName, out var value))
			{
				return value;
			}
			string latinProfileName = GetLatinProfileName(profileName);
			Material val = null;
			if (latinProfileName != null)
			{
				TextMeshProFont val2 = ((IEnumerable<TextMeshProFont>)Resources.FindObjectsOfTypeAll<TextMeshProFont>()).FirstOrDefault((Func<TextMeshProFont, bool>)((TextMeshProFont candidate) => (Object)(object)candidate != (Object)null && string.Equals(((Object)candidate).name, latinProfileName, StringComparison.OrdinalIgnoreCase)));
				if ((Object)(object)val2 != (Object)null)
				{
					val = val2.FontMaterial;
					if ((Object)(object)val != (Object)null)
					{
						_log.LogInfo((object)("Material style: " + profileName + " <- " + latinProfileName));
					}
				}
			}
			_styleSources[profileName] = val;
			return val;
		}

		private static string GetLatinProfileName(string profileName)
		{
			if (ProfileToLatinProfile.TryGetValue(profileName, out var value))
			{
				return value;
			}
			if (profileName.EndsWith("Cyrillic", StringComparison.OrdinalIgnoreCase))
			{
				return profileName.Substring(0, profileName.Length - "Cyrillic".Length) + "Latin";
			}
			if (profileName.EndsWith("Cyrilic", StringComparison.OrdinalIgnoreCase))
			{
				return profileName.Substring(0, profileName.Length - "Cyrilic".Length) + "Latin";
			}
			return null;
		}

		private static bool IsMainButtonUnderlayProfile(string profileName)
		{
			if (!string.Equals(profileName, "MainButtonTextBackdropCyrillic", StringComparison.OrdinalIgnoreCase) && !string.Equals(profileName, "MainButtonTextHighlightedCyrillic", StringComparison.OrdinalIgnoreCase))
			{
				return string.Equals(profileName, "MainButtonTextPressedCyrillic", StringComparison.OrdinalIgnoreCase);
			}
			return true;
		}

		private static bool IsMicroBoyProfile(string profileName)
		{
			if (!string.Equals(profileName, "MicroBoyTextOutlineCyrillic", StringComparison.OrdinalIgnoreCase))
			{
				return string.Equals(profileName, "MicroBoyTextWithoutOutlineCyrillic", StringComparison.OrdinalIgnoreCase);
			}
			return true;
		}

		private static float GetFloat(Material material, string property)
		{
			if (!material.HasProperty(property))
			{
				return 0f;
			}
			return material.GetFloat(property);
		}

		private static void CopyColor(Material material, string sourceProperty, string destinationProperty)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			if (material.HasProperty(sourceProperty) && material.HasProperty(destinationProperty))
			{
				material.SetColor(destinationProperty, material.GetColor(sourceProperty));
			}
		}

		private static void ApplyOriginalMetrics(TMP_FontAsset fontAsset, FontDefinition definition)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			FaceInfo faceInfo = fontAsset.faceInfo;
			((FaceInfo)(ref faceInfo)).lineHeight = definition.LineHeight;
			((FaceInfo)(ref faceInfo)).ascentLine = definition.AscentLine;
			((FaceInfo)(ref faceInfo)).capLine = definition.CapLine;
			((FaceInfo)(ref faceInfo)).meanLine = definition.MeanLine;
			((FaceInfo)(ref faceInfo)).baseline = 0f;
			((FaceInfo)(ref faceInfo)).descentLine = definition.DescentLine;
			((FaceInfo)(ref faceInfo)).superscriptOffset = ((FaceInfo)(ref faceInfo)).ascentLine;
			((FaceInfo)(ref faceInfo)).subscriptOffset = ((FaceInfo)(ref faceInfo)).descentLine;
			((FaceInfo)(ref faceInfo)).tabWidth = definition.TabWidth;
			fontAsset.faceInfo = faceInfo;
		}

		private static void BindRuntimeAtlas(Material source, Material destination)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			if (source.HasProperty("_MainTex") && destination.HasProperty("_MainTex"))
			{
				destination.SetTexture("_MainTex", source.GetTexture("_MainTex"));
				destination.SetTextureScale("_MainTex", source.GetTextureScale("_MainTex"));
				destination.SetTextureOffset("_MainTex", source.GetTextureOffset("_MainTex"));
			}
			string[] array = new string[3] { "_GradientScale", "_TextureWidth", "_TextureHeight" };
			foreach (string text in array)
			{
				if (source.HasProperty(text) && destination.HasProperty(text))
				{
					destination.SetFloat(text, source.GetFloat(text));
				}
			}
		}
	}
	[HarmonyPatch]
	internal static class TextMeshProFontPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		private static void GetFontAssetPostfix(TextMeshProFont __instance, ref TMP_FontAsset __result)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Invalid comparison between Unknown and I4
			Plugin instance = Plugin.Instance;
			if (!((Object)(object)instance == (Object)null) && instance.IsEnabled && instance.Fonts != null && !((Object)(object)__instance == (Object)null) && (int)__instance.Language == 30 && instance.Fonts.TryGetFont(((Object)__instance).name, out var fontAsset))
			{
				instance.Fonts.AddFallback(fontAsset, __result);
				__result = fontAsset;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		private static void GetFontMaterialPostfix(TextMeshProFont __instance, ref Material __result)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Invalid comparison between Unknown and I4
			Plugin instance = Plugin.Instance;
			if (!((Object)(object)instance == (Object)null) && instance.IsEnabled && instance.Fonts != null && !((Object)(object)__instance == (Object)null) && (int)__instance.Language == 30 && instance.Fonts.TryGetFont(((Object)__instance).name, out var fontAsset))
			{
				__result = instance.Fonts.GetStyledMaterial(((Object)__instance).name, fontAsset, __result);
			}
		}
	}
}