From 4611406c68238feb2c4e4c1c739c91c4d1972361 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Sun, 15 Mar 2020 16:18:48 +0100 Subject: [PATCH] REVIEWED: ImageTextEx() to support line breaks #1131 NOTE: This functionality has an important issue, line space is fixed to 1.5 font.baseSize pixels, depending on the font and how it has been generated that spacing could be too wide or too narrow... --- src/textures.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/textures.c b/src/textures.c index d5bf5eafb..917530871 100644 --- a/src/textures.c +++ b/src/textures.c @@ -1932,9 +1932,8 @@ Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Co { int length = strlen(text); - int index; // Index position in sprite font - int letter = 0; // Current character - int positionX = 0; // Image drawing position + int textOffsetX = 0; // Image drawing position X + int textOffsetY = 0; // Offset between lines (on line break '\n') // NOTE: Text image is generated at font base size, later scaled to desired font size Vector2 imSize = MeasureTextEx(font, text, (float)font.baseSize, spacing); @@ -1944,29 +1943,35 @@ Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Co for (int i = 0; i < length; i++) { - int next = 0; - letter = GetNextCodepoint(&text[i], &next); - index = GetGlyphIndex(font, letter); + // Get next codepoint from byte string and glyph index in font + int codepointByteCount = 0; + int codepoint = GetNextCodepoint(&text[i], &codepointByteCount); + int index = GetGlyphIndex(font, codepoint); - if (letter == 0x3f) next = 1; - i += (next - 1); + // NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f) + // but we need to draw all of the bad bytes using the '?' symbol moving one byte + if (codepoint == 0x3f) codepointByteCount = 1; - if (letter == '\n') + if (codepoint == '\n') { - // TODO: Support line break + // NOTE: Fixed line spacing of 1.5 line-height + // TODO: Support custom line spacing defined by user + textOffsetY += font.baseSize + font.baseSize/2); + textOffsetX = 0.0f; } else - { - if (letter != ' ') + { + if ((codepoint != ' ') && (codepoint != '\t')) { - ImageDraw(&imText, font.chars[index].image, (Rectangle){ 0, 0, font.chars[index].image.width, font.chars[index].image.height }, - (Rectangle){ (float)(positionX + font.chars[index].offsetX),(float)font.chars[index].offsetY, - font.chars[index].image.width, font.chars[index].image.height }, tint); + Rectangle rec = { textOffsetX + font.chars[index].offsetX, textOffsetY + font.chars[index].offsetY, font.recs[index].width, font.recs[index].height }; + ImageDraw(&imText, font.chars[index].image, (Rectangle){ 0, 0, font.chars[index].image.width, font.chars[index].image.height }, rec, tint); } - - if (font.chars[index].advanceX == 0) positionX += (int)(font.recs[index].width + spacing); - else positionX += font.chars[index].advanceX + (int)spacing; + + if (font.chars[index].advanceX == 0) textOffsetX += (int)(font.recs[index].width + spacing); + else textOffsetX += font.chars[index].advanceX + (int)spacing; } + + i += (codepointByteCount - 1); // Move text bytes counter to next codepoint } // Scale image depending on text size