|
@@ -1071,10 +1071,6 @@ void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, f
|
|
|
int codepoint = GetCodepointNext(&text[i], &codepointByteCount);
|
|
|
int index = GetGlyphIndex(font, codepoint);
|
|
|
|
|
|
- // NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f)
|
|
|
- // but we need to draw all the bad bytes using the '?' symbol moving one byte
|
|
|
- if (codepoint == 0x3f) codepointByteCount = 1;
|
|
|
-
|
|
|
if (codepoint == '\n')
|
|
|
{
|
|
|
// NOTE: Fixed line spacing of 1.5 line-height
|
|
@@ -1205,7 +1201,7 @@ Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing
|
|
|
int letter = 0; // Current character
|
|
|
int index = 0; // Index position in sprite font
|
|
|
|
|
|
- for (int i = 0; i < size; i++)
|
|
|
+ for (int i = 0; i < size;)
|
|
|
{
|
|
|
byteCounter++;
|
|
|
|
|
@@ -1213,10 +1209,7 @@ Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing
|
|
|
letter = GetCodepointNext(&text[i], &next);
|
|
|
index = GetGlyphIndex(font, letter);
|
|
|
|
|
|
- // NOTE: normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f)
|
|
|
- // but we need to draw all the bad bytes using the '?' symbol so to not skip any we set next = 1
|
|
|
- if (letter == 0x3f) next = 1;
|
|
|
- i += next - 1;
|
|
|
+ i += next;
|
|
|
|
|
|
if (letter != '\n')
|
|
|
{
|
|
@@ -1734,8 +1727,7 @@ int GetCodepointCount(const char *text)
|
|
|
int next = 0;
|
|
|
int letter = GetCodepointNext(ptr, &next);
|
|
|
|
|
|
- if (letter == 0x3f) ptr += 1;
|
|
|
- else ptr += next;
|
|
|
+ ptr += next;
|
|
|
|
|
|
length++;
|
|
|
}
|
|
@@ -1896,28 +1888,31 @@ int GetCodepointNext(const char *text, int *codepointSize)
|
|
|
{
|
|
|
const char *ptr = text;
|
|
|
int codepoint = 0x3f; // Codepoint (defaults to '?')
|
|
|
- *codepointSize = 0;
|
|
|
+ *codepointSize = 1;
|
|
|
|
|
|
// Get current codepoint and bytes processed
|
|
|
if (0xf0 == (0xf8 & ptr[0]))
|
|
|
{
|
|
|
// 4 byte UTF-8 codepoint
|
|
|
+ if(((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80) || ((ptr[3] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks
|
|
|
codepoint = ((0x07 & ptr[0]) << 18) | ((0x3f & ptr[1]) << 12) | ((0x3f & ptr[2]) << 6) | (0x3f & ptr[3]);
|
|
|
*codepointSize = 4;
|
|
|
}
|
|
|
else if (0xe0 == (0xf0 & ptr[0]))
|
|
|
{
|
|
|
// 3 byte UTF-8 codepoint */
|
|
|
+ if(((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks
|
|
|
codepoint = ((0x0f & ptr[0]) << 12) | ((0x3f & ptr[1]) << 6) | (0x3f & ptr[2]);
|
|
|
*codepointSize = 3;
|
|
|
}
|
|
|
else if (0xc0 == (0xe0 & ptr[0]))
|
|
|
{
|
|
|
// 2 byte UTF-8 codepoint
|
|
|
+ if((ptr[1] & 0xC0) ^ 0x80) { return codepoint; } //10xxxxxx checks
|
|
|
codepoint = ((0x1f & ptr[0]) << 6) | (0x3f & ptr[1]);
|
|
|
*codepointSize = 2;
|
|
|
}
|
|
|
- else
|
|
|
+ else if (0x00 == (0x80 & ptr[0]))
|
|
|
{
|
|
|
// 1 byte UTF-8 codepoint
|
|
|
codepoint = ptr[0];
|