diff options
| author | chocolate42 <[email protected]> | 2023-04-06 11:34:37 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-04-06 12:34:37 +0200 |
| commit | 8367abad1a925fc7cf60fd8e71b5f6dbf6250ddb (patch) | |
| tree | 5fc176a58895f00f1e832b7fe901f732025dad18 /src/rtextures.c | |
| parent | 17c443ee6db0a111d111e766bb517657204c3574 (diff) | |
| download | raylib-8367abad1a925fc7cf60fd8e71b5f6dbf6250ddb.tar.gz raylib-8367abad1a925fc7cf60fd8e71b5f6dbf6250ddb.zip | |
[rtext] Fix GetCodepointNext() to return default value on invalid input with size=0 (#2997)
* Fix GetCodepointNext to return default value with size=0 on invalid input. Modify LoadCodepoints to work when GetCodepointNext returns a size of 0. All internal use of GetCodepointNext and GetCodepointPrev checked. This fix may break external code dealing with invalid input as the old code erroneously never returned a size of 0, external code that doesn't properly check for size=0 may endlessly loop or overflow a buffer on invalid input.
* Change default behaviour of GetCodepointNext to return a size of 1 instead of 0. This matches existing prod behaviour and guarantees size 1..4 is returned. Simplify internal code that uses GetCodepointNext that previously had to account for size=0.
* Simplified progressing through a UTF-8 string in ImageTextEx and MeasureTextEx. This change matches existing precedent in DrawTextEx
* GetCodepointNext: Add 10xxxxxx checks to multibyte encodings.
---------
Co-authored-by: anon <anon>
Diffstat (limited to 'src/rtextures.c')
| -rw-r--r-- | src/rtextures.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/src/rtextures.c b/src/rtextures.c index fb63f2ff..bd652e6b 100644 --- a/src/rtextures.c +++ b/src/rtextures.c @@ -1266,17 +1266,13 @@ Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Co // Create image to store text imText = GenImageColor((int)imSize.x, (int)imSize.y, BLANK); - for (int i = 0; i < size; i++) + for (int i = 0; i < size;) { // Get next codepoint from byte string and glyph index in font int codepointByteCount = 0; int codepoint = GetCodepointNext(&text[i], &codepointByteCount); // WARNING: Module required: rtext int index = GetGlyphIndex(font, codepoint); // WARNING: Module required: rtext - // 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 @@ -1296,7 +1292,7 @@ Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Co else textOffsetX += font.glyphs[index].advanceX + (int)spacing; } - i += (codepointByteCount - 1); // Move text bytes counter to next codepoint + i += codepointByteCount; // Move text bytes counter to next codepoint } // Scale image depending on text size |
