This repository has been archived on 2020-08-22. You can view files and clone it, but cannot push or open issues or pull requests.
flutter-unity-view-widget/example/Unity/Demo App/Library/PackageCache/com.unity.textmeshpro@1.3.0/Scripts/Runtime/TMP_XmlTagStack.cs

254 lines
6.6 KiB
C#

namespace TMPro
{
/// <summary>
/// Structure used to track basic XML tags which are binary (on / off)
/// </summary>
public struct TMP_BasicXmlTagStack
{
public byte bold;
public byte italic;
public byte underline;
public byte strikethrough;
public byte highlight;
public byte superscript;
public byte subscript;
public byte uppercase;
public byte lowercase;
public byte smallcaps;
/// <summary>
/// Clear the basic XML tag stack.
/// </summary>
public void Clear()
{
bold = 0;
italic = 0;
underline = 0;
strikethrough = 0;
highlight = 0;
superscript = 0;
subscript = 0;
uppercase = 0;
lowercase = 0;
smallcaps = 0;
}
public byte Add(FontStyles style)
{
switch (style)
{
case FontStyles.Bold:
bold += 1;
return bold;
case FontStyles.Italic:
italic += 1;
return italic;
case FontStyles.Underline:
underline += 1;
return underline;
case FontStyles.Strikethrough:
strikethrough += 1;
return strikethrough;
case FontStyles.Superscript:
superscript += 1;
return superscript;
case FontStyles.Subscript:
subscript += 1;
return subscript;
case FontStyles.Highlight:
highlight += 1;
return highlight;
}
return 0;
}
public byte Remove(FontStyles style)
{
switch (style)
{
case FontStyles.Bold:
if (bold > 1)
bold -= 1;
else
bold = 0;
return bold;
case FontStyles.Italic:
if (italic > 1)
italic -= 1;
else
italic = 0;
return italic;
case FontStyles.Underline:
if (underline > 1)
underline -= 1;
else
underline = 0;
return underline;
case FontStyles.Strikethrough:
if (strikethrough > 1)
strikethrough -= 1;
else
strikethrough = 0;
return strikethrough;
case FontStyles.Highlight:
if (highlight > 1)
highlight -= 1;
else
highlight = 0;
return highlight;
case FontStyles.Superscript:
if (superscript > 1)
superscript -= 1;
else
superscript = 0;
return superscript;
case FontStyles.Subscript:
if (subscript > 1)
subscript -= 1;
else
subscript = 0;
return subscript;
}
return 0;
}
}
/// <summary>
/// Structure used to track XML tags of various types.
/// </summary>
/// <typeparam name="T"></typeparam>
public struct TMP_XmlTagStack<T>
{
public T[] itemStack;
public int index;
private int m_capacity;
private T m_defaultItem;
private const int k_defaultCapacity = 4;
//static readonly T[] m_emptyStack = new T[0];
/// <summary>
/// Constructor to create a new item stack.
/// </summary>
/// <param name="tagStack"></param>
public TMP_XmlTagStack(T[] tagStack)
{
itemStack = tagStack;
m_capacity = tagStack.Length;
index = 0;
m_defaultItem = default(T);
}
/// <summary>
/// Function to clear and reset stack to first item.
/// </summary>
public void Clear()
{
index = 0;
}
/// <summary>
/// Function to set the first item on the stack and reset index.
/// </summary>
/// <param name="item"></param>
public void SetDefault(T item)
{
itemStack[0] = item;
index = 1;
}
/// <summary>
/// Function to add a new item to the stack.
/// </summary>
/// <param name="item"></param>
public void Add(T item)
{
if (index < itemStack.Length)
{
itemStack[index] = item;
index += 1;
}
}
/// <summary>
/// Function to retrieve an item from the stack.
/// </summary>
/// <returns></returns>
public T Remove()
{
index -= 1;
if (index <= 0)
{
index = 1;
return itemStack[0];
}
return itemStack[index - 1];
}
public void Push(T item)
{
if (index == m_capacity)
{
m_capacity *= 2;
if (m_capacity == 0)
m_capacity = k_defaultCapacity;
System.Array.Resize(ref itemStack, m_capacity);
}
itemStack[index] = item;
index += 1;
}
public T Pop()
{
if (index == 0)
return default(T);
index -= 1;
T item = itemStack[index];
itemStack[index] = m_defaultItem;
return item;
}
/// <summary>
/// Function to retrieve the current item from the stack.
/// </summary>
/// <returns>itemStack <T></returns>
public T CurrentItem()
{
if (index > 0)
return itemStack[index - 1];
return itemStack[0];
}
/// <summary>
/// Function to retrieve the previous item without affecting the stack.
/// </summary>
/// <returns></returns>
public T PreviousItem()
{
if (index > 1)
return itemStack[index - 2];
return itemStack[0];
}
}
}