From 509b23a601ebc162432a174b4f327dc13ac38296 Mon Sep 17 00:00:00 2001 From: Stephen T Date: Fri, 31 Jan 2025 03:02:33 -0600 Subject: [PATCH] Implement SDL3 image rendering with SDL_image. --- examples/SDL3-simple-demo/CMakeLists.txt | 13 +++++++++++++ examples/SDL3-simple-demo/main.c | 4 ++++ examples/SDL3-simple-demo/resources/sample.png | Bin 0 -> 850 bytes renderers/SDL3/clay_renderer_SDL3.c | 9 +++++++++ 4 files changed, 26 insertions(+) create mode 100644 examples/SDL3-simple-demo/resources/sample.png diff --git a/examples/SDL3-simple-demo/CMakeLists.txt b/examples/SDL3-simple-demo/CMakeLists.txt index df467a9..794f89f 100644 --- a/examples/SDL3-simple-demo/CMakeLists.txt +++ b/examples/SDL3-simple-demo/CMakeLists.txt @@ -34,11 +34,24 @@ message(STATUS "Using SDL_ttf via FetchContent") FetchContent_MakeAvailable(SDL_ttf) set_property(DIRECTORY "${sdl_ttf_SOURCE_DIR}" PROPERTY EXCLUDE_FROM_ALL TRUE) +# Download SDL_image +FetchContent_Declare( + SDL_image + GIT_REPOSITORY "https://github.com/libsdl-org/SDL_image.git" + GIT_TAG main # Slightly risky to use main branch, but it's the only one available + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE +) +message(STATUS "Using SDL_image via FetchContent") +FetchContent_MakeAvailable(SDL_image) +set_property(DIRECTORY "${SDL_image_SOURCE_DIR}" PROPERTY EXCLUDE_FROM_ALL TRUE) + # Example executable add_executable(${PROJECT_NAME} main.c) target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3 SDL3_ttf::SDL3_ttf + SDL3_image::SDL3_image ) add_custom_command( diff --git a/examples/SDL3-simple-demo/main.c b/examples/SDL3-simple-demo/main.c index 0597ab5..e632b20 100644 --- a/examples/SDL3-simple-demo/main.c +++ b/examples/SDL3-simple-demo/main.c @@ -23,6 +23,8 @@ typedef struct app_state { ClayVideoDemo_Data demoData; } AppState; +SDL_Surface *sample_image; + static inline Clay_Dimensions SDL_MeasureText(Clay_StringSlice text, Clay_TextElementConfig *config, void *userData) { TTF_Font **fonts = userData; @@ -81,6 +83,8 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) state->rendererData.fonts[FONT_ID] = font; + sample_image = IMG_Load("resources/sample.png"); + /* Initialize Clay */ uint64_t totalMemorySize = Clay_MinMemorySize(); Clay_Arena clayMemory = (Clay_Arena) { diff --git a/examples/SDL3-simple-demo/resources/sample.png b/examples/SDL3-simple-demo/resources/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..2c008286a87772594b9518d39b5ba6adad355fa1 GIT binary patch literal 850 zcmV-Y1FigtP)8r9E;#9glOdQ`k)#XT zM9*J4&IA`jbiDE!8G?%@20IZMjQ!aN(a0dW9NNOGG@ipgRaZrHVf&(y9eSl8TnxZg zg$8L=7met?807x9vU5hBIW2UL!hKC5Xo@_QF*^}z{Q5jmK(P9qf9;@4Uvx5n{n;~} z1C0qz&7^WzSzQ25`gFbE<`}U5QH-HU}70HsbD)7x6Acvfgcr)9tyruL{ACl!ZybXdG#i zPT0?;Gg-tym=uB)SrOzxp*aCoiizA-l*{kB$!;~;3x!T?ujSDGtQme$D@b27!jp2k z|D_89T#pjF7jG^c))kx>n((z2cl>^qdS-AUfGXsoj5AD!%5f3TItyP!x=0+;X*X;4 zPIlL}xNY@3@cHC2lD#g`Wq726g^K1WS{g#P4>;~6s(CAtXV8FAKyQ9<*g zGJ;XHXypF1I8XCc|3GkIVf`6|F+#TZn1uw%XQTgiF)9}TlbN7O>9ylGo+!0hg^n@(3I$yroh=AT-(;oyD7iw>{R{7vX? ze?L<6?zMJBww-)ATBxcPHGOH_NDt`DuIr@{`;jonCyR(!ysA6bTyl34 zin|nSo;O19_25Z;JFm9h``Lrky4;{2555KX<+H6GYu+{Ku=6VFxWMJj`ksi1j(lcR z#{F69vCk^u==m}1^E9>VzC>V;viE_oB@__%i}K6Z;Fl%sXEB}l7?tP@Cv9=4bohSp cGg$ufAI3?`$SYv$U;qFB07*qoM6N<$g3J(}cK`qY literal 0 HcmV?d00001 diff --git a/renderers/SDL3/clay_renderer_SDL3.c b/renderers/SDL3/clay_renderer_SDL3.c index a5386cc..f033956 100644 --- a/renderers/SDL3/clay_renderer_SDL3.c +++ b/renderers/SDL3/clay_renderer_SDL3.c @@ -2,6 +2,7 @@ #include #include #include +#include typedef struct { SDL_Renderer *renderer; @@ -231,6 +232,14 @@ static void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Cla } } break; + case CLAY_RENDER_COMMAND_TYPE_IMAGE: { + const SDL_Surface *image = (SDL_Surface *)rcmd->config.imageElementConfig->imageData; + const SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, image); + const SDL_FRect dest = { rect.x, rect.y, rect.w, rect.h }; + + SDL_RenderTexture(renderer, texture, NULL, &dest); + break; + } default: SDL_Log("Unknown render command type: %d", rcmd->commandType); }