/// <summary>
        /// Internal function returning the text element character for the given unicode value taking into consideration the font style and weight.
        /// Function searches the source font asset, list of font assets assigned as alternative typefaces and list of fallback font assets.
        /// </summary>
        private static TMP_Character GetCharacterFromFontAsset_Internal(uint unicode, TMP_FontAsset sourceFontAsset, bool includeFallbacks, FontStyles fontStyle, FontWeight fontWeight, out bool isAlternativeTypeface, out TMP_FontAsset fontAsset)
        {
            fontAsset             = null;
            isAlternativeTypeface = false;
            TMP_Character characterData = null;

            #region FONT WEIGHT AND FONT STYLE HANDLING
            // Determine if a font weight or style is used. If so check if an alternative typeface is assigned for the given weight and / or style.
            bool isItalic = (fontStyle & FontStyles.Italic) == FontStyles.Italic;

            if (isItalic || fontWeight != FontWeight.Regular)
            {
                // Get reference to the font weight pairs of the given font asset.
                TMP_FontWeightPair[] fontWeights = sourceFontAsset.fontWeightTable;

                int fontWeightIndex = 4;
                switch (fontWeight)
                {
                case FontWeight.Thin:
                    fontWeightIndex = 1;
                    break;

                case FontWeight.ExtraLight:
                    fontWeightIndex = 2;
                    break;

                case FontWeight.Light:
                    fontWeightIndex = 3;
                    break;

                case FontWeight.Regular:
                    fontWeightIndex = 4;
                    break;

                case FontWeight.Medium:
                    fontWeightIndex = 5;
                    break;

                case FontWeight.SemiBold:
                    fontWeightIndex = 6;
                    break;

                case FontWeight.Bold:
                    fontWeightIndex = 7;
                    break;

                case FontWeight.Heavy:
                    fontWeightIndex = 8;
                    break;

                case FontWeight.Black:
                    fontWeightIndex = 9;
                    break;
                }

                fontAsset = isItalic ? fontWeights[fontWeightIndex].italicTypeface : fontWeights[fontWeightIndex].regularTypeface;

                if (fontAsset != null)
                {
                    if (fontAsset.characterLookupTable.TryGetValue(unicode, out characterData))
                    {
                        isAlternativeTypeface = true;

                        return(characterData);
                    }
                    else if (fontAsset.atlasPopulationMode == AtlasPopulationMode.Dynamic)
                    {
                        if (fontAsset.TryAddCharacterInternal(unicode, out characterData))
                        {
                            isAlternativeTypeface = true;

                            return(characterData);
                        }

                        // Check if the source font file contains the requested character.
                        //if (TryGetCharacterFromFontFile(unicode, fontAsset, out characterData))
                        //{
                        //    isAlternativeTypeface = true;

                        //    return characterData;
                        //}

                        // If we find the requested character, we add it to the font asset character table
                        // and return its character data.
                        // We also add this character to the list of characters we will need to add to the font atlas.
                        // We assume the font atlas has room otherwise this font asset should not be marked as dynamic.
                        // Alternatively, we could also add multiple pages of font atlas textures (feature consideration).
                    }

                    // At this point, we were not able to find the requested character in the alternative typeface
                    // so we check the source font asset and its potential fallbacks.
                }
            }
            #endregion

            // Search the source font asset for the requested character.
            if (sourceFontAsset.characterLookupTable.TryGetValue(unicode, out characterData))
            {
                // We were able to locate the requested character in the given font asset.
                fontAsset = sourceFontAsset;

                return(characterData);
            }
            else if (sourceFontAsset.atlasPopulationMode == AtlasPopulationMode.Dynamic)
            {
                if (sourceFontAsset.TryAddCharacterInternal(unicode, out characterData))
                {
                    fontAsset = sourceFontAsset;

                    return(characterData);
                }

                //// Check if the source font file contains the requested character.
                //if (TryGetCharacterFromFontFile(unicode, sourceFontAsset, out characterData))
                //{
                //    fontAsset = sourceFontAsset;

                //    //fontAsset.AddCharacterToRasterList(unicode);

                //    return characterData;
                //}

                // If we find the requested character, we add it to the font asset character table
                // and return its character data.
                // We also add this character to the list of characters we will need to add to the font atlas.
                // We assume the font atlas has room otherwise this font asset should not be marked as dynamic.
                // Alternatively, we could also add multiple pages of font atlas textures (feature consideration)
            }

            // Search fallback font assets if we still don't have a valid character and include fallback is set to true.
            if (characterData == null && includeFallbacks && sourceFontAsset.fallbackFontAssetTable != null)
            {
                // Get reference to the list of fallback font assets.
                List <TMP_FontAsset> fallbackFontAssets = sourceFontAsset.fallbackFontAssetTable;
                int fallbackCount = fallbackFontAssets.Count;

                if (fallbackFontAssets != null && fallbackCount > 0)
                {
                    for (int i = 0; i < fallbackCount && characterData == null; i++)
                    {
                        TMP_FontAsset temp = fallbackFontAssets[i];

                        if (temp == null)
                        {
                            continue;
                        }

                        int id = temp.GetInstanceID();

                        // Skip over the fallback font asset in the event it is null or if already searched.
                        if (k_SearchedFontAssets.Contains(id))
                        {
                            continue;
                        }

                        // Add to list of font assets already searched.
                        k_SearchedFontAssets.Add(id);

                        characterData = GetCharacterFromFontAsset_Internal(unicode, temp, includeFallbacks, fontStyle, fontWeight, out isAlternativeTypeface, out fontAsset);

                        if (characterData != null)
                        {
                            return(characterData);
                        }
                    }
                }
            }

            return(null);
        }