Files
SVSimServer/SVSim.BattleEngine/Engine/UILabel.cs
gamer147 0d9d8acae0 feat(battle-engine): M1 auto-copy closure (782 battle-logic files)
Compile-driven bulk-copy loop (tools/engine-port/m1_copy_loop.py) pulled the precise reference closure of the battle-core roots, stopping at the classify god-object/View-VFX-UI boundary. 782 files; no re-explosion (M0 had estimated ~order 1000). Residual frontier = 52 shim-classified + 80 external (Unity/BCL) types to author next.
2026-06-05 16:57:20 -04:00

1942 lines
39 KiB
C#

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<UILabel> mList = new BetterList<UILabel>();
private static Dictionary<UnityEngine.Font, int> mFontUsage = new Dictionary<UnityEngine.Font, int>();
private static bool mTexRebuildAdded = false;
private static BetterList<Vector3> mTempVerts = new BetterList<Vector3>();
private static BetterList<int> mTempIndices = new BetterList<int>();
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<UnityEngine.Font>("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<UIPanel> 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<UIPanel>();
}
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<int[]> 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<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> 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<Vector3> 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<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> 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);
}
}
}