From c819af1d403b422da997d436a929b275c4d6a3ea Mon Sep 17 00:00:00 2001 From: Hanaxar <87268284+hanaxar@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:30:52 +0300 Subject: [PATCH] Calculate exact image size in GenImageFontAtlas Calculate exact image size with a method based on total glyph width and glyph row count Current method seemed a little bit overkill with square root, log and power functions and only approximates image size which can be wonky with some weird fonts like cursive fonts. Proposed method calculates image size directly with a simpler method and results exact image size needed. --- src/rtext.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) 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