namespace TMPro
{
///
/// Structure used to track basic XML tags which are binary (on / off)
///
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;
///
/// Clear the basic XML tag stack.
///
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;
}
}
///
/// Structure used to track XML tags of various types.
///
///
public struct TMP_XmlTagStack
{
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];
///
/// Constructor to create a new item stack.
///
///
public TMP_XmlTagStack(T[] tagStack)
{
itemStack = tagStack;
m_capacity = tagStack.Length;
index = 0;
m_defaultItem = default(T);
}
///
/// Function to clear and reset stack to first item.
///
public void Clear()
{
index = 0;
}
///
/// Function to set the first item on the stack and reset index.
///
///
public void SetDefault(T item)
{
itemStack[0] = item;
index = 1;
}
///
/// Function to add a new item to the stack.
///
///
public void Add(T item)
{
if (index < itemStack.Length)
{
itemStack[index] = item;
index += 1;
}
}
///
/// Function to retrieve an item from the stack.
///
///
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;
}
///
/// Function to retrieve the current item from the stack.
///
/// itemStack
public T CurrentItem()
{
if (index > 0)
return itemStack[index - 1];
return itemStack[0];
}
///
/// Function to retrieve the previous item without affecting the stack.
///
///
public T PreviousItem()
{
if (index > 1)
return itemStack[index - 2];
return itemStack[0];
}
}
}