@ -53,6 +53,7 @@
# include "config.h" // Defines module configuration flags
# endif
# include "utils.h" // Required for: LoadFileText()
# include "rlgl.h" // OpenGL abstraction layer to OpenGL 1.1, 2.1, 3.3+ or ES2 -> Only DrawTextPro()
# include <stdlib.h> // Required for: malloc(), free()
@ -61,8 +62,6 @@
# include <stdarg.h> // Required for: va_list, va_start(), vsprintf(), va_end() [Used in TextFormat()]
# include <ctype.h> // Requried for: toupper(), tolower() [Used in TextToUpper(), TextToLower()]
# include "utils.h" // Required for: LoadFileText()
# if defined(SUPPORT_FILEFORMAT_TTF)
# define STB_RECT_PACK_IMPLEMENTATION
# include "external/stb_rect_pack.h" // Required for: ttf font rectangles packaging
@ -127,7 +126,7 @@ extern void LoadFontDefault(void)
{
# define BIT_CHECK(a,b) ((a) & (1u << (b)))
/ / NOTE : Using UTF8 encoding table for Unicode U + 0000. . U + 00FF Basic Latin + Latin - 1 Supplement
/ / NOTE : Using UTF- 8 encoding table for Unicode U + 0000. . U + 00FF Basic Latin + Latin - 1 Supplement
/ / Ref : http : / / www . utf8 - chartable . de / unicode - utf8 - table . pl
defaultFont . charsCount = 224 ; / / Number of chars included in our default font
@ -226,7 +225,7 @@ extern void LoadFontDefault(void)
/ / Allocate space for our characters info data
/ / NOTE : This memory should be freed at end ! - - > CloseWindow ( )
defaultFont . chars = ( Char Info * ) RL_MALLOC ( defaultFont . charsCount * sizeof ( Char Info) ) ;
defaultFont . chars = ( Glyph Info * ) RL_MALLOC ( defaultFont . charsCount * sizeof ( Glyph Info) ) ;
defaultFont . recs = ( Rectangle * ) RL_MALLOC ( defaultFont . charsCount * sizeof ( Rectangle ) ) ;
int currentLine = 0 ;
@ -455,7 +454,7 @@ Font LoadFontFromImage(Image image, Color key, int firstChar)
/ / We got tempCharValues and tempCharsRecs populated with chars data
/ / Now we move temp data to sized charValues and charRecs arrays
font . chars = ( Char Info * ) RL_MALLOC ( font . charsCount * sizeof ( Char Info) ) ;
font . chars = ( Glyph Info * ) RL_MALLOC ( font . charsCount * sizeof ( Glyph Info) ) ;
font . recs = ( Rectangle * ) RL_MALLOC ( font . charsCount * sizeof ( Rectangle ) ) ;
for ( int i = 0 ; i < font . charsCount ; i + + )
@ -525,7 +524,7 @@ Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int
/ / Load font data for further use
/ / NOTE : Requires TTF font memory data and can generate SDF data
Char Info * LoadFontData ( const unsigned char * fileData , int dataSize , int fontSize , int * fontChars , int charsCount , int type )
Glyph Info * LoadFontData ( const unsigned char * fileData , int dataSize , int fontSize , int * fontChars , int charsCount , int type )
{
/ / NOTE : Using some SDF generation default values ,
/ / trades off precision with ability to handle * smaller * sizes
@ -542,7 +541,7 @@ CharInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize
# define FONT_BITMAP_ALPHA_THRESHOLD 80 / / Bitmap (B&W) font generation alpha threshold
# endif
Char Info * chars = NULL ;
Glyph Info * chars = NULL ;
# if defined(SUPPORT_FILEFORMAT_TTF)
/ / Load font data ( including pixel data ) from TTF memory file
@ -575,7 +574,7 @@ CharInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize
genFontChars = true ;
}
chars = ( Char Info * ) RL_MALLOC ( charsCount * sizeof ( Char Info) ) ;
chars = ( Glyph Info * ) RL_MALLOC ( charsCount * sizeof ( Glyph Info) ) ;
/ / NOTE : Using simple packaging , one char after another
for ( int i = 0 ; i < charsCount ; i + + )
@ -651,7 +650,7 @@ CharInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize
/ / Generate image font atlas using chars info
/ / NOTE : Packing method : 0 - Default , 1 - Skyline
# if defined(SUPPORT_FILEFORMAT_TTF)
Image GenImageFontAtlas ( const Char Info * chars , Rectangle * * charRecs , int charsCount , int fontSize , int padding , int packMethod )
Image GenImageFontAtlas ( const Glyph Info * chars , Rectangle * * charRecs , int charsCount , int fontSize , int padding , int packMethod )
{
Image atlas = { 0 } ;
@ -794,7 +793,7 @@ Image GenImageFontAtlas(const CharInfo *chars, Rectangle **charRecs, int charsCo
# endif
/ / Unload font chars info data ( RAM )
void UnloadFontData ( Char Info * chars , int charsCount )
void UnloadFontData ( Glyph Info * chars , int charsCount )
{
for ( int i = 0 ; i < charsCount ; i + + ) UnloadImage ( chars [ i ] . image ) ;
@ -1003,6 +1002,7 @@ Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing
}
/ / Get index position for a unicode character on font
/ / NOTE : If codepoint is not found in the font it fallbacks to ' ? '
int GetGlyphIndex ( Font font , int codepoint )
{
# ifndef GLYPH_NOTFOUND_CHAR_FALLBACK
@ -1029,6 +1029,28 @@ int GetGlyphIndex(Font font, int codepoint)
# endif
}
/ / Get glyph font info data for a codepoint ( unicode character )
/ / NOTE : If codepoint is not found in the font it fallbacks to ' ? '
GlyphInfo GetGlyphInfo ( Font font , int codepoint )
{
GlyphInfo info = { 0 } ;
info = font . chars [ GetGlyphIndex ( font , codepoint ) ] ;
return info ;
}
/ / Get glyph rectangle in font atlas for a codepoint ( unicode character )
/ / NOTE : If codepoint is not found in the font it fallbacks to ' ? '
Rectangle GetGlyphAtlasRec ( Font font , int codepoint )
{
Rectangle rec = { 0 } ;
rec = font . recs [ GetGlyphIndex ( font , codepoint ) ] ;
return rec ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Text strings management functions
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -1326,7 +1348,7 @@ const char *TextToUpper(const char *text)
buffer [ i ] = ( char ) toupper ( text [ i ] ) ;
/ / if ( ( text [ i ] > = ' a ' ) & & ( text [ i ] < = ' z ' ) ) buffer [ i ] = text [ i ] - 32 ;
/ / TODO : Support Utf 8 diacritics !
/ / TODO : Support UTF - 8 diacritics !
/ / if ( ( text [ i ] > = ' à ' ) & & ( text [ i ] < = ' ý ' ) ) buffer [ i ] = text [ i ] - 32 ;
}
else { buffer [ i ] = ' \0 ' ; break ; }
@ -1379,10 +1401,10 @@ const char *TextToPascal(const char *text)
return buffer ;
}
/ / Encode text codepoint into utf 8 text
/ / Encode text codepoint into UTF - 8 text
/ / REQUIRES : memcpy ( )
/ / WARNING : Allocated memory should be manually freed
char * TextToUtf 8 ( int * codepoints , int length )
char * TextCodepointsToUTF 8 ( int * codepoints , int length )
{
/ / We allocate enough memory fo fit all possible codepoints
/ / NOTE : 5 bytes for every codepoint should be enough
@ -1392,7 +1414,7 @@ char *TextToUtf8(int *codepoints, int length)
for ( int i = 0 , bytes = 0 ; i < length ; i + + )
{
utf8 = CodepointToUtf 8 ( codepoints [ i ] , & bytes ) ;
utf8 = CodepointToUTF 8 ( codepoints [ i ] , & bytes ) ;
memcpy ( text + size , utf8 , bytes ) ;
size + = bytes ;
}
@ -1406,7 +1428,8 @@ char *TextToUtf8(int *codepoints, int length)
}
/ / Encode codepoint into utf8 text ( char array length returned as parameter )
RLAPI const char * CodepointToUtf8 ( int codepoint , int * byteLength )
/ / NOTE : It uses a static array to store UTF - 8 bytes
RLAPI const char * CodepointToUTF8 ( int codepoint , int * byteLength )
{
static char utf8 [ 6 ] = { 0 } ;
int length = 0 ;
@ -1443,7 +1466,7 @@ RLAPI const char *CodepointToUtf8(int codepoint, int *byteLength)
return utf8 ;
}
/ / Load all codepoints from a UTF8 text string , codepoints count returned by parameter
/ / Load all codepoints from a UTF- 8 text string , codepoints count returned by parameter
int * LoadCodepoints ( const char * text , int * count )
{
int textLength = TextLength ( text ) ;
@ -1475,8 +1498,8 @@ void UnloadCodepoints(int *codepoints)
RL_FREE ( codepoints ) ;
}
/ / Get total number of characters ( codepoints ) in a UTF8 encoded text , until ' \0 ' is found
/ / NOTE : If an invalid UTF8 sequence is encountered a ' ? ' ( 0x3f ) codepoint is counted instead
/ / Get total number of characters ( codepoints ) in a UTF- 8 encoded text , until ' \0 ' is found
/ / NOTE : If an invalid UTF- 8 sequence is encountered a ' ? ' ( 0x3f ) codepoint is counted instead
int GetCodepointsCount ( const char * text )
{
unsigned int len = 0 ;
@ -1497,8 +1520,8 @@ int GetCodepointsCount(const char *text)
}
# endif / / SUPPORT_TEXT_MANIPULATION
/ / Get next codepoint in a UTF8 encoded text , scanning until ' \0 ' is found
/ / When a invalid UTF8 byte is encountered we exit as soon as possible and a ' ? ' ( 0x3f ) codepoint is returned
/ / Get next codepoint in a UTF- 8 encoded text , scanning until ' \0 ' is found
/ / When a invalid UTF- 8 byte is encountered we exit as soon as possible and a ' ? ' ( 0x3f ) codepoint is returned
/ / Total number of bytes processed are returned as a parameter
/ / NOTE : the standard says U + FFFD should be returned in case of errors
/ / but that character is not supported by the default font in raylib
@ -1506,7 +1529,7 @@ int GetCodepointsCount(const char *text)
int GetCodepoint ( const char * text , int * bytesProcessed )
{
/*
UTF8 specs from https : / / www . ietf . org / rfc / rfc3629 . txt
UTF- 8 specs from https : / / www . ietf . org / rfc / rfc3629 . txt
Char . number range | UTF - 8 octet sequence
( hexadecimal ) | ( binary )
@ -1725,7 +1748,7 @@ static Font LoadBMFont(const char *fileName)
font . baseSize = fontSize ;
font . charsCount = charsCount ;
font . charsPadding = 0 ;
font . chars = ( Char Info * ) RL_MALLOC ( charsCount * sizeof ( Char Info) ) ;
font . chars = ( Glyph Info * ) RL_MALLOC ( charsCount * sizeof ( Glyph Info) ) ;
font . recs = ( Rectangle * ) RL_MALLOC ( charsCount * sizeof ( Rectangle ) ) ;
int charId , charX , charY , charWidth , charHeight , charOffsetX , charOffsetY , charAdvanceX ;