diff --git a/CMakeLists.txt b/CMakeLists.txt index d21948b..02b20b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ add_subdirectory("examples/raylib-sidebar-scrolling-container") # add_subdirectory("examples/cairo-pdf-rendering") Some issue with github actions populating cairo, disable for now if(NOT MSVC) add_subdirectory("examples/clay-official-website") - add_subdirectory("examples/sdl3_renderer") + add_subdirectory("examples/SDL3-simple-demo") endif() add_subdirectory("examples/introducing-clay-video-demo") add_subdirectory("examples/SDL2-video-demo") diff --git a/examples/sdl3_renderer/CMakeLists.txt b/examples/SDL3-simple-demo/CMakeLists.txt similarity index 96% rename from examples/sdl3_renderer/CMakeLists.txt rename to examples/SDL3-simple-demo/CMakeLists.txt index 9ac0733..05d6d62 100644 --- a/examples/sdl3_renderer/CMakeLists.txt +++ b/examples/SDL3-simple-demo/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.27) # Project setup -project(clay_sdl3_renderer C) +project(clay_examples_sdl3_simple_demo C) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -Wall -Werror") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") diff --git a/examples/sdl3_renderer/main.c b/examples/SDL3-simple-demo/main.c similarity index 74% rename from examples/sdl3_renderer/main.c rename to examples/SDL3-simple-demo/main.c index d00b130..54030c5 100644 --- a/examples/sdl3_renderer/main.c +++ b/examples/SDL3-simple-demo/main.c @@ -6,6 +6,8 @@ #define CLAY_IMPLEMENTATION #include "../../clay.h" +#include "../../renderers/SDL3/clay_renderer_SDL3.c" + static const Uint32 FONT_ID = 0; static const Clay_Color COLOR_ORANGE = (Clay_Color) {225, 138, 50, 255}; @@ -17,10 +19,6 @@ typedef struct app_state { SDL_Renderer *renderer; } AppState; -/* This needs to be global because the "MeasureText" callback doesn't have a - * user data parameter */ -static TTF_Font *gFonts[1]; - static inline Clay_Dimensions SDL_MeasureText(Clay_String *text, Clay_TextElementConfig *config) { TTF_Font *font = gFonts[config->fontId]; @@ -72,39 +70,6 @@ static Clay_RenderCommandArray Clay_CreateLayout() return Clay_EndLayout(); } -static void SDL_RenderClayCommands(SDL_Renderer *renderer, Clay_RenderCommandArray *rcommands) -{ - for (size_t i = 0; i < rcommands->length; i++) { - Clay_RenderCommand *rcmd = Clay_RenderCommandArray_Get(rcommands, i); - Clay_BoundingBox bounding_box = rcmd->boundingBox; - SDL_FRect rect = { bounding_box.x, bounding_box.y, bounding_box.width, bounding_box.height }; - - switch (rcmd->commandType) { - case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { - Clay_RectangleElementConfig *config = rcmd->config.rectangleElementConfig; - Clay_Color color = config->color; - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); - SDL_RenderFillRect(renderer, &rect); - } break; - case CLAY_RENDER_COMMAND_TYPE_TEXT: { - Clay_TextElementConfig *config = rcmd->config.textElementConfig; - Clay_String *text = &rcmd->text; - SDL_Color color = { config->textColor.r, config->textColor.g, config->textColor.b, config->textColor.a }; - - TTF_Font *font = gFonts[config->fontId]; - SDL_Surface *surface = TTF_RenderText_Blended(font, text->chars, text->length, color); - SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surface); - SDL_RenderTexture(renderer, texture, NULL, &rect); - - SDL_DestroySurface(surface); - SDL_DestroyTexture(texture); - } break; - default: - SDL_Log("Unknown render command type: %d", rcmd->commandType); - } - } -} - void HandleClayErrors(Clay_ErrorData errorData) { printf("%s", errorData.errorText.chars); } diff --git a/examples/sdl3_renderer/resources/Roboto-Regular.ttf b/examples/SDL3-simple-demo/resources/Roboto-Regular.ttf similarity index 100% rename from examples/sdl3_renderer/resources/Roboto-Regular.ttf rename to examples/SDL3-simple-demo/resources/Roboto-Regular.ttf diff --git a/renderers/SDL2/clay_renderer_SDL2.c b/renderers/SDL2/clay_renderer_SDL2.c index 30eb8a4..1c9ba5c 100644 --- a/renderers/SDL2/clay_renderer_SDL2.c +++ b/renderers/SDL2/clay_renderer_SDL2.c @@ -4,6 +4,39 @@ #include #include +static void SDL_RenderClayCommands(SDL_Renderer *renderer, Clay_RenderCommandArray *rcommands) +{ + for (size_t i = 0; i < rcommands->length; i++) { + Clay_RenderCommand *rcmd = Clay_RenderCommandArray_Get(rcommands, i); + Clay_BoundingBox bounding_box = rcmd->boundingBox; + SDL_FRect rect = { bounding_box.x, bounding_box.y, bounding_box.width, bounding_box.height }; + + switch (rcmd->commandType) { + case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { + Clay_RectangleElementConfig *config = rcmd->config.rectangleElementConfig; + Clay_Color color = config->color; + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); + SDL_RenderFillRect(renderer, &rect); + } break; + case CLAY_RENDER_COMMAND_TYPE_TEXT: { + Clay_TextElementConfig *config = rcmd->config.textElementConfig; + Clay_String *text = &rcmd->text; + SDL_Color color = { config->textColor.r, config->textColor.g, config->textColor.b, config->textColor.a }; + + TTF_Font *font = gFonts[config->fontId]; + SDL_Surface *surface = TTF_RenderText_Blended(font, text->chars, text->length, color); + SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_RenderTexture(renderer, texture, NULL, &rect); + + SDL_DestroySurface(surface); + SDL_DestroyTexture(texture); + } break; + default: + SDL_Log("Unknown render command type: %d", rcmd->commandType); + } + } +} + #define CLAY_COLOR_TO_SDL_COLOR_ARGS(color) color.r, color.g, color.b, color.a typedef struct diff --git a/renderers/SDL3/README b/renderers/SDL3/README new file mode 100644 index 0000000..f960b09 --- /dev/null +++ b/renderers/SDL3/README @@ -0,0 +1,6 @@ +Please note, the SDL3 renderer is not 100% feature complete. It is currently missing: + +- Rounded rectangle corners +- Borders +- Images +- Scroll / Scissor handling diff --git a/renderers/SDL3/clay_renderer_SDL3.c b/renderers/SDL3/clay_renderer_SDL3.c new file mode 100644 index 0000000..b65f4c3 --- /dev/null +++ b/renderers/SDL3/clay_renderer_SDL3.c @@ -0,0 +1,41 @@ +#include "../../clay.h" +#include +#include +#include + +/* This needs to be global because the "MeasureText" callback doesn't have a + * user data parameter */ +static TTF_Font *gFonts[1]; + +static void SDL_RenderClayCommands(SDL_Renderer *renderer, Clay_RenderCommandArray *rcommands) +{ + for (size_t i = 0; i < rcommands->length; i++) { + Clay_RenderCommand *rcmd = Clay_RenderCommandArray_Get(rcommands, i); + Clay_BoundingBox bounding_box = rcmd->boundingBox; + SDL_FRect rect = { bounding_box.x, bounding_box.y, bounding_box.width, bounding_box.height }; + + switch (rcmd->commandType) { + case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { + Clay_RectangleElementConfig *config = rcmd->config.rectangleElementConfig; + Clay_Color color = config->color; + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); + SDL_RenderFillRect(renderer, &rect); + } break; + case CLAY_RENDER_COMMAND_TYPE_TEXT: { + Clay_TextElementConfig *config = rcmd->config.textElementConfig; + Clay_String *text = &rcmd->text; + SDL_Color color = { config->textColor.r, config->textColor.g, config->textColor.b, config->textColor.a }; + + TTF_Font *font = gFonts[config->fontId]; + SDL_Surface *surface = TTF_RenderText_Blended(font, text->chars, text->length, color); + SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_RenderTexture(renderer, texture, NULL, &rect); + + SDL_DestroySurface(surface); + SDL_DestroyTexture(texture); + } break; + default: + SDL_Log("Unknown render command type: %d", rcmd->commandType); + } + } +}