You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

601 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
// Token: 0x02000150 RID: 336
public class UIFont : MonoBehaviour
{
// Token: 0x1700011F RID: 287
// (get) Token: 0x06000952 RID: 2386 RVA: 0x00028A90 File Offset: 0x00026C90
// (set) Token: 0x06000953 RID: 2387 RVA: 0x00028A98 File Offset: 0x00026C98
public BMFont Font
{
get
{
return this.mFont;
}
set
{
this.mFont = value;
}
}
// Token: 0x17000120 RID: 288
// (get) Token: 0x06000954 RID: 2388 RVA: 0x00028AA4 File Offset: 0x00026CA4
public int Width
{
get
{
return (this.mFont == null) ? 1 : this.mFont.texWidth;
}
}
// Token: 0x17000121 RID: 289
// (get) Token: 0x06000955 RID: 2389 RVA: 0x00028AC4 File Offset: 0x00026CC4
public int Height
{
get
{
return (this.mFont == null) ? 1 : this.mFont.texHeight;
}
}
// Token: 0x17000122 RID: 290
// (get) Token: 0x06000956 RID: 2390 RVA: 0x00028AE4 File Offset: 0x00026CE4
// (set) Token: 0x06000957 RID: 2391 RVA: 0x00028AEC File Offset: 0x00026CEC
public Material material
{
get
{
return this.mMat;
}
set
{
this.mMat = value;
}
}
// Token: 0x17000123 RID: 291
// (get) Token: 0x06000958 RID: 2392 RVA: 0x00028AF8 File Offset: 0x00026CF8
// (set) Token: 0x06000959 RID: 2393 RVA: 0x00028B50 File Offset: 0x00026D50
public Rect uvRect
{
get
{
if (this.texture != null && this.sprite != null)
{
this.mUVRect.width = (float)this.sprite.w;
this.mUVRect.height = (float)this.sprite.h;
}
return this.mUVRect;
}
set
{
this.mUVRect = value;
}
}
// Token: 0x17000124 RID: 292
// (get) Token: 0x0600095A RID: 2394 RVA: 0x00028B5C File Offset: 0x00026D5C
// (set) Token: 0x0600095B RID: 2395 RVA: 0x00028B64 File Offset: 0x00026D64
public int horizontalSpacing
{
get
{
return this.mSpacingX;
}
set
{
this.mSpacingX = value;
}
}
// Token: 0x17000125 RID: 293
// (get) Token: 0x0600095C RID: 2396 RVA: 0x00028B70 File Offset: 0x00026D70
// (set) Token: 0x0600095D RID: 2397 RVA: 0x00028B78 File Offset: 0x00026D78
public int verticalSpacing
{
get
{
return this.mSpacingY;
}
set
{
this.mSpacingY = value;
}
}
// Token: 0x17000126 RID: 294
// (get) Token: 0x0600095E RID: 2398 RVA: 0x00028B84 File Offset: 0x00026D84
public int size
{
get
{
return this.mFont.charSize;
}
}
// Token: 0x0600095F RID: 2399 RVA: 0x00028B94 File Offset: 0x00026D94
private void Trim()
{
}
// Token: 0x06000960 RID: 2400 RVA: 0x00028B98 File Offset: 0x00026D98
public Vector2 CalculatePrintedSize(string text)
{
Vector2 zero = Vector2.zero;
if (this.mFont != null && this.mFont.isValid && !string.IsNullOrEmpty(text))
{
int length = text.Length;
int num = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
int num5 = this.mFont.charSize + this.mSpacingY;
for (int i = 0; i < length; i++)
{
char c = text[i];
if (c == '\n')
{
if (num2 > num)
{
num = num2;
}
num2 = 0;
num3 += num5;
num4 = 0;
}
else if (c < ' ')
{
num4 = 0;
}
else
{
BMGlyph glyph = this.mFont.GetGlyph((int)c);
if (glyph != null)
{
num2 += this.mSpacingX + ((num4 == 0) ? glyph.advance : (glyph.advance + glyph.GetKerning(num4, true)));
num4 = (int)c;
}
}
}
float num6 = (this.mFont.charSize <= 0) ? 1f : (1f / (float)this.mFont.charSize);
zero.x = num6 * (float)((num2 <= num) ? num : num2);
zero.y = num6 * (float)(num3 + num5);
}
return zero;
}
// Token: 0x06000961 RID: 2401 RVA: 0x00028CEC File Offset: 0x00026EEC
private static void EndLine(ref StringBuilder s)
{
int num = s.Length - 1;
if (num > 0 && s[num] == ' ')
{
s[num] = '\n';
}
else
{
s.Append('\n');
}
}
// Token: 0x06000962 RID: 2402 RVA: 0x00028D34 File Offset: 0x00026F34
public string GetEndOfLineThatFits(string text, float maxWidth)
{
int num = Mathf.RoundToInt(maxWidth * (float)this.size);
if (num < 1)
{
return text;
}
int length = text.Length;
int num2 = num;
BMGlyph bmglyph = null;
int num3 = length;
while (num3 > 0 && num2 > 0)
{
char c = text[--num3];
BMGlyph glyph = this.mFont.GetGlyph((int)c);
int num4 = this.mSpacingX;
if (glyph != null)
{
num4 += glyph.advance + ((bmglyph != null) ? bmglyph.GetKerning((int)c, true) : 0);
bmglyph = glyph;
num2 -= num4;
}
else
{
bmglyph = null;
}
}
if (num2 < 0)
{
num3++;
}
return text.Substring(num3, length - num3);
}
// Token: 0x06000963 RID: 2403 RVA: 0x00028DF8 File Offset: 0x00026FF8
public string WrapText(string text, float maxWidth, int maxLineCount)
{
int num = Mathf.RoundToInt(maxWidth * (float)this.size);
if (num < 1)
{
return text;
}
StringBuilder stringBuilder = new StringBuilder();
int length = text.Length;
int num2 = num;
int num3 = 0;
int num4 = 0;
int i = 0;
bool flag = true;
bool flag2 = maxLineCount != 1;
int num5 = 1;
while (i < length)
{
char c = text[i];
if (c == '\n')
{
if (!flag2 || num5 == maxLineCount)
{
break;
}
num2 = num;
if (num4 < i)
{
stringBuilder.Append(text.Substring(num4, i - num4 + 1));
}
else
{
stringBuilder.Append(c);
}
flag = true;
num5++;
num4 = i + 1;
num3 = 0;
}
else
{
if (c == ' ' && num3 != 32 && num4 < i)
{
stringBuilder.Append(text.Substring(num4, i - num4 + 1));
flag = false;
num4 = i + 1;
num3 = (int)c;
}
BMGlyph glyph = this.mFont.GetGlyph((int)c);
int num6 = this.mSpacingX;
if (glyph != null)
{
num6 += ((num3 == 0) ? glyph.advance : (glyph.advance + glyph.GetKerning(num3, true)));
num2 -= num6;
if (num2 < 0)
{
if (flag || !flag2 || num5 == maxLineCount)
{
stringBuilder.Append(text.Substring(num4, Mathf.Max(0, i - num4)));
if (!flag2 || num5 == maxLineCount)
{
num4 = i;
break;
}
UIFont.EndLine(ref stringBuilder);
flag = true;
num5++;
if (c == ' ')
{
num4 = i + 1;
num2 = num;
}
else
{
num4 = i;
num2 = num - num6;
}
num3 = 0;
}
else
{
while (num4 < length && text[num4] == ' ')
{
num4++;
}
flag = true;
num2 = num;
i = num4 - 1;
num3 = 0;
if (!flag2 || num5 == maxLineCount)
{
break;
}
num5++;
UIFont.EndLine(ref stringBuilder);
}
}
else
{
num3 = (int)c;
}
}
}
i++;
}
if (num4 < i)
{
stringBuilder.Append(text.Substring(num4, i - num4));
}
return stringBuilder.ToString();
}
// Token: 0x06000964 RID: 2404 RVA: 0x00029064 File Offset: 0x00027264
private void Align(List<Vector3> verts, int indexOffset, UIFont.Alignment alignment, int x, int lineWidth)
{
if (alignment != UIFont.Alignment.Left && this.mFont.charSize > 0)
{
float num = (alignment != UIFont.Alignment.Right) ? ((float)(lineWidth - x) * 0.5f) : ((float)(lineWidth - x));
num = (float)Mathf.RoundToInt(num);
if (num < 0f)
{
num = 0f;
}
num /= (float)this.mFont.charSize;
for (int i = indexOffset; i < verts.Count; i++)
{
Vector3 value = verts[i];
value.x += num;
verts[i] = value;
}
}
}
// Token: 0x06000965 RID: 2405 RVA: 0x00029108 File Offset: 0x00027308
public void Print(List<CharObject> text, List<Vector3> verts, List<Vector2> uvs, List<Color32> cols)
{
if (this.mFont != null && text != null)
{
if (!this.mFont.isValid)
{
Debug.LogError("Attempting to print using an invalid font!");
return;
}
Vector3 zero = Vector3.zero;
Vector3 zero2 = Vector3.zero;
Vector2 zero3 = Vector2.zero;
Vector2 zero4 = Vector2.zero;
float num = this.uvRect.width / (float)this.mFont.texWidth;
float num2 = this.mUVRect.height / (float)this.mFont.texHeight;
int count = text.Count;
for (int i = 0; i < count; i++)
{
char code = text[i].code;
Color color = text[i].color;
int x = text[i].X;
int y = text[i].Y;
float scale = text[i].scale;
if (code != '\n')
{
if (code >= ' ')
{
BMGlyph glyph = this.mFont.GetGlyph((int)code);
if (glyph != null)
{
if (code != ' ')
{
zero.x = (float)x + scale * (float)glyph.offsetX;
zero.y = -((float)y + scale * (float)glyph.offsetY);
zero2.x = zero.x + scale * (float)glyph.width;
zero2.y = zero.y - scale * (float)glyph.height;
zero3.x = this.mUVRect.xMin + num * (float)glyph.x;
zero3.y = this.mUVRect.yMax - num2 * (float)glyph.y;
zero4.x = zero3.x + num * (float)glyph.width;
zero4.y = zero3.y - num2 * (float)glyph.height;
if (glyph.channel == 0 || glyph.channel == 15)
{
for (int j = 0; j < 4; j++)
{
cols.Add(color);
}
}
else
{
Color color2 = color;
color2 *= 0.49f;
switch (glyph.channel)
{
case 1:
color2.b += 0.51f;
break;
case 2:
color2.g += 0.51f;
break;
case 4:
color2.r += 0.51f;
break;
case 8:
color2.a += 0.51f;
break;
}
for (int k = 0; k < 4; k++)
{
cols.Add(color2);
}
}
verts.Add(new Vector3(zero2.x, zero.y));
verts.Add(new Vector3(zero2.x, zero2.y));
verts.Add(new Vector3(zero.x, zero2.y));
verts.Add(new Vector3(zero.x, zero.y));
uvs.Add(new Vector2(zero4.x, zero3.y));
uvs.Add(new Vector2(zero4.x, zero4.y));
uvs.Add(new Vector2(zero3.x, zero4.y));
uvs.Add(new Vector2(zero3.x, zero3.y));
}
}
}
}
}
}
}
// Token: 0x06000966 RID: 2406 RVA: 0x000294F0 File Offset: 0x000276F0
public void Print(string text, Color color, List<Vector3> verts, List<Vector2> uvs, List<Color> cols, UIFont.Alignment alignment, int lineWidth, bool premultiply)
{
if (this.mFont != null && text != null)
{
if (!this.mFont.isValid)
{
Debug.LogError("Attempting to print using an invalid font!");
return;
}
this.mColors.Clear();
this.mColors.Add(color);
Vector2 vector = (this.mFont.charSize <= 0) ? Vector2.one : new Vector2(1f / (float)this.mFont.charSize, 1f / (float)this.mFont.charSize);
int count = verts.Count;
int num = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
int num5 = this.mFont.charSize + this.mSpacingY;
Vector3 zero = Vector3.zero;
Vector3 zero2 = Vector3.zero;
Vector2 zero3 = Vector2.zero;
Vector2 zero4 = Vector2.zero;
float num6 = this.uvRect.width / (float)this.mFont.texWidth;
float num7 = this.mUVRect.height / (float)this.mFont.texHeight;
int length = text.Length;
for (int i = 0; i < length; i++)
{
char c = text[i];
if (c == '\n')
{
if (num2 > num)
{
num = num2;
}
if (alignment != UIFont.Alignment.Left)
{
this.Align(verts, count, alignment, num2, lineWidth);
count = verts.Count;
}
num2 = 0;
num3 += num5;
num4 = 0;
}
else if (c < ' ')
{
num4 = 0;
}
else
{
BMGlyph glyph = this.mFont.GetGlyph((int)c);
if (glyph != null)
{
if (num4 != 0)
{
num2 += glyph.GetKerning(num4, true);
}
if (c == ' ')
{
num2 += this.mSpacingX + glyph.advance;
num4 = (int)c;
}
else
{
zero.x = vector.x * (float)(num2 + glyph.offsetX);
zero.y = -vector.y * (float)(num3 + glyph.offsetY);
zero2.x = zero.x + vector.x * (float)glyph.width;
zero2.y = zero.y - vector.y * (float)glyph.height;
zero3.x = this.mUVRect.xMin + num6 * (float)glyph.x;
zero3.y = this.mUVRect.yMax - num7 * (float)glyph.y;
zero4.x = zero3.x + num6 * (float)glyph.width;
zero4.y = zero3.y - num7 * (float)glyph.height;
num2 += this.mSpacingX + glyph.advance;
num4 = (int)c;
if (glyph.channel == 0 || glyph.channel == 15)
{
for (int j = 0; j < 4; j++)
{
cols.Add(color);
}
}
else
{
Color color2 = color;
color2 *= 0.49f;
switch (glyph.channel)
{
case 1:
color2.b += 0.51f;
break;
case 2:
color2.g += 0.51f;
break;
case 4:
color2.r += 0.51f;
break;
case 8:
color2.a += 0.51f;
break;
}
for (int k = 0; k < 4; k++)
{
cols.Add(color2);
}
}
verts.Add(new Vector3(zero2.x, zero.y));
verts.Add(new Vector3(zero2.x, zero2.y));
verts.Add(new Vector3(zero.x, zero2.y));
verts.Add(new Vector3(zero.x, zero.y));
uvs.Add(new Vector2(zero4.x, zero3.y));
uvs.Add(new Vector2(zero4.x, zero4.y));
uvs.Add(new Vector2(zero3.x, zero4.y));
uvs.Add(new Vector2(zero3.x, zero3.y));
}
}
}
}
if (alignment != UIFont.Alignment.Left && count < verts.Count)
{
this.Align(verts, count, alignment, num2, lineWidth);
count = verts.Count;
}
}
}
// Token: 0x040007C2 RID: 1986
private Material mMat;
// Token: 0x040007C3 RID: 1987
private Rect mUVRect = new Rect(0f, 0f, 1f, 1f);
// Token: 0x040007C4 RID: 1988
private BMFont mFont = new BMFont();
// Token: 0x040007C5 RID: 1989
private int mSpacingX;
// Token: 0x040007C6 RID: 1990
private int mSpacingY;
// Token: 0x040007C7 RID: 1991
private List<Color> mColors = new List<Color>();
// Token: 0x040007C8 RID: 1992
public UnityTexture texture;
// Token: 0x040007C9 RID: 1993
public UnitySprite sprite;
// Token: 0x02000151 RID: 337
public enum Alignment
{
// Token: 0x040007CB RID: 1995
Left,
// Token: 0x040007CC RID: 1996
Center,
// Token: 0x040007CD RID: 1997
Right
}
}