Atlas - testasyncio.c
Home / ext / SDL / test Lines: 1 | Size: 5616 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Copyright (C) 1997-2025 Sam Lantinga <[email protected]> 3 4 This software is provided 'as-is', without any express or implied 5 warranty. In no event will the authors be held liable for any damages 6 arising from the use of this software. 7 8 Permission is granted to anyone to use this software for any purpose, 9 including commercial applications, and to alter it and redistribute it 10 freely. 11*/ 12 13#define SDL_MAIN_USE_CALLBACKS 1 14#include <SDL3/SDL_main.h> 15#include <SDL3/SDL_test.h> 16#include <SDL3/SDL_test_common.h> 17 18static SDL_Renderer *renderer = NULL; 19static SDL_Texture *texture = NULL; 20static SDL_AsyncIOQueue *queue = NULL; 21static SDLTest_CommonState *state = NULL; 22 23SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) 24{ 25 const char *base = NULL; 26 SDL_AsyncIO *asyncio = NULL; 27 char **pngs = NULL; 28 int pngcount = 0; 29 int i; 30 31 SDL_srand(0); 32 33 /* Initialize test framework */ 34 state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO); 35 if (!state) { 36 return SDL_APP_FAILURE; 37 } 38 39 /* Enable standard application logging */ 40 SDL_SetLogPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 41 42 /* Parse commandline */ 43 for (i = 1; i < argc;) { 44 int consumed = SDLTest_CommonArg(state, i); 45 if (consumed <= 0) { 46 static const char *options[] = { 47 NULL, 48 }; 49 SDLTest_CommonLogUsage(state, argv[0], options); 50 SDL_Quit(); 51 SDLTest_CommonDestroyState(state); 52 return 1; 53 } 54 i += consumed; 55 } 56 57 state->num_windows = 1; 58 59 /* Load the SDL library */ 60 if (!SDLTest_CommonInit(state)) { 61 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError()); 62 return SDL_APP_FAILURE; 63 } 64 65 SDL_SetLogPriorities(SDL_LOG_PRIORITY_VERBOSE); 66 67 renderer = state->renderers[0]; 68 if (!renderer) { 69 /* SDL_Log("Couldn't create renderer: %s", SDL_GetError()); */ 70 return SDL_APP_FAILURE; 71 } 72 73 texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, 512, 512); 74 if (!texture) { 75 SDL_Log("Couldn't create texture: %s", SDL_GetError()); 76 return SDL_APP_FAILURE; 77 } else { 78 static const Uint32 blank[512 * 512]; 79 const SDL_Rect rect = { 0, 0, 512, 512 }; 80 SDL_UpdateTexture(texture, &rect, blank, 512 * sizeof (Uint32)); 81 } 82 83 queue = SDL_CreateAsyncIOQueue(); 84 if (!queue) { 85 SDL_Log("Couldn't create async i/o queue: %s", SDL_GetError()); 86 return SDL_APP_FAILURE; 87 } 88 89 base = SDL_GetBasePath(); 90 pngs = SDL_GlobDirectory(base, "*.png", SDL_GLOB_CASEINSENSITIVE, &pngcount); 91 if (!pngs || (pngcount == 0)) { 92 SDL_Log("No PNG files found."); 93 return SDL_APP_FAILURE; 94 } 95 96 for (i = 0; i < pngcount; i++) { 97 char *path = NULL; 98 if (SDL_asprintf(&path, "%s%s", base, pngs[i]) < 0) { 99 SDL_free(path); 100 } else { 101 SDL_Log("Loading %s...", path); 102 SDL_LoadFileAsync(path, queue, path); 103 } 104 } 105 106 SDL_free(pngs); 107 108 SDL_Log("Opening asyncio.tmp..."); 109 asyncio = SDL_AsyncIOFromFile("asyncio.tmp", "w"); 110 if (!asyncio) { 111 SDL_Log("Failed!"); 112 return SDL_APP_FAILURE; 113 } 114 SDL_WriteAsyncIO(asyncio, "hello", 0, 5, queue, "asyncio.tmp (write)"); 115 SDL_CloseAsyncIO(asyncio, true, queue, "asyncio.tmp (flush/close)"); 116 117 return SDL_APP_CONTINUE; 118} 119 120SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) 121{ 122 switch (event->type) { 123 case SDL_EVENT_QUIT: 124 return SDL_APP_SUCCESS; 125 126 default: 127 break; 128 } 129 130 return SDLTest_CommonEventMainCallbacks(state, event); 131} 132 133static void async_io_task_complete(const SDL_AsyncIOOutcome *outcome) 134{ 135 const char *fname = (const char *) outcome->userdata; 136 const char *resultstr = "[unknown result]"; 137 138 switch (outcome->result) { 139 #define RESCASE(x) case x: resultstr = #x; break 140 RESCASE(SDL_ASYNCIO_COMPLETE); 141 RESCASE(SDL_ASYNCIO_FAILURE); 142 RESCASE(SDL_ASYNCIO_CANCELED); 143 #undef RESCASE 144 } 145 146 SDL_Log("File '%s' async results: %s", fname, resultstr); 147 148 if (SDL_strncmp(fname, "asyncio.tmp", 11) == 0) { 149 return; 150 } 151 152 if (outcome->result == SDL_ASYNCIO_COMPLETE) { 153 SDL_Surface *surface = SDL_LoadPNG_IO(SDL_IOFromConstMem(outcome->buffer, (size_t) outcome->bytes_transferred), true); 154 if (surface) { 155 SDL_Surface *converted = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_RGBA8888); 156 SDL_DestroySurface(surface); 157 if (converted) { 158 const SDL_Rect rect = { 50 + SDL_rand(512 - 100), 50 + SDL_rand(512 - 100), converted->w, converted->h }; 159 SDL_UpdateTexture(texture, &rect, converted->pixels, converted->pitch); 160 SDL_DestroySurface(converted); 161 } 162 } 163 } 164 165 SDL_free(outcome->userdata); 166 SDL_free(outcome->buffer); 167} 168 169SDL_AppResult SDL_AppIterate(void *appstate) 170{ 171 SDL_AsyncIOOutcome outcome; 172 if (SDL_GetAsyncIOResult(queue, &outcome)) { 173 async_io_task_complete(&outcome); 174 } 175 176 SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); 177 SDL_RenderClear(renderer); 178 SDL_RenderTexture(renderer, texture, NULL, NULL); 179 SDL_RenderPresent(renderer); 180 181 return SDL_APP_CONTINUE; 182} 183 184void SDL_AppQuit(void *appstate, SDL_AppResult result) 185{ 186 SDL_DestroyAsyncIOQueue(queue); 187 SDL_DestroyTexture(texture); 188 SDL_RemovePath("asyncio.tmp"); 189 SDLTest_CommonQuit(state); 190} 191 192[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.