using System; using System.Linq; using System.Collections.Generic; using UnityEngine; using UnityEngine.TextCore.LowLevel; namespace TMPro { /// /// Table that contains the various font features available for the given font asset. /// [Serializable] public class TMP_FontFeatureTable { /// /// List that contains the glyph multiple substitution records. /// public List multipleSubstitutionRecords { get { return m_MultipleSubstitutionRecords; } set { m_MultipleSubstitutionRecords = value; } } /// /// List that contains the glyph ligature records. /// public List ligatureRecords { get { return m_LigatureSubstitutionRecords; } set { m_LigatureSubstitutionRecords = value; } } /// /// List that contains the glyph pair adjustment records. /// public List glyphPairAdjustmentRecords { get { return m_GlyphPairAdjustmentRecords; } set { m_GlyphPairAdjustmentRecords = value; } } /// /// /// public List MarkToBaseAdjustmentRecords { get { return m_MarkToBaseAdjustmentRecords; } set { m_MarkToBaseAdjustmentRecords = value; } } /// /// /// public List MarkToMarkAdjustmentRecords { get { return m_MarkToMarkAdjustmentRecords; } set { m_MarkToMarkAdjustmentRecords = value; } } // ============================================= // Private backing fields for public properties. // ============================================= [SerializeField] internal List m_MultipleSubstitutionRecords; [SerializeField] internal List m_LigatureSubstitutionRecords; [SerializeField] internal List m_GlyphPairAdjustmentRecords; [SerializeField] internal List m_MarkToBaseAdjustmentRecords; [SerializeField] internal List m_MarkToMarkAdjustmentRecords; // ============================================= // Lookup data structures. // ============================================= internal Dictionary> m_LigatureSubstitutionRecordLookup; internal Dictionary m_GlyphPairAdjustmentRecordLookup; internal Dictionary m_MarkToBaseAdjustmentRecordLookup; internal Dictionary m_MarkToMarkAdjustmentRecordLookup; // ============================================= // Constructor(s) // ============================================= public TMP_FontFeatureTable() { m_LigatureSubstitutionRecords = new List(); m_LigatureSubstitutionRecordLookup = new Dictionary>(); m_GlyphPairAdjustmentRecords = new List(); m_GlyphPairAdjustmentRecordLookup = new Dictionary(); m_MarkToBaseAdjustmentRecords = new List(); m_MarkToBaseAdjustmentRecordLookup = new Dictionary(); m_MarkToMarkAdjustmentRecords = new List(); m_MarkToMarkAdjustmentRecordLookup = new Dictionary(); } // ============================================= // Utility Functions // ============================================= /// /// Sort the glyph pair adjustment records by glyph index. /// public void SortGlyphPairAdjustmentRecords() { // Sort List of Kerning Info if (m_GlyphPairAdjustmentRecords.Count > 0) m_GlyphPairAdjustmentRecords = m_GlyphPairAdjustmentRecords.OrderBy(s => s.firstAdjustmentRecord.glyphIndex).ThenBy(s => s.secondAdjustmentRecord.glyphIndex).ToList(); } /// /// Sort the Mark-to-Base Adjustment Table records. /// public void SortMarkToBaseAdjustmentRecords() { // Sort List of Kerning Info if (m_MarkToBaseAdjustmentRecords.Count > 0) m_MarkToBaseAdjustmentRecords = m_MarkToBaseAdjustmentRecords.OrderBy(s => s.baseGlyphID).ThenBy(s => s.markGlyphID).ToList(); } /// /// Sort the Mark-to-Mark Adjustment Table records. /// public void SortMarkToMarkAdjustmentRecords() { // Sort List of Kerning Info if (m_MarkToMarkAdjustmentRecords.Count > 0) m_MarkToMarkAdjustmentRecords = m_MarkToMarkAdjustmentRecords.OrderBy(s => s.baseMarkGlyphID).ThenBy(s => s.combiningMarkGlyphID).ToList(); } } }