diff --git a/src/rtext.c b/src/rtext.c index 9eec0059f..b25938ae6 100644 --- a/src/rtext.c +++ b/src/rtext.c @@ -694,14 +694,17 @@ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphC // NOTE: Rectangles memory is loaded here! Rectangle *recs = (Rectangle *)RL_MALLOC(glyphCount*sizeof(Rectangle)); - // Calculate image size based on required pixel area - // NOTE 1: Image is forced to be squared and POT... very conservative! - // NOTE 2: SDF font characters already contain an internal padding, - // so image size would result bigger than default font type - float requiredArea = 0; - for (int i = 0; i < glyphCount; i++) requiredArea += ((chars[i].image.width + 2*padding)*(fontSize + 2*padding)); - float guessSize = sqrtf(requiredArea)*1.4f; - int imageSize = (int)powf(2, ceilf(logf((float)guessSize)/logf(2))); // Calculate next POT + // Calculate image size based on total glyph width and glyph row count + int totalWidth = 0; + for (int i = 0; i < glyphCount; i++) totalWidth += chars[i].image.width + 2*padding; + int imageSize = 64; // A minimum starting value to avoid unnecessary calculation steps for very small images + int rowCount = 0; + do + { + imageSize *= 2; // Double the size of image (to keep POT) + rowCount = imageSize/(fontSize + 2*padding) + 1; // Calculate new row count for the new image size + } + while (totalWidth > imageSize*rowCount); atlas.width = imageSize; // Atlas bitmap width atlas.height = imageSize; // Atlas bitmap height