From 0e135118fd0edd3ef613cb28cb573d12916dca98 Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 21 Jun 2018 00:18:13 +0200 Subject: [PATCH] Improved GenImageFontAtlas() --- release/include/raylib.h | 2 +- release/libs/win32/mingw32/libraylib.a | Bin 1116752 -> 1116822 bytes src/raylib.h | 2 +- src/text.c | 22 +++++++--------------- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/release/include/raylib.h b/release/include/raylib.h index 49434d529..9a6e117fd 100644 --- a/release/include/raylib.h +++ b/release/include/raylib.h @@ -965,7 +965,7 @@ RLAPI void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle dest RLAPI Font GetDefaultFont(void); // Get the default Font RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) RLAPI CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int charsCount, bool sdf); // Load font data for further use -RLAPI Image GenImageFontAtlas(CharInfo *chars, int fontSize, int charsCount, int packing); // Generate image font atlas using chars info +RLAPI Image GenImageFontAtlas(CharInfo *chars, int fontSize, int charsCount, int padding, int packMethod); // Generate image font atlas using chars info RLAPI void UnloadFont(Font font); // Unload Font from GPU memory (VRAM) // Text drawing functions diff --git a/release/libs/win32/mingw32/libraylib.a b/release/libs/win32/mingw32/libraylib.a index 3425c71aed98130df9eb86722b3fbe3d7b4f72b3..0bf3c42129d5bf6a3700448c84bd205fcdf150d6 100644 GIT binary patch delta 5415 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 delta 5313 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 Xg|HzKX4CUH1!piCK+=I6mtX||f<28& diff --git a/src/raylib.h b/src/raylib.h index 49434d529..9a6e117fd 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -965,7 +965,7 @@ RLAPI void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle dest RLAPI Font GetDefaultFont(void); // Get the default Font RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) RLAPI CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int charsCount, bool sdf); // Load font data for further use -RLAPI Image GenImageFontAtlas(CharInfo *chars, int fontSize, int charsCount, int packing); // Generate image font atlas using chars info +RLAPI Image GenImageFontAtlas(CharInfo *chars, int fontSize, int charsCount, int padding, int packMethod); // Generate image font atlas using chars info RLAPI void UnloadFont(Font font); // Unload Font from GPU memory (VRAM) // Text drawing functions diff --git a/src/text.c b/src/text.c index 3c3ff7513..5e02a4712 100644 --- a/src/text.c +++ b/src/text.c @@ -284,7 +284,7 @@ Font LoadFont(const char *fileName) font.baseSize = DEFAULT_TTF_FONTSIZE; font.charsCount = DEFAULT_TTF_NUMCHARS; font.chars = LoadFontData(fileName, font.baseSize, NULL, font.charsCount, false); - Image atlas = GenImageFontAtlas(font.chars, font.charsCount, font.baseSize, 0); + Image atlas = GenImageFontAtlas(font.chars, font.charsCount, font.baseSize, 4, 0); font.texture = LoadTextureFromImage(atlas); UnloadImage(atlas); } @@ -398,20 +398,12 @@ CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int c // Generate image font atlas using chars info // NOTE: Packing method: 0-Default, 1-Skyline -Image GenImageFontAtlas(CharInfo *chars, int charsCount, int fontSize, int packing) +Image GenImageFontAtlas(CharInfo *chars, int charsCount, int fontSize, int padding, int packMethod) { Image atlas = { 0 }; - int padding = 10; - - // Calculate atlas texture size based on fontSize - // NOTE: Font texture size is predicted (being as much conservative as possible) - // Predictive method consist of supposing same number of chars by line-column (sqrtf) - // and a maximum character width of 3/4 of fontSize... it worked ok with all my tests... - //float guessSize = ceilf((float)fontSize*3/4)*ceilf(sqrtf((float)charsCount)); - //int textureSize = (int)powf(2, ceilf(logf((float)guessSize)/logf(2))); // Calculate next POT - - // TODO: TEXTURE SIZE NOT GOOD ENOUGH! -> Calculate chars area -> guess texture size? + // Calculate texture size based on required pixel area + // NOTE: Texture is forced to be squared and POT float requiredArea = 0; for (int i = 0; i < charsCount; i++) requiredArea += ((chars[i].rec.width + 2*padding)*(chars[i].rec.height + 2*padding)); float guessSize = sqrtf(requiredArea)*1.25f; @@ -423,7 +415,7 @@ Image GenImageFontAtlas(CharInfo *chars, int charsCount, int fontSize, int packi atlas.format = UNCOMPRESSED_GRAYSCALE; atlas.mipmaps = 1; - if (packing == 0) // Use basic packing algorythm + if (packMethod == 0) // Use basic packing algorythm { int offsetX = padding; int offsetY = padding; @@ -455,7 +447,7 @@ Image GenImageFontAtlas(CharInfo *chars, int charsCount, int fontSize, int packi } } } - else if (packing == 1) // Use Skyline rect packing algorythm + else if (packMethod == 1) // Use Skyline rect packing algorythm (stb_pack_rect) { stbrp_context *context = (stbrp_context *)malloc(sizeof(*context)); stbrp_node *nodes = (stbrp_node *)malloc(charsCount*sizeof(*nodes)); @@ -498,7 +490,7 @@ Image GenImageFontAtlas(CharInfo *chars, int charsCount, int fontSize, int packi } // Convert image data from GRAYSCALE to GRAY_ALPHA - //ImageAlphaMask(&atlas, atlas); // WARNING: Not working in this case, requires manual operation + // WARNING: ImageAlphaMask(&atlas, atlas) does not work in this case, requires manual operation unsigned char *dataGrayAlpha = (unsigned char *)malloc(textureSize*textureSize*sizeof(unsigned char)*2); // Two channels for (int i = 0, k = 0; i < atlas.width*atlas.height; i++, k += 2)