@ -1034,7 +1034,7 @@ void ImDrawData::ScaleClipRects(const ImVec2& scale)
}
//-----------------------------------------------------------------------------
// ImFont Atlas
// ImFont Config
//-----------------------------------------------------------------------------
ImFontConfig : : ImFontConfig ( )
@ -1055,6 +1055,10 @@ ImFontConfig::ImFontConfig()
memset ( Name , 0 , sizeof ( Name ) ) ;
}
//-----------------------------------------------------------------------------
// ImFontAtlas
//-----------------------------------------------------------------------------
ImFontAtlas : : ImFontAtlas ( )
{
TexID = NULL ;
@ -1282,40 +1286,19 @@ bool ImFontAtlas::Build()
TexUvWhitePixel = ImVec2 ( 0 , 0 ) ;
ClearTexData ( ) ;
struct ImFontTempBuildData
{
stbtt_fontinfo FontInfo ;
stbrp_rect * Rects ;
stbtt_pack_range * Ranges ;
int RangesCount ;
} ;
ImFontTempBuildData * tmp_array = ( ImFontTempBuildData * ) ImGui : : MemAlloc ( ( size_t ) ConfigData . Size * sizeof ( ImFontTempBuildData ) ) ;
// Initialize font information early (so we can error without any cleanup) + count glyphs
// Count glyphs/ranges
int total_glyph_count = 0 ;
int total_glyph_range_count = 0 ;
for ( int input_i = 0 ; input_i < ConfigData . Size ; input_i + + )
{
ImFontConfig & cfg = ConfigData [ input_i ] ;
ImFontTempBuildData & tmp = tmp_array [ input_i ] ;
IM_ASSERT ( cfg . DstFont & & ( ! cfg . DstFont - > IsLoaded ( ) | | cfg . DstFont - > ContainerAtlas = = this ) ) ;
const int font_offset = stbtt_GetFontOffsetForIndex ( ( unsigned char * ) cfg . FontData , cfg . FontNo ) ;
IM_ASSERT ( font_offset > = 0 ) ;
if ( ! stbtt_InitFont ( & tmp . FontInfo , ( unsigned char * ) cfg . FontData , font_offset ) )
return false ;
// Count glyphs
if ( ! cfg . GlyphRanges )
cfg . GlyphRanges = GetGlyphRangesDefault ( ) ;
for ( const ImWchar * in_range = cfg . GlyphRanges ; in_range [ 0 ] & & in_range [ 1 ] ; in_range + = 2 )
{
for ( const ImWchar * in_range = cfg . GlyphRanges ; in_range [ 0 ] & & in_range [ 1 ] ; in_range + = 2 , total_glyph_range_count + + )
total_glyph_count + = ( in_range [ 1 ] - in_range [ 0 ] ) + 1 ;
total_glyph_range_count + + ;
}
}
// Start packing. We need a known width for the skyline algorithm. Using a cheap heuristic here to decide of width. User can override TexDesiredWidth and TexGlyphPadding if they wish.
// Start packing. We need a known width for the skyline algorithm. Using a dumb heuristic here to decide of width. User can override TexDesiredWidth and TexGlyphPadding if they wish.
// After packing is done, width shouldn't matter much, but some API/GPU have texture size limitations and increasing width can decrease height.
TexWidth = ( TexDesiredWidth > 0 ) ? TexDesiredWidth : ( total_glyph_count > 4000 ) ? 4096 : ( total_glyph_count > 2000 ) ? 2048 : ( total_glyph_count > 1000 ) ? 1024 : 512 ;
TexHeight = 0 ;
@ -1332,6 +1315,26 @@ bool ImFontAtlas::Build()
if ( extra_rects [ i ] . was_packed )
TexHeight = ImMax ( TexHeight , extra_rects [ i ] . y + extra_rects [ i ] . h ) ;
// Initialize font information (so we can error without any cleanup)
struct ImFontTempBuildData
{
stbtt_fontinfo FontInfo ;
stbrp_rect * Rects ;
stbtt_pack_range * Ranges ;
int RangesCount ;
} ;
ImFontTempBuildData * tmp_array = ( ImFontTempBuildData * ) ImGui : : MemAlloc ( ( size_t ) ConfigData . Size * sizeof ( ImFontTempBuildData ) ) ;
for ( int input_i = 0 ; input_i < ConfigData . Size ; input_i + + )
{
ImFontConfig & cfg = ConfigData [ input_i ] ;
ImFontTempBuildData & tmp = tmp_array [ input_i ] ;
IM_ASSERT ( cfg . DstFont & & ( ! cfg . DstFont - > IsLoaded ( ) | | cfg . DstFont - > ContainerAtlas = = this ) ) ;
const int font_offset = stbtt_GetFontOffsetForIndex ( ( unsigned char * ) cfg . FontData , cfg . FontNo ) ;
IM_ASSERT ( font_offset > = 0 ) ;
if ( ! stbtt_InitFont ( & tmp . FontInfo , ( unsigned char * ) cfg . FontData , font_offset ) )
return false ;
}
// Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0)
int buf_packedchars_n = 0 , buf_rects_n = 0 , buf_ranges_n = 0 ;
stbtt_packedchar * buf_packedchars = ( stbtt_packedchar * ) ImGui : : MemAlloc ( total_glyph_count * sizeof ( stbtt_packedchar ) ) ;
@ -1350,11 +1353,8 @@ bool ImFontAtlas::Build()
// Setup ranges
int glyph_count = 0 ;
int glyph_ranges_count = 0 ;
for ( const ImWchar * in_range = cfg . GlyphRanges ; in_range [ 0 ] & & in_range [ 1 ] ; in_range + = 2 )
{
for ( const ImWchar * in_range = cfg . GlyphRanges ; in_range [ 0 ] & & in_range [ 1 ] ; in_range + = 2 , glyph_ranges_count + + )
glyph_count + = ( in_range [ 1 ] - in_range [ 0 ] ) + 1 ;
glyph_ranges_count + + ;
}
tmp . Ranges = buf_ranges + buf_ranges_n ;
tmp . RangesCount = glyph_ranges_count ;
buf_ranges_n + = glyph_ranges_count ;
@ -1392,7 +1392,7 @@ bool ImFontAtlas::Build()
spc . pixels = TexPixelsAlpha8 ;
spc . height = TexHeight ;
// Second pass: render characters
// Second pass: render font characters
for ( int input_i = 0 ; input_i < ConfigData . Size ; input_i + + )
{
ImFontConfig & cfg = ConfigData [ input_i ] ;