|
@@ -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 = (CharInfo *)RL_MALLOC(defaultFont.charsCount*sizeof(CharInfo));
|
|
|
+ defaultFont.chars = (GlyphInfo *)RL_MALLOC(defaultFont.charsCount*sizeof(GlyphInfo));
|
|
|
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 = (CharInfo *)RL_MALLOC(font.charsCount*sizeof(CharInfo));
|
|
|
+ font.chars = (GlyphInfo *)RL_MALLOC(font.charsCount*sizeof(GlyphInfo));
|
|
|
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
|
|
|
-CharInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int charsCount, int type)
|
|
|
+GlyphInfo *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
|
|
|
|
|
|
- CharInfo *chars = NULL;
|
|
|
+ GlyphInfo *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 = (CharInfo *)RL_MALLOC(charsCount*sizeof(CharInfo));
|
|
|
+ chars = (GlyphInfo *)RL_MALLOC(charsCount*sizeof(GlyphInfo));
|
|
|
|
|
|
// 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 CharInfo *chars, Rectangle **charRecs, int charsCount, int fontSize, int padding, int packMethod)
|
|
|
+Image GenImageFontAtlas(const GlyphInfo *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(CharInfo *chars, int charsCount)
|
|
|
+void UnloadFontData(GlyphInfo *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 Utf8 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 utf8 text
|
|
|
+// Encode text codepoint into UTF-8 text
|
|
|
// REQUIRES: memcpy()
|
|
|
// WARNING: Allocated memory should be manually freed
|
|
|
-char *TextToUtf8(int *codepoints, int length)
|
|
|
+char *TextCodepointsToUTF8(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 = CodepointToUtf8(codepoints[i], &bytes);
|
|
|
+ utf8 = CodepointToUTF8(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 = (CharInfo *)RL_MALLOC(charsCount*sizeof(CharInfo));
|
|
|
+ font.chars = (GlyphInfo *)RL_MALLOC(charsCount*sizeof(GlyphInfo));
|
|
|
font.recs = (Rectangle *)RL_MALLOC(charsCount*sizeof(Rectangle));
|
|
|
|
|
|
int charId, charX, charY, charWidth, charHeight, charOffsetX, charOffsetY, charAdvanceX;
|