mirror of
				https://github.com/nicbarker/clay.git
				synced 2025-11-04 08:36:17 +00:00 
			
		
		
		
	[Renderers/SDL3] Add image rendering and scissor support to SDL3 renderer (#246)
This commit is contained in:
		
							parent
							
								
									eeb4520f48
								
							
						
					
					
						commit
						bc2548e3ec
					
				| 
						 | 
				
			
			@ -14,7 +14,7 @@ set(FETCHCONTENT_QUIET FALSE)
 | 
			
		|||
FetchContent_Declare(
 | 
			
		||||
	SDL
 | 
			
		||||
	GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
 | 
			
		||||
	GIT_TAG preview-3.1.6
 | 
			
		||||
	GIT_TAG release-3.2.4
 | 
			
		||||
	GIT_SHALLOW TRUE
 | 
			
		||||
	GIT_PROGRESS TRUE
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -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 release-3.2.0 # 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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										
											BIN
										
									
								
								examples/SDL3-simple-demo/resources/sample.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								examples/SDL3-simple-demo/resources/sample.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 850 B  | 
| 
						 | 
				
			
			@ -1,4 +0,0 @@
 | 
			
		|||
Please note, the SDL3 renderer is not 100% feature complete. It is currently missing:
 | 
			
		||||
 | 
			
		||||
- Images
 | 
			
		||||
- Scroll / Scissor handling
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
#include <SDL3/SDL_main.h>
 | 
			
		||||
#include <SDL3/SDL.h>
 | 
			
		||||
#include <SDL3_ttf/SDL_ttf.h>
 | 
			
		||||
#include <SDL3_image/SDL_image.h>
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    SDL_Renderer *renderer;
 | 
			
		||||
| 
						 | 
				
			
			@ -140,12 +141,14 @@ static void SDL_Clay_RenderArc(Clay_SDL3RendererData *rendererData, const SDL_FP
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SDL_Rect currentClippingRectangle;
 | 
			
		||||
 | 
			
		||||
static void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Clay_RenderCommandArray *rcommands)
 | 
			
		||||
{
 | 
			
		||||
    for (size_t i = 0; i < rcommands->length; i++) {
 | 
			
		||||
        Clay_RenderCommand *rcmd = Clay_RenderCommandArray_Get(rcommands, i);
 | 
			
		||||
        const Clay_BoundingBox bounding_box = rcmd->boundingBox;
 | 
			
		||||
        const SDL_FRect rect = { bounding_box.x, bounding_box.y, bounding_box.width, bounding_box.height };
 | 
			
		||||
        const SDL_FRect rect = { (int)bounding_box.x, (int)bounding_box.y, (int)bounding_box.width, (int)bounding_box.height };
 | 
			
		||||
 | 
			
		||||
        switch (rcmd->commandType) {
 | 
			
		||||
            case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: {
 | 
			
		||||
| 
						 | 
				
			
			@ -231,6 +234,30 @@ static void SDL_Clay_RenderClayCommands(Clay_SDL3RendererData *rendererData, Cla
 | 
			
		|||
                }
 | 
			
		||||
 | 
			
		||||
            } break;
 | 
			
		||||
            case CLAY_RENDER_COMMAND_TYPE_SCISSOR_START: {
 | 
			
		||||
                Clay_BoundingBox boundingBox = rcmd->boundingBox;
 | 
			
		||||
                currentClippingRectangle = (SDL_Rect) {
 | 
			
		||||
                        .x = boundingBox.x,
 | 
			
		||||
                        .y = boundingBox.y,
 | 
			
		||||
                        .w = boundingBox.width,
 | 
			
		||||
                        .h = boundingBox.height,
 | 
			
		||||
                };
 | 
			
		||||
                SDL_SetRenderClipRect(rendererData->renderer, ¤tClippingRectangle);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case CLAY_RENDER_COMMAND_TYPE_SCISSOR_END: {
 | 
			
		||||
                SDL_SetRenderClipRect(rendererData->renderer, NULL);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case CLAY_RENDER_COMMAND_TYPE_IMAGE: {
 | 
			
		||||
                SDL_Surface *image = (SDL_Surface *)rcmd->renderData.image.imageData;
 | 
			
		||||
                SDL_Texture *texture = SDL_CreateTextureFromSurface(rendererData->renderer, image);
 | 
			
		||||
                const SDL_FRect dest = { rect.x, rect.y, rect.w, rect.h };
 | 
			
		||||
 | 
			
		||||
                SDL_RenderTexture(rendererData->renderer, texture, NULL, &dest);
 | 
			
		||||
                SDL_DestroyTexture(texture);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            default:
 | 
			
		||||
                SDL_Log("Unknown render command type: %d", rcmd->commandType);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue