using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Wizard; [ExecuteInEditMode] [AddComponentMenu("NGUI/UI/NGUI Label")] public class UILabel : UIWidget { public enum Effect { None, Shadow, Outline, Outline8 } public enum Overflow { ShrinkContent, ClampContent, ResizeFreely, ResizeHeight } public enum Crispness { Never, OnDesktop, Always } public Crispness keepCrispWhenShrunk = Crispness.OnDesktop; private static bool OnFontChangedFlg = false; private static UnityEngine.Font OnFontChangedFont; [HideInInspector] [SerializeField] private UnityEngine.Font mTrueTypeFont; [HideInInspector] [SerializeField] private UIFont mFont; [Multiline(6)] [HideInInspector] [SerializeField] private string mText = ""; [HideInInspector] [SerializeField] private int mFontSize = 16; [HideInInspector] [SerializeField] private FontStyle mFontStyle; [HideInInspector] [SerializeField] private NGUIText.Alignment mAlignment; [HideInInspector] [SerializeField] private bool mEncoding = true; [HideInInspector] [SerializeField] private int mMaxLineCount; [HideInInspector] [SerializeField] private Effect mEffectStyle; [HideInInspector] [SerializeField] private Color mEffectColor = Color.black; [HideInInspector] [SerializeField] private NGUIText.SymbolStyle mSymbols = NGUIText.SymbolStyle.Normal; [HideInInspector] [SerializeField] private Vector2 mEffectDistance = Vector2.one; [HideInInspector] [SerializeField] private Overflow mOverflow; [HideInInspector] [SerializeField] private Material mMaterial; [HideInInspector] [SerializeField] private bool mApplyGradient; [HideInInspector] [SerializeField] private Color mGradientTop = Color.white; [HideInInspector] [SerializeField] private Color mGradientBottom = new Color(0.7f, 0.7f, 0.7f); [HideInInspector] [SerializeField] private int mSpacingX; [HideInInspector] [SerializeField] private int mSpacingY; [HideInInspector] [SerializeField] private bool mUseFloatSpacing; [HideInInspector] [SerializeField] private float mFloatSpacingX; [HideInInspector] [SerializeField] private float mFloatSpacingY; [HideInInspector] [SerializeField] private bool mOverflowEllipsis; [HideInInspector] [SerializeField] private bool m_bWizardRuby; [HideInInspector] [SerializeField] private float m_WizardRubyScale = 0.6f; [HideInInspector] [SerializeField] private float m_WizardRubyMargin = 0.6f; [HideInInspector] [SerializeField] private bool m_bWizardDot; [HideInInspector] [SerializeField] private float m_WizardDotScale = 0.8f; [HideInInspector] [SerializeField] private float m_WizardDotMargin = 0.5f; [HideInInspector] [SerializeField] private bool _alignmentEachLanguage; [HideInInspector] [SerializeField] private bool mShrinkToFit; [HideInInspector] [SerializeField] private int mMaxLineWidth; [HideInInspector] [SerializeField] private int mMaxLineHeight; [HideInInspector] [SerializeField] private float mLineWidth; [HideInInspector] [SerializeField] private bool mMultiline = true; [NonSerialized] private UnityEngine.Font mActiveTTF; [NonSerialized] private float mDensity = 1f; [NonSerialized] private bool mShouldBeProcessed = true; [NonSerialized] private string mProcessedText; [NonSerialized] private bool mPremultiply; [NonSerialized] private Vector2 mCalculatedSize = Vector2.zero; [NonSerialized] private float mScale = 1f; [NonSerialized] private int mFinalFontSize; [NonSerialized] private int mLastWidth; [NonSerialized] private int mLastHeight; private string _originalText; public Action OnWindowResize; private static BetterList mList = new BetterList(); private static Dictionary mFontUsage = new Dictionary(); private static bool mTexRebuildAdded = false; private static BetterList mTempVerts = new BetterList(); private static BetterList mTempIndices = new BetterList(); public bool IsRuby => m_bWizardRuby; public float RubyScale => m_WizardRubyScale; public float RubyMargin => m_WizardRubyMargin; public bool IsDot => m_bWizardDot; public float DotScale => m_WizardDotScale; public float DotMargin => m_WizardDotMargin; public int finalFontSize { get { if ((bool)trueTypeFont) { return Mathf.RoundToInt(mScale * (float)mFinalFontSize); } return Mathf.RoundToInt((float)mFinalFontSize * mScale); } } private bool shouldBeProcessed { get { return mShouldBeProcessed; } set { if (value) { mChanged = true; mShouldBeProcessed = true; } else { mShouldBeProcessed = false; } } } public override bool isAnchoredHorizontally { get { if (!base.isAnchoredHorizontally) { return mOverflow == Overflow.ResizeFreely; } return true; } } public override bool isAnchoredVertically { get { if (!base.isAnchoredVertically && mOverflow != Overflow.ResizeFreely) { return mOverflow == Overflow.ResizeHeight; } return true; } } public override Material material { get { if (mMaterial != null) { return mMaterial; } if (mFont != null) { return mFont.material; } if (mTrueTypeFont != null) { return mTrueTypeFont.material; } return null; } set { if (mMaterial != value) { RemoveFromPanel(); mMaterial = value; MarkAsChanged(); } } } [Obsolete("Use UILabel.bitmapFont instead")] public UIFont font { get { return bitmapFont; } set { bitmapFont = value; } } public UIFont bitmapFont { get { return mFont; } set { if (mFont != value) { RemoveFromPanel(); mFont = value; mTrueTypeFont = null; MarkAsChanged(); } } } public UnityEngine.Font trueTypeFont { get { if (mTrueTypeFont != null) { return mTrueTypeFont; } if (!(mFont != null)) { return null; } return mFont.dynamicFont; } set { if (mTrueTypeFont != value) { SetActiveFont(null); RemoveFromPanel(); mTrueTypeFont = value; shouldBeProcessed = true; mFont = null; SetActiveFont(value); ProcessAndRequest(); if (mActiveTTF != null) { base.MarkAsChanged(); } } } } public UnityEngine.Object ambigiousFont { get { return (UnityEngine.Object)(((object)mFont) ?? ((object)mTrueTypeFont)); } set { UIFont uIFont = value as UIFont; if (uIFont != null) { bitmapFont = uIFont; } else { trueTypeFont = value as UnityEngine.Font; } } } public string text { get { return mText; } set { if (mText == value) { return; } if (string.IsNullOrEmpty(value)) { if (!string.IsNullOrEmpty(mText)) { mText = ""; MarkAsChanged(); ProcessAndRequest(); } } else if (mText != value) { mText = value; MarkAsChanged(); ProcessAndRequest(); } if (autoResizeBoxCollider) { ResizeCollider(); } } } public int defaultFontSize { get { if (!(trueTypeFont != null)) { if (!(mFont != null)) { return 16; } return mFont.defaultSize; } return mFontSize; } } public int fontSize { get { return mFontSize; } set { value = Mathf.Clamp(value, 0, 256); if (mFontSize != value) { mFontSize = value; shouldBeProcessed = true; ProcessAndRequest(); } } } public FontStyle fontStyle { get { return mFontStyle; } set { if (mFontStyle != value) { mFontStyle = value; shouldBeProcessed = true; ProcessAndRequest(); } } } public NGUIText.Alignment alignment { get { if (_alignmentEachLanguage) { try { return (NGUIText.Alignment)Enum.Parse(typeof(NGUIText.Alignment), Data.SystemText.Get("Dialog_Text_Alignment")); } catch (Exception) { _ = Application.isPlaying; } } return mAlignment; } set { if (mAlignment != value) { mAlignment = value; shouldBeProcessed = true; ProcessAndRequest(); } } } public bool applyGradient { get { return mApplyGradient; } set { if (mApplyGradient != value) { mApplyGradient = value; MarkAsChanged(); } } } public Color gradientTop { get { return mGradientTop; } set { if (mGradientTop != value) { mGradientTop = value; if (mApplyGradient) { MarkAsChanged(); } } } } public Color gradientBottom { get { return mGradientBottom; } set { if (mGradientBottom != value) { mGradientBottom = value; if (mApplyGradient) { MarkAsChanged(); } } } } public int spacingX { get { return mSpacingX; } set { if (mSpacingX != value) { mSpacingX = value; MarkAsChanged(); } } } public int spacingY { get { return mSpacingY; } set { if (mSpacingY != value) { mSpacingY = value; MarkAsChanged(); } } } public bool useFloatSpacing { get { return mUseFloatSpacing; } set { if (mUseFloatSpacing != value) { mUseFloatSpacing = value; shouldBeProcessed = true; } } } public float floatSpacingX { get { return mFloatSpacingX; } set { if (!Mathf.Approximately(mFloatSpacingX, value)) { mFloatSpacingX = value; MarkAsChanged(); } } } public float floatSpacingY { get { return mFloatSpacingY; } set { if (!Mathf.Approximately(mFloatSpacingY, value)) { mFloatSpacingY = value; MarkAsChanged(); } } } public float effectiveSpacingY { get { if (!mUseFloatSpacing) { return mSpacingY; } return mFloatSpacingY; } } public float effectiveSpacingX { get { if (!mUseFloatSpacing) { return mSpacingX; } return mFloatSpacingX; } } public bool overflowEllipsis { get { return mOverflowEllipsis; } set { if (mOverflowEllipsis != value) { mOverflowEllipsis = value; MarkAsChanged(); } } } private bool keepCrisp => trueTypeFont != null; public bool supportEncoding { get { return mEncoding; } set { if (mEncoding != value) { mEncoding = value; shouldBeProcessed = true; } } } public NGUIText.SymbolStyle symbolStyle { get { return mSymbols; } set { if (mSymbols != value) { mSymbols = value; shouldBeProcessed = true; } } } public Overflow overflowMethod { get { return mOverflow; } set { if (mOverflow != value) { mOverflow = value; shouldBeProcessed = true; } } } [Obsolete("Use 'width' instead")] public int lineWidth { get { return base.width; } set { base.width = value; } } [Obsolete("Use 'height' instead")] public int lineHeight { get { return base.height; } set { base.height = value; } } public bool multiLine { get { return mMaxLineCount != 1; } set { if (mMaxLineCount != 1 != value) { mMaxLineCount = ((!value) ? 1 : 0); shouldBeProcessed = true; } } } public override Vector3[] localCorners { get { if (shouldBeProcessed) { ProcessText(); } return base.localCorners; } } public override Vector3[] worldCorners { get { if (shouldBeProcessed) { ProcessText(); } return base.worldCorners; } } public override Vector4 drawingDimensions { get { if (shouldBeProcessed) { ProcessText(); } return base.drawingDimensions; } } public int maxLineCount { get { return mMaxLineCount; } set { if (mMaxLineCount != value) { mMaxLineCount = Mathf.Max(value, 0); shouldBeProcessed = true; if (overflowMethod == Overflow.ShrinkContent) { MakePixelPerfect(); } } } } public Effect effectStyle { get { return mEffectStyle; } set { if (mEffectStyle != value) { mEffectStyle = value; shouldBeProcessed = true; } } } public Color effectColor { get { return mEffectColor; } set { if (mEffectColor != value) { mEffectColor = value; if (mEffectStyle != Effect.None) { shouldBeProcessed = true; } } } } public Vector2 effectDistance { get { return mEffectDistance; } set { if (mEffectDistance != value) { mEffectDistance = value; shouldBeProcessed = true; } } } [Obsolete("Use 'overflowMethod == UILabel.Overflow.ShrinkContent' instead")] public bool shrinkToFit { get { return mOverflow == Overflow.ShrinkContent; } set { if (value) { overflowMethod = Overflow.ShrinkContent; } } } public string processedText { get { if (mLastWidth != mWidth || mLastHeight != mHeight) { mLastWidth = mWidth; mLastHeight = mHeight; mShouldBeProcessed = true; } if (shouldBeProcessed) { ProcessText(); } return mProcessedText; } } public Vector2 printedSize { get { if (shouldBeProcessed) { ProcessText(); } return mCalculatedSize; } } public override Vector2 localSize { get { if (shouldBeProcessed) { ProcessText(); } return base.localSize; } } private bool isValid { get { if (!(mFont != null)) { return mTrueTypeFont != null; } return true; } } public void SetWrapText(string s) { _originalText = s; text = Global.GetConvertWrapText(this, s); } public void WrapOnResize() { if (_originalText != null) { text = Global.GetConvertWrapText(this, _originalText); } if (OnWindowResize != null) { OnWindowResize(); } } protected override void OnInit() { base.OnInit(); mList.Add(this); InitializeFont(); SetActiveFont(trueTypeFont); } public void InitializeFont() { if (Global.GAME_FONT == null) { Global.GAME_FONT = Resources.Load("Fonts/Jpn/A-OTF-KaiminTuStd-Bold"); } if (trueTypeFont != Global.GAME_FONT && bitmapFont == null) { trueTypeFont = Global.GAME_FONT; } } protected override void OnDisable() { SetActiveFont(null); mList.Remove(this); base.OnDisable(); } protected void SetActiveFont(UnityEngine.Font fnt) { if (!(mActiveTTF != fnt)) { return; } UnityEngine.Font font = mActiveTTF; if (font != null && mFontUsage.TryGetValue(font, out var value)) { value = Mathf.Max(0, --value); if (value == 0) { mFontUsage.Remove(font); } else { mFontUsage[font] = value; } } mActiveTTF = fnt; font = fnt; if (font != null) { int num = 0; num = (mFontUsage[font] = num + 1); } } private static void OnFontChanged(UnityEngine.Font font) { OnFontChangedFlg = true; OnFontChangedFont = font; for (int i = 0; i < mList.size; i++) { UILabel uILabel = mList[i]; if (uILabel != null) { UnityEngine.Font font2 = uILabel.trueTypeFont; if (font2 == font) { font2.RequestCharactersInTexture(uILabel.mText, uILabel.mFinalFontSize, uILabel.mFontStyle); uILabel.RemoveFromPanel(); uILabel.CreatePanel(); } } } } public override Vector3[] GetSides(Transform relativeTo) { if (shouldBeProcessed) { ProcessText(); } return base.GetSides(relativeTo); } protected override void UpgradeFrom265() { ProcessText(legacyMode: true, full: true); if (mShrinkToFit) { overflowMethod = Overflow.ShrinkContent; mMaxLineCount = 0; } if (mMaxLineWidth != 0) { base.width = mMaxLineWidth; overflowMethod = ((mMaxLineCount > 0) ? Overflow.ResizeHeight : Overflow.ShrinkContent); } else { overflowMethod = Overflow.ResizeFreely; } if (mMaxLineHeight != 0) { base.height = mMaxLineHeight; } if (mFont != null) { int defaultSize = mFont.defaultSize; if (base.height < defaultSize) { base.height = defaultSize; } fontSize = defaultSize; } mMaxLineWidth = 0; mMaxLineHeight = 0; mShrinkToFit = false; NGUITools.UpdateWidgetCollider(base.gameObject, considerInactive: true); } protected override void OnAnchor() { if (mOverflow == Overflow.ResizeFreely) { if (base.isFullyAnchored) { mOverflow = Overflow.ShrinkContent; } } else if (mOverflow == Overflow.ResizeHeight && topAnchor.target != null && bottomAnchor.target != null) { mOverflow = Overflow.ShrinkContent; } base.OnAnchor(); } private void ProcessAndRequest() { if (ambigiousFont != null) { ProcessText(); } } protected override void OnEnable() { base.OnEnable(); if (!mTexRebuildAdded) { mTexRebuildAdded = true; UnityEngine.Font.textureRebuilt += OnFontChanged; } } public void RefreshCustom() { SetActiveFont(null); mList.Remove(this); RemoveFromPanel(); if (base.isActiveAndEnabled) { base.OnEnable(); } } protected override void OnStart() { base.OnStart(); if (mLineWidth > 0f) { mMaxLineWidth = Mathf.RoundToInt(mLineWidth); mLineWidth = 0f; } if (!mMultiline) { mMaxLineCount = 1; mMultiline = true; } mPremultiply = material != null && material.shader != null && material.shader.name.Contains("Premultiplied"); ProcessAndRequest(); } public override void MarkAsChanged() { shouldBeProcessed = true; base.MarkAsChanged(); } public void ProcessText() { ProcessText(legacyMode: false, full: true); } private void ProcessText(bool legacyMode, bool full) { if (!isValid) { return; } mChanged = true; shouldBeProcessed = false; float num = mDrawRegion.z - mDrawRegion.x; float num2 = mDrawRegion.w - mDrawRegion.y; NGUIText.rectWidth = ((!legacyMode) ? base.width : ((mMaxLineWidth != 0) ? mMaxLineWidth : 1000000)); NGUIText.rectHeight = ((!legacyMode) ? base.height : ((mMaxLineHeight != 0) ? mMaxLineHeight : 1000000)); NGUIText.regionWidth = ((num != 1f) ? Mathf.RoundToInt((float)NGUIText.rectWidth * num) : NGUIText.rectWidth); NGUIText.regionHeight = ((num2 != 1f) ? Mathf.RoundToInt((float)NGUIText.rectHeight * num2) : NGUIText.rectHeight); mFinalFontSize = Mathf.Abs(legacyMode ? Mathf.RoundToInt(base.cachedTransform.localScale.x) : defaultFontSize); mScale = 1f; if (NGUIText.regionWidth < 1 || NGUIText.regionHeight < 0) { mProcessedText = ""; return; } bool flag = trueTypeFont != null; if (flag && keepCrisp) { UIRoot uIRoot = base.root; if (uIRoot != null) { mDensity = ((uIRoot != null) ? uIRoot.pixelSizeAdjustment : 1f); } } else { mDensity = 1f; } if (full) { UpdateNGUIText(); } if (mOverflow == Overflow.ResizeFreely) { NGUIText.rectWidth = 1000000; NGUIText.regionWidth = 1000000; } if (mOverflow == Overflow.ResizeFreely || mOverflow == Overflow.ResizeHeight) { NGUIText.rectHeight = 1000000; NGUIText.regionHeight = 1000000; } if (mFinalFontSize > 0) { bool flag2 = keepCrisp; int num3 = mFinalFontSize; while (num3 > 0) { if (flag2) { mFinalFontSize = num3; NGUIText.fontSize = mFinalFontSize; } else { mScale = (float)num3 / (float)mFinalFontSize; NGUIText.fontScale = (flag ? mScale : ((float)mFontSize / (float)mFont.defaultSize * mScale)); } NGUIText.Update(request: false, base.rawPivot); bool flag3 = NGUIText.WrapText(mText, out mProcessedText, keepCharCount: true, wrapLineColors: false, mOverflowEllipsis && mOverflow == Overflow.ClampContent); if (mOverflow == Overflow.ShrinkContent && !flag3) { if (--num3 <= 1) { break; } num3--; continue; } if (mOverflow == Overflow.ResizeFreely) { mCalculatedSize = NGUIText.CalculatePrintedSize(mProcessedText); mWidth = Mathf.Max(minWidth, Mathf.RoundToInt(mCalculatedSize.x)); if (num != 1f) { mWidth = Mathf.RoundToInt((float)mWidth / num); } mHeight = Mathf.Max(minHeight, Mathf.RoundToInt(mCalculatedSize.y)); if (num2 != 1f) { mHeight = Mathf.RoundToInt((float)mHeight / num2); } if ((mWidth & 1) == 1) { mWidth++; } if ((mHeight & 1) == 1) { mHeight++; } } else if (mOverflow == Overflow.ResizeHeight) { mCalculatedSize = NGUIText.CalculatePrintedSize(mProcessedText); mHeight = Mathf.Max(minHeight, Mathf.RoundToInt(mCalculatedSize.y)); if (num2 != 1f) { mHeight = Mathf.RoundToInt((float)mHeight / num2); } if ((mHeight & 1) == 1) { mHeight++; } } else { mCalculatedSize = NGUIText.CalculatePrintedSize(mProcessedText); } if (legacyMode) { base.width = Mathf.RoundToInt(mCalculatedSize.x); base.height = Mathf.RoundToInt(mCalculatedSize.y); base.cachedTransform.localScale = Vector3.one; } break; } } else { base.cachedTransform.localScale = Vector3.one; mProcessedText = ""; mScale = 1f; } if (full) { NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; } if (OnFontChangedFlg) { FontReflash(OnFontChangedFont); } } private IEnumerator FontRefreshCoroutine() { yield return null; Invalidate(includeChildren: false); } private static void FontReflash(UnityEngine.Font font) { OnFontChangedFlg = false; List list = null; for (int i = 0; i < mList.size; i++) { UILabel uILabel = mList[i]; if (uILabel != null && uILabel.trueTypeFont == font) { if (list == null) { list = new List(); } if (!list.Contains(uILabel.panel)) { list.Add(uILabel.panel); } } } if (list != null) { int j = 0; for (int count = list.Count; j < count; j++) { UIPanel uIPanel = list[j]; if (uIPanel != null) { uIPanel.Refresh(); } } list.Clear(); } OnFontChangedFlg = false; } public override void MakePixelPerfect() { if (ambigiousFont != null) { Vector3 localPosition = base.cachedTransform.localPosition; localPosition.x = Mathf.RoundToInt(localPosition.x); localPosition.y = Mathf.RoundToInt(localPosition.y); localPosition.z = Mathf.RoundToInt(localPosition.z); base.cachedTransform.localPosition = localPosition; base.cachedTransform.localScale = Vector3.one; if (mOverflow == Overflow.ResizeFreely) { AssumeNaturalSize(); return; } int a = base.width; int a2 = base.height; Overflow overflow = mOverflow; if (overflow != Overflow.ResizeHeight) { mWidth = 100000; } mHeight = 100000; mOverflow = Overflow.ShrinkContent; ProcessText(legacyMode: false, full: true); mOverflow = overflow; int a3 = Mathf.RoundToInt(mCalculatedSize.x); int a4 = Mathf.RoundToInt(mCalculatedSize.y); a3 = Mathf.Max(a3, base.minWidth); a4 = Mathf.Max(a4, base.minHeight); if ((a3 & 1) == 1) { a3++; } if ((a4 & 1) == 1) { a4++; } mWidth = Mathf.Max(a, a3); mHeight = Mathf.Max(a2, a4); MarkAsChanged(); } else { base.MakePixelPerfect(); } } public void AssumeNaturalSize() { if (ambigiousFont != null) { mWidth = 100000; mHeight = 100000; ProcessText(legacyMode: false, full: true); mWidth = Mathf.RoundToInt(mCalculatedSize.x); mHeight = Mathf.RoundToInt(mCalculatedSize.y); if ((mWidth & 1) == 1) { mWidth++; } if ((mHeight & 1) == 1) { mHeight++; } MarkAsChanged(); } } [Obsolete("Use UILabel.GetCharacterAtPosition instead")] public int GetCharacterIndex(Vector3 worldPos) { return GetCharacterIndexAtPosition(worldPos, precise: false); } [Obsolete("Use UILabel.GetCharacterAtPosition instead")] public int GetCharacterIndex(Vector2 localPos) { return GetCharacterIndexAtPosition(localPos, precise: false); } public int GetCharacterIndexAtPositionRangeSpecification(Vector3 worldPos, List rangeList) { if (isValid) { Vector2 pos = base.cachedTransform.InverseTransformPoint(worldPos); string value = processedText; if (string.IsNullOrEmpty(value)) { return 0; } UpdateNGUIText(); NGUIText.PrintApproximateCharacterPositions(value, mTempVerts, mTempIndices); if (mTempVerts.size > 0) { ApplyOffset(mTempVerts, 0); int nearCharacterIndex = NGUIText.GetNearCharacterIndex(mTempVerts, mTempIndices, pos, rangeList); mTempVerts.Clear(); mTempIndices.Clear(); NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; return nearCharacterIndex; } NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; } return 0; } public int GetCharacterIndexAtPosition(Vector3 worldPos, bool precise) { Vector2 localPos = base.cachedTransform.InverseTransformPoint(worldPos); return GetCharacterIndexAtPosition(localPos, precise); } public int GetCharacterIndexAtPosition(Vector2 localPos, bool precise) { if (isValid) { string value = processedText; if (string.IsNullOrEmpty(value)) { return 0; } UpdateNGUIText(); if (precise) { NGUIText.PrintExactCharacterPositions(value, mTempVerts, mTempIndices); } else { NGUIText.PrintApproximateCharacterPositions(value, mTempVerts, mTempIndices); } if (mTempVerts.size > 0) { ApplyOffset(mTempVerts, 0); int result = (precise ? NGUIText.GetExactCharacterIndex(mTempVerts, mTempIndices, localPos) : NGUIText.GetApproximateCharacterIndex(mTempVerts, mTempIndices, localPos)); mTempVerts.Clear(); mTempIndices.Clear(); NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; return result; } NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; } return 0; } public string GetWordAtPosition(Vector3 worldPos) { int characterIndexAtPosition = GetCharacterIndexAtPosition(worldPos, precise: true); return GetWordAtCharacterIndex(characterIndexAtPosition); } public string GetWordAtPosition(Vector2 localPos) { int characterIndexAtPosition = GetCharacterIndexAtPosition(localPos, precise: true); return GetWordAtCharacterIndex(characterIndexAtPosition); } public string GetWordAtCharacterIndex(int characterIndex) { if (characterIndex != -1 && characterIndex < mText.Length) { int num = mText.LastIndexOfAny(new char[2] { ' ', '\n' }, characterIndex) + 1; int num2 = mText.IndexOfAny(new char[4] { ' ', '\n', ',', '.' }, characterIndex); if (num2 == -1) { num2 = mText.Length; } if (num != num2) { int num3 = num2 - num; if (num3 > 0) { return NGUIText.StripSymbols(mText.Substring(num, num3)); } } } return null; } public string GetUrlAtPosition(Vector3 worldPos) { return GetUrlAtCharacterIndex(GetCharacterIndexAtPosition(worldPos, precise: true)); } public string GetUrlAtPosition(Vector2 localPos) { return GetUrlAtCharacterIndex(GetCharacterIndexAtPosition(localPos, precise: true)); } public string GetUrlAtCharacterIndex(int characterIndex) { if (characterIndex != -1 && characterIndex < mText.Length - 6) { int num = ((mText[characterIndex] != '[' || mText[characterIndex + 1] != 'u' || mText[characterIndex + 2] != 'r' || mText[characterIndex + 3] != 'l' || mText[characterIndex + 4] != '=') ? mText.LastIndexOf("[url=", characterIndex) : characterIndex); if (num == -1) { return null; } num += 5; int num2 = mText.IndexOf("]", num); if (num2 == -1) { return null; } int num3 = mText.IndexOf("[/url]", num2); if (num3 == -1 || characterIndex <= num3) { return mText.Substring(num, num2 - num); } } return null; } public int GetCharacterIndex(int currentIndex, KeyCode key) { if (isValid) { string text = processedText; if (string.IsNullOrEmpty(text)) { return 0; } int num = defaultFontSize; UpdateNGUIText(); NGUIText.PrintApproximateCharacterPositions(text, mTempVerts, mTempIndices); if (mTempVerts.size > 0) { ApplyOffset(mTempVerts, 0); for (int i = 0; i < mTempIndices.size; i++) { if (mTempIndices[i] == currentIndex) { Vector2 pos = mTempVerts[i]; switch (key) { case KeyCode.UpArrow: pos.y += (float)num + effectiveSpacingY; break; case KeyCode.DownArrow: pos.y -= (float)num + effectiveSpacingY; break; case KeyCode.Home: pos.x -= 1000f; break; case KeyCode.End: pos.x += 1000f; break; } int approximateCharacterIndex = NGUIText.GetApproximateCharacterIndex(mTempVerts, mTempIndices, pos); if (approximateCharacterIndex == currentIndex) { break; } mTempVerts.Clear(); mTempIndices.Clear(); return approximateCharacterIndex; } } mTempVerts.Clear(); mTempIndices.Clear(); } NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; switch (key) { case KeyCode.UpArrow: case KeyCode.Home: return 0; case KeyCode.DownArrow: case KeyCode.End: return text.Length; } } return currentIndex; } public void PrintOverlay(int start, int end, UIGeometry caret, UIGeometry highlight, Color caretColor, Color highlightColor) { caret?.Clear(); highlight?.Clear(); if (!isValid) { return; } string text = processedText; UpdateNGUIText(); int size = caret.verts.size; Vector2 item = new Vector2(0.5f, 0.5f); float num = finalAlpha; if (highlight != null && start != end) { int size2 = highlight.verts.size; NGUIText.PrintCaretAndSelection(text, start, end, caret.verts, highlight.verts); if (highlight.verts.size > size2) { ApplyOffset(highlight.verts, size2); Color32 item2 = new Color(highlightColor.r, highlightColor.g, highlightColor.b, highlightColor.a * num); for (int i = size2; i < highlight.verts.size; i++) { highlight.uvs.Add(item); highlight.cols.Add(item2); } } } else { NGUIText.PrintCaretAndSelection(text, start, end, caret.verts, null); } ApplyOffset(caret.verts, size); Color32 item3 = new Color(caretColor.r, caretColor.g, caretColor.b, caretColor.a * num); for (int j = size; j < caret.verts.size; j++) { caret.uvs.Add(item); caret.cols.Add(item3); } NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; } public override void OnFill(BetterList verts, BetterList uvs, BetterList cols) { if (!isValid) { return; } int num = verts.size; Color color = base.color; color.a = finalAlpha; if (mFont != null && mFont.premultipliedAlphaShader) { color = NGUITools.ApplyPMA(color); } if (QualitySettings.activeColorSpace == ColorSpace.Linear) { color.r = Mathf.GammaToLinearSpace(color.r); color.g = Mathf.GammaToLinearSpace(color.g); color.b = Mathf.GammaToLinearSpace(color.b); color.a = Mathf.GammaToLinearSpace(color.a); } string obj = processedText; int size = verts.size; UpdateNGUIText(); NGUIText.tint = color; RubyText.PrintWithRuby(obj, verts, uvs, cols, this); NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; Vector2 vector = ApplyOffset(verts, size); if (mFont != null && mFont.packedFontShader) { return; } if (effectStyle != Effect.None) { int size2 = verts.size; vector.x = mEffectDistance.x; vector.y = mEffectDistance.y; ApplyShadow(verts, uvs, cols, num, size2, vector.x, 0f - vector.y); if (effectStyle == Effect.Outline || effectStyle == Effect.Outline8) { num = size2; size2 = verts.size; ApplyShadow(verts, uvs, cols, num, size2, 0f - vector.x, vector.y); num = size2; size2 = verts.size; ApplyShadow(verts, uvs, cols, num, size2, vector.x, vector.y); num = size2; size2 = verts.size; ApplyShadow(verts, uvs, cols, num, size2, 0f - vector.x, 0f - vector.y); if (effectStyle == Effect.Outline8) { num = size2; size2 = verts.size; ApplyShadow(verts, uvs, cols, num, size2, 0f - vector.x, 0f); num = size2; size2 = verts.size; ApplyShadow(verts, uvs, cols, num, size2, vector.x, 0f); num = size2; size2 = verts.size; ApplyShadow(verts, uvs, cols, num, size2, 0f, vector.y); num = size2; size2 = verts.size; ApplyShadow(verts, uvs, cols, num, size2, 0f, 0f - vector.y); } } } if (onPostFill != null) { onPostFill(this, num, verts, uvs, cols); } } public Vector2 ApplyOffset(BetterList verts, int start) { Vector2 vector = base.pivotOffset; float f = Mathf.Lerp(0f, -mWidth, vector.x); float f2 = Mathf.Lerp(mHeight, 0f, vector.y) + Mathf.Lerp(mCalculatedSize.y - (float)mHeight, 0f, vector.y); f = Mathf.Round(f); f2 = Mathf.Round(f2); for (int i = start; i < verts.size; i++) { verts.buffer[i].x += f; verts.buffer[i].y += f2; } return new Vector2(f, f2); } public void ApplyShadow(BetterList verts, BetterList uvs, BetterList cols, int start, int end, float x, float y) { Color color = mEffectColor; color.a *= finalAlpha; Color32 color2 = ((bitmapFont != null && bitmapFont.premultipliedAlphaShader) ? NGUITools.ApplyPMA(color) : color); for (int i = start; i < end; i++) { verts.Add(verts.buffer[i]); uvs.Add(uvs.buffer[i]); cols.Add(cols.buffer[i]); Vector3 vector = verts.buffer[i]; vector.x += x; vector.y += y; verts.buffer[i] = vector; Color32 color3 = cols.buffer[i]; if (color3.a == byte.MaxValue) { cols.buffer[i] = color2; continue; } Color color4 = color; color4.a = (float)(int)color3.a / 255f * color.a; cols.buffer[i] = ((bitmapFont != null && bitmapFont.premultipliedAlphaShader) ? NGUITools.ApplyPMA(color4) : color4); } } public int CalculateOffsetToFit(string text) { UpdateNGUIText(); NGUIText.encoding = false; NGUIText.symbolStyle = NGUIText.SymbolStyle.None; int result = NGUIText.CalculateOffsetToFit(text); NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; return result; } public void SetCurrentProgress() { if (UIProgressBar.current != null) { text = UIProgressBar.current.value.ToString("F"); } } public void SetCurrentPercent() { if (UIProgressBar.current != null) { text = Mathf.RoundToInt(UIProgressBar.current.value * 100f) + "%"; } } public void SetCurrentSelection() { if (UIPopupList.current != null) { text = (UIPopupList.current.isLocalized ? Localization.Get(UIPopupList.current.value) : UIPopupList.current.value); } } public bool Wrap(string text, out string final) { return Wrap(text, out final, 1000000); } public bool Wrap(string text, out string final, int height) { UpdateNGUIText(); NGUIText.rectHeight = height; NGUIText.regionHeight = height; bool result = NGUIText.WrapText(text, out final); NGUIText.bitmapFont = null; NGUIText.dynamicFont = null; return result; } public void UpdateNGUIText() { UnityEngine.Font font = trueTypeFont; bool flag = font != null; NGUIText.fontSize = mFinalFontSize; NGUIText.fontStyle = mFontStyle; NGUIText.rectWidth = mWidth; NGUIText.rectHeight = mHeight; NGUIText.regionWidth = Mathf.RoundToInt((float)mWidth * (mDrawRegion.z - mDrawRegion.x)); NGUIText.regionHeight = Mathf.RoundToInt((float)mHeight * (mDrawRegion.w - mDrawRegion.y)); NGUIText.gradient = mApplyGradient && (mFont == null || !mFont.packedFontShader); NGUIText.gradientTop = mGradientTop; NGUIText.gradientBottom = mGradientBottom; NGUIText.encoding = mEncoding; NGUIText.premultiply = mPremultiply; NGUIText.symbolStyle = mSymbols; NGUIText.maxLines = mMaxLineCount; NGUIText.spacingX = effectiveSpacingX; NGUIText.spacingY = effectiveSpacingY; NGUIText.fontScale = (flag ? mScale : ((float)mFontSize / (float)mFont.defaultSize * mScale)); if (mFont != null) { NGUIText.bitmapFont = mFont; while (true) { UIFont replacement = NGUIText.bitmapFont.replacement; if (replacement == null) { break; } NGUIText.bitmapFont = replacement; } if (NGUIText.bitmapFont.isDynamic) { NGUIText.dynamicFont = NGUIText.bitmapFont.dynamicFont; NGUIText.bitmapFont = null; } else { NGUIText.dynamicFont = null; } } else { NGUIText.dynamicFont = font; NGUIText.bitmapFont = null; } if (flag && keepCrisp) { UIRoot uIRoot = base.root; if (uIRoot != null) { NGUIText.pixelDensity = ((uIRoot != null) ? uIRoot.pixelSizeAdjustment : 1f); } } else { NGUIText.pixelDensity = 1f; } if (mDensity != NGUIText.pixelDensity) { ProcessText(legacyMode: false, full: false); NGUIText.rectWidth = mWidth; NGUIText.rectHeight = mHeight; NGUIText.regionWidth = Mathf.RoundToInt((float)mWidth * (mDrawRegion.z - mDrawRegion.x)); NGUIText.regionHeight = Mathf.RoundToInt((float)mHeight * (mDrawRegion.w - mDrawRegion.y)); } if (alignment == NGUIText.Alignment.Automatic) { switch (base.pivot) { case Pivot.TopLeft: case Pivot.Left: case Pivot.BottomLeft: NGUIText.alignment = NGUIText.Alignment.Left; break; case Pivot.TopRight: case Pivot.Right: case Pivot.BottomRight: NGUIText.alignment = NGUIText.Alignment.Right; break; default: NGUIText.alignment = NGUIText.Alignment.Center; break; } } else { NGUIText.alignment = alignment; } NGUIText.Update(base.rawPivot); } private void OnApplicationPause(bool paused) { if (!paused && mTrueTypeFont != null) { Invalidate(includeChildren: false); } } }