Added method to load TTF font from memory, added font loading base method to text module to support this.

This commit is contained in:
Scott Mudge 2020-04-17 12:09:08 -04:00
parent 00b3199859
commit 4c0f359eb2
2 changed files with 49 additions and 8 deletions

View File

@ -1207,6 +1207,7 @@ RLAPI int GetPixelDataSize(int width, int height, int format);
RLAPI Font GetFontDefault(void); // Get the default Font RLAPI Font GetFontDefault(void); // Get the default Font
RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM)
RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int charsCount); // Load font from file with extended parameters RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int charsCount); // Load font from file with extended parameters
RLAPI Font LoadFontFromMemory(const char* data, int fontSize, int* fontChars, int charsCount);
RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style)
RLAPI CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int charsCount, int type); // Load font data for further use RLAPI CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int charsCount, int type); // Load font data for further use
RLAPI Image GenImageFontAtlas(const CharInfo *chars, Rectangle **recs, int charsCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info RLAPI Image GenImageFontAtlas(const CharInfo *chars, Rectangle **recs, int charsCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info

View File

@ -109,6 +109,7 @@ static Font defaultFont = { 0 }; // Default font provided by raylib
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
#if defined(SUPPORT_FILEFORMAT_FNT) #if defined(SUPPORT_FILEFORMAT_FNT)
static Font LoadBMFont(const char *fileName); // Load a BMFont file (AngelCode font file) static Font LoadBMFont(const char *fileName); // Load a BMFont file (AngelCode font file)
static CharInfo* LoadFontDataBase(const char* fileData, int fontSize, int* fontChars, int charsCount, int type);
#endif #endif
#if defined(SUPPORT_DEFAULT_FONT) #if defined(SUPPORT_DEFAULT_FONT)
@ -479,7 +480,7 @@ Font LoadFontFromImage(Image image, Color key, int firstChar)
// Load font data for further use // Load font data for further use
// NOTE: Requires TTF font and can generate SDF data // NOTE: Requires TTF font and can generate SDF data
CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int charsCount, int type) static CharInfo* LoadFontDataBase(const char* fileData, int fontSize, int* fontChars, int charsCount, int type)
{ {
// NOTE: Using some SDF generation default values, // NOTE: Using some SDF generation default values,
// trades off precision with ability to handle *smaller* sizes // trades off precision with ability to handle *smaller* sizes
@ -492,12 +493,6 @@ CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int c
CharInfo *chars = NULL; CharInfo *chars = NULL;
#if defined(SUPPORT_FILEFORMAT_TTF) #if defined(SUPPORT_FILEFORMAT_TTF)
// Load font data (including pixel data) from TTF file
// NOTE: Loaded information should be enough to generate
// font image atlas, using any packaging method
unsigned int dataSize = 0;
unsigned char *fileData = LoadFileData(fileName, &dataSize);
if (fileData != NULL) if (fileData != NULL)
{ {
int genFontChars = false; int genFontChars = false;
@ -585,7 +580,6 @@ CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int c
} }
else TRACELOG(LOG_WARNING, "FONT: Failed to process TTF font data"); else TRACELOG(LOG_WARNING, "FONT: Failed to process TTF font data");
RL_FREE(fileData);
if (genFontChars) RL_FREE(fontChars); if (genFontChars) RL_FREE(fontChars);
} }
#endif #endif
@ -593,6 +587,52 @@ CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int c
return chars; return chars;
} }
// Load font data from disk before generating font.
CharInfo *LoadFontData(const char *fileName, int fontSize, int *fontChars, int charsCount, int type)
{
// Load font data (including pixel data) from TTF file
// NOTE: Loaded information should be enough to generate
// font image atlas, using any packaging method
unsigned int dataSize = 0;
unsigned char *fileData = LoadFileData(fileName, &dataSize);
CharInfo* const chars = LoadFontDataBase(fileData, fontSize, fontChars, charsCount, type);
RL_FREE(fileData);
return chars;
}
// Loads font from TTF font file from memory buffer.
Font LoadFontFromMemory(const char* data, int fontSize, int* fontChars, int charsCount) {
Font font = { 0 };
#if defined(SUPPORT_FILEFORMAT_TTF)
font.baseSize = fontSize;
font.charsCount = (charsCount > 0) ? charsCount : 95;
font.chars = LoadFontDataBase(data, font.baseSize, fontChars, font.charsCount, FONT_DEFAULT);
if (font.chars != NULL)
{
Image atlas = GenImageFontAtlas(font.chars, &font.recs, font.charsCount, font.baseSize, 2, 0);
font.texture = LoadTextureFromImage(atlas);
// Update chars[i].image to use alpha, required to be used on ImageDrawText()
for (int i = 0; i < font.charsCount; i++)
{
UnloadImage(font.chars[i].image);
font.chars[i].image = ImageFromImage(atlas, font.recs[i]);
}
UnloadImage(atlas);
}
else font = GetFontDefault();
#else
font = GetFontDefault();
#endif
return font;
}
// Generate image font atlas using chars info // Generate image font atlas using chars info
// NOTE: Packing method: 0-Default, 1-Skyline // NOTE: Packing method: 0-Default, 1-Skyline
#if defined(SUPPORT_FILEFORMAT_TTF) #if defined(SUPPORT_FILEFORMAT_TTF)