implement dynamic font atlas resizing in GenImageFontAtlas()
This commit is contained in:
parent
e9fcc8a391
commit
6280b0a6ce
40
src/rtext.c
40
src/rtext.c
|
|
@ -690,6 +690,10 @@ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphC
|
||||||
float guessSize = sqrtf(requiredArea)*1.4f;
|
float guessSize = sqrtf(requiredArea)*1.4f;
|
||||||
int imageSize = (int)powf(2, ceilf(logf((float)guessSize)/logf(2))); // Calculate next POT
|
int imageSize = (int)powf(2, ceilf(logf((float)guessSize)/logf(2))); // Calculate next POT
|
||||||
|
|
||||||
|
int currentRepeatCount = 0;
|
||||||
|
const int maxRepeatCount = 2;
|
||||||
|
bool undersizedAtlasFlag = false;
|
||||||
|
|
||||||
atlas.width = imageSize; // Atlas bitmap width
|
atlas.width = imageSize; // Atlas bitmap width
|
||||||
atlas.height = imageSize; // Atlas bitmap height
|
atlas.height = imageSize; // Atlas bitmap height
|
||||||
atlas.data = (unsigned char *)RL_CALLOC(1, atlas.width*atlas.height); // Create a bitmap to store characters (8 bpp)
|
atlas.data = (unsigned char *)RL_CALLOC(1, atlas.width*atlas.height); // Create a bitmap to store characters (8 bpp)
|
||||||
|
|
@ -701,6 +705,25 @@ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphC
|
||||||
|
|
||||||
if (packMethod == 0) // Use basic packing algorithm
|
if (packMethod == 0) // Use basic packing algorithm
|
||||||
{
|
{
|
||||||
|
// When the guesstimate of the atlas size is determined to be undersized,
|
||||||
|
// repeat the atlas generation process with an atlas data texture of a size
|
||||||
|
// that is double the previous size, up to a limit of `maxRepeatCount` times
|
||||||
|
while (currentRepeatCount < maxRepeatCount)
|
||||||
|
{
|
||||||
|
if (currentRepeatCount > 0)
|
||||||
|
{
|
||||||
|
// Recreate the atlas for the new, doubled size when all glyphs don't fit on the previous-sized atlas
|
||||||
|
// (but not on the first pass)
|
||||||
|
RL_FREE(atlas.data);
|
||||||
|
|
||||||
|
atlas.width = atlas.width*2; // Atlas bitmap width
|
||||||
|
atlas.height = atlas.height*2; // Atlas bitmap height
|
||||||
|
atlas.data = (unsigned char *)RL_CALLOC(1, atlas.width*atlas.height); // Create a bitmap to store characters (8 bpp)
|
||||||
|
TRACELOG(LOG_INFO, "FONT: Font atlas undersized, expanding atlas to %ix%i", atlas.width, atlas.height);
|
||||||
|
|
||||||
|
undersizedAtlasFlag = false;
|
||||||
|
}
|
||||||
|
|
||||||
int offsetX = padding;
|
int offsetX = padding;
|
||||||
int offsetY = padding;
|
int offsetY = padding;
|
||||||
|
|
||||||
|
|
@ -736,9 +759,20 @@ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphC
|
||||||
|
|
||||||
if (offsetY > (atlas.height - fontSize - padding))
|
if (offsetY > (atlas.height - fontSize - padding))
|
||||||
{
|
{
|
||||||
|
// The current atlas is too small to hold all glyphs, so move to the next atlas size
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
currentRepeatCount++;
|
||||||
|
undersizedAtlasFlag = true;
|
||||||
|
|
||||||
|
// If the process repeats more times than the defined limit, abort and log the unpackaged characters
|
||||||
for(int j = i + 1; j < glyphCount; j++)
|
for(int j = i + 1; j < glyphCount; j++)
|
||||||
|
{
|
||||||
|
if (currentRepeatCount > maxRepeatCount)
|
||||||
{
|
{
|
||||||
TRACELOG(LOG_WARNING, "FONT: Failed to package character (%i)", j);
|
TRACELOG(LOG_WARNING, "FONT: Failed to package character (%i)", j);
|
||||||
|
}
|
||||||
// make sure remaining recs contain valid data
|
// make sure remaining recs contain valid data
|
||||||
recs[j].x = 0;
|
recs[j].x = 0;
|
||||||
recs[j].y = 0;
|
recs[j].y = 0;
|
||||||
|
|
@ -749,6 +783,12 @@ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// After any pass, if all the glyphs fit, immediately end the packing process
|
||||||
|
if (!undersizedAtlasFlag)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (packMethod == 1) // Use Skyline rect packing algorithm (stb_pack_rect)
|
else if (packMethod == 1) // Use Skyline rect packing algorithm (stb_pack_rect)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user