From 2cd84bd581b5adb9d7d85b1cb35605497e3af48d Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 22 Dec 2025 22:12:14 +0100
Subject: [PATCH] testcustomcursor: add --frames argument accepting multiple
paths
---
test/testcustomcursor.c | 84 ++++++++++++++++-------------------------
1 file changed, 33 insertions(+), 51 deletions(-)
diff --git a/test/testcustomcursor.c b/test/testcustomcursor.c
index b5c6a09f06bea..911f259ee222a 100644
--- a/test/testcustomcursor.c
+++ b/test/testcustomcursor.c
@@ -168,53 +168,35 @@ static SDL_Surface *load_image(const char *file)
return surface;
}
-static SDL_Cursor *init_color_cursor(const char *file)
+static SDL_Cursor *init_color_cursor(char **files, int num_frames)
{
SDL_Cursor *cursor = NULL;
- SDL_CursorFrameInfo *frames = NULL;
- int frame_cnt = 0;
+ SDL_CursorFrameInfo *frames = (SDL_CursorFrameInfo *)SDL_calloc(num_frames, sizeof(SDL_CursorFrameInfo));
int i;
- char *str = SDL_strdup(file);
- if (!str) {
- return NULL;
- }
-
- char *saveptr = NULL;
- char *token = SDL_strtok_r(str, ";", &saveptr);
- while(token != NULL) {
- SDL_Surface *img = load_image(token);
+ for (i = 0; i < num_frames; i++) {
+ SDL_Surface *img = load_image(files[i]);
if (!img) {
+ SDL_LogWarn(SDL_LOG_CATEGORY_TEST, "Failed to load %s", files[i]);
goto cleanup;
}
-
- frames = SDL_realloc(frames, (frame_cnt + 1) * sizeof(SDL_CursorFrameInfo));
- if (!frames) {
- goto cleanup;
+ frames[i].surface = img;
+ if (i > 0) {
+ frames[i].duration = 150;
}
-
- frames[frame_cnt].surface = img;
- frames[frame_cnt++].duration = 150;
-
- token = SDL_strtok_r(NULL, ";", &saveptr);
}
- if (frame_cnt == 1) {
+ if (num_frames == 1) {
cursor = SDL_CreateColorCursor(frames[0].surface, 0, 0);
} else {
- cursor = SDL_CreateAnimatedCursor(frames, frame_cnt, 0, 0);
+ cursor = SDL_CreateAnimatedCursor(frames, num_frames, 0, 0);
}
cleanup:
- if (frames) {
- for (i = 0; i < frame_cnt; ++i) {
- SDL_DestroySurface(frames[i].surface);
- }
-
- SDL_free(frames);
+ for (i = 0; i < num_frames; ++i) {
+ SDL_DestroySurface(frames[i].surface);
}
-
- SDL_free(str);
+ SDL_free(frames);
return cursor;
}
@@ -488,7 +470,8 @@ static void loop(void)
int main(int argc, char *argv[])
{
int i;
- const char *color_cursor = NULL;
+ char **frames = NULL;
+ int num_frames = -1;
SDL_Cursor *cursor;
/* Initialize test framework */
@@ -502,11 +485,18 @@ int main(int argc, char *argv[])
consumed = SDLTest_CommonArg(state, i);
if (consumed == 0) {
- color_cursor = argv[i];
- break;
+ if (SDL_strcmp(argv[i], "--frames") == 0 && frames == NULL) {
+ num_frames = 0;
+ while (i + 1 + num_frames < argc && argv[i + 1 + num_frames][0] != '-') {
+ num_frames += 1;
+ }
+ frames = &argv[i + 1];
+ consumed = num_frames + 1;
+ }
}
- if (consumed < 0) {
- SDLTest_CommonLogUsage(state, argv[0], NULL);
+ if (consumed <= 0) {
+ static const char *options[] = { "[--frames frame0.bmp [frame1.bmp [frame2.bmp ...]]]", NULL};
+ SDLTest_CommonLogUsage(state, argv[0], options);
quit(1);
}
i += consumed;
@@ -518,25 +508,17 @@ int main(int argc, char *argv[])
num_cursors = 0;
- if (color_cursor) {
+ if (num_frames > 0) {
/* Only load the first file in the list for the icon. */
- char *icon_str = SDL_strdup(color_cursor);
- if (icon_str) {
- char *tok = SDL_strchr(icon_str, ';');
- if (tok) {
- *tok = '\0';
- }
- SDL_Surface *icon = load_image(icon_str);
- SDL_free(icon_str);
- if (icon) {
- for (i = 0; i < state->num_windows; ++i) {
- SDL_SetWindowIcon(state->windows[i], icon);
- }
- SDL_DestroySurface(icon);
+ SDL_Surface *icon = load_image(frames[0]);
+ if (icon) {
+ for (i = 0; i < state->num_windows; ++i) {
+ SDL_SetWindowIcon(state->windows[i], icon);
}
+ SDL_DestroySurface(icon);
}
- cursor = init_color_cursor(color_cursor);
+ cursor = init_color_cursor(frames, num_frames);
if (cursor) {
cursors[num_cursors] = cursor;
cursor_types[num_cursors] = (SDL_SystemCursor)-1;