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]; } } }