From 0abb68ebba86d3d53a63446eeb149c691bb3cb77 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 3 Oct 2024 22:40:26 -0700 Subject: [PATCH] Better carriage-return + newline handling --- examples/editbox.c | 26 +++++++++++++------------- src/SDL_ttf.c | 8 ++++++-- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/examples/editbox.c b/examples/editbox.c index 22fbef48..15d3a27d 100644 --- a/examples/editbox.c +++ b/examples/editbox.c @@ -14,18 +14,6 @@ #define CURSOR_BLINK_INTERVAL_MS 500 -static bool GetHighlightExtents(EditBox *edit, int *marker1, int *marker2) -{ - if (edit->highlight1 >= 0 && edit->highlight2 >= 0) { - *marker1 = SDL_min(edit->highlight1, edit->highlight2); - *marker2 = SDL_max(edit->highlight1, edit->highlight2) - 1; - if (*marker2 > *marker1) { - return true; - } - } - return false; -} - EditBox *EditBox_Create(TTF_Text *text, const SDL_FRect *rect) { EditBox *edit = (EditBox *)SDL_calloc(1, sizeof(*edit)); @@ -51,6 +39,18 @@ void EditBox_Destroy(EditBox *edit) SDL_free(edit); } +static bool GetHighlightExtents(EditBox *edit, int *marker1, int *marker2) +{ + if (edit->highlight1 >= 0 && edit->highlight2 >= 0) { + *marker1 = SDL_min(edit->highlight1, edit->highlight2); + *marker2 = SDL_max(edit->highlight1, edit->highlight2) - 1; + if (*marker2 > *marker1) { + return true; + } + } + return false; +} + void EditBox_Draw(EditBox *edit, SDL_Renderer *renderer) { if (!edit) { @@ -137,7 +137,7 @@ static void MoveCursorIndex(EditBox *edit, int direction) } } else { if (TTF_GetTextSubString(edit->text, edit->cursor, &substring) && - TTF_GetTextSubString(edit->text, substring.offset + substring.length, &substring)) { + TTF_GetTextSubString(edit->text, substring.offset + SDL_max(substring.length, 1), &substring)) { edit->cursor = substring.offset; } } diff --git a/src/SDL_ttf.c b/src/SDL_ttf.c index b2817711..e0ce10cd 100644 --- a/src/SDL_ttf.c +++ b/src/SDL_ttf.c @@ -3449,7 +3449,7 @@ static bool GetWrappedLines(TTF_Font *font, const char *text, size_t length, int save_text = spot; save_length = left; // Break, if new line - if (c == '\n' || c == '\r') { + if (c == '\n' || (c == '\r' && *spot != '\n')) { break; } } @@ -3472,7 +3472,7 @@ static bool GetWrappedLines(TTF_Font *font, const char *text, size_t length, int TTF_Line *line = &strLines[i]; while (line->length > 0 && CharacterIsDelimiter(line->text[line->length - 1]) && - line->text[line->length - 1] != '\n') { + !CharacterIsNewLine(line->text[line->length - 1])) { --line->length; } } @@ -3854,6 +3854,10 @@ static bool LayoutTextWrapped(TTF_Text *text) for (i = 0; i < numLines; i++) { int xstart, ystart, line_width, xoffset; + if (strLines[i].length == 0) { + continue; + } + // Initialize xstart, ystart and compute positions if (!TTF_Size_Internal(font, strLines[i].text, strLines[i].length, &line_width, NULL, &xstart, &ystart, NO_MEASUREMENT)) { goto done;