/// <summary>
        /// Load a font and register  it in the texture storage.
        /// </summary>
        /// <param name="path">Path to the font file.</param>
        /// <param name="size">Size to render the font at.</param>
        /// <param name="ranges">The character ranges to render to the font atlas.</param>
        /// <param name="fallbackCharacter">Optional fallback character for the font. Defaults to <c>0</c> (no fallback).</param>
        public static TextureFont LoadFont(this ITextureStorage storage, string path, float size, IEnumerable <Range <int> > ranges, int fallbackCharacter = 0)
        {
            FontAtlasHelpers.CreateFont(path, size, ranges, out var glyphMap, out var image);
            var width  = image.Width;
            var height = image.Height;
            var texId  = RegisterImage(storage, image);

            image.Dispose();
            return(new TextureFont(glyphMap.ToUvGlyphMap(width, height), texId, fallbackCharacter));
        }
        /// <summary>
        /// Load a font from a stream and register  it in the texture storage. Includes Unicode latin characters.
        /// </summary>
        /// <param name="storage">The texture storage to register the texture in.</param>
        /// <param name="fontStream">Stream of the font data.</param>
        /// <param name="size">Size to render the font at.</param>
        /// <param name="fallbackCharacter">Optional fallback character for the font. Defaults to <c>0</c> (no fallback).</param>
        public static TextureFont LoadFont(this ITextureStorage storage, Stream fontStream, float size, int fallbackCharacter = 0)
        {
            FontAtlasHelpers.CreateFont(fontStream, size, out var glyphMap, out var image);
            var width  = image.Width;
            var height = image.Height;
            var texId  = RegisterImage(storage, image);

            image.Dispose();
            return(new TextureFont(glyphMap.ToUvGlyphMap(width, height), texId, fallbackCharacter));
        }