2024-10-13 21:48:11 -04:00
/*
* This example creates an SDL window and renderer , and then draws some text
* using SDL_RenderDebugText ( ) every frame .
*
* This code is public domain . Feel free to use it for any purpose !
*/
# define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */
# include <SDL3/SDL.h>
# include <SDL3/SDL_main.h>
/* We will use this renderer to draw into this window every frame. */
static SDL_Window * window = NULL ;
static SDL_Renderer * renderer = NULL ;
# define WINDOW_WIDTH 640
# define WINDOW_HEIGHT 480
/* This function runs once at startup. */
SDL_AppResult SDL_AppInit ( void * * appstate , int argc , char * argv [ ] )
{
SDL_SetAppMetadata ( " Example Renderer Debug Texture " , " 1.0 " , " com.example.renderer-debug-text " ) ;
if ( ! SDL_Init ( SDL_INIT_VIDEO ) ) {
SDL_Log ( " Couldn't initialize SDL: %s " , SDL_GetError ( ) ) ;
return SDL_APP_FAILURE ;
}
2025-10-07 17:40:17 +01:00
if ( ! SDL_CreateWindowAndRenderer ( " examples/renderer/debug-text " , WINDOW_WIDTH , WINDOW_HEIGHT , SDL_WINDOW_RESIZABLE , & window , & renderer ) ) {
2024-10-13 21:48:11 -04:00
SDL_Log ( " Couldn't create window/renderer: %s " , SDL_GetError ( ) ) ;
return SDL_APP_FAILURE ;
}
2025-10-07 17:40:17 +01:00
SDL_SetRenderLogicalPresentation ( renderer , WINDOW_WIDTH , WINDOW_HEIGHT , SDL_LOGICAL_PRESENTATION_LETTERBOX ) ;
2024-10-13 21:48:11 -04:00
return SDL_APP_CONTINUE ; /* carry on with the program! */
}
/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
SDL_AppResult SDL_AppEvent ( void * appstate , SDL_Event * event )
{
if ( event - > type = = SDL_EVENT_QUIT ) {
return SDL_APP_SUCCESS ; /* end the program, reporting success to the OS. */
}
return SDL_APP_CONTINUE ; /* carry on with the program! */
}
/* This function runs once per frame, and is the heart of the program. */
SDL_AppResult SDL_AppIterate ( void * appstate )
{
2024-12-18 02:05:53 -05:00
const int charsize = SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE ;
2024-10-13 21:48:11 -04:00
/* as you can see from this, rendering draws over whatever was drawn before it. */
2024-10-23 13:44:28 +02:00
SDL_SetRenderDrawColor ( renderer , 0 , 0 , 0 , SDL_ALPHA_OPAQUE ) ; /* black, full alpha */
2024-10-13 21:48:11 -04:00
SDL_RenderClear ( renderer ) ; /* start with a blank canvas. */
2024-10-23 13:44:28 +02:00
SDL_SetRenderDrawColor ( renderer , 255 , 255 , 255 , SDL_ALPHA_OPAQUE ) ; /* white, full alpha */
2024-10-13 21:48:11 -04:00
SDL_RenderDebugText ( renderer , 272 , 100 , " Hello world! " ) ;
SDL_RenderDebugText ( renderer , 224 , 150 , " This is some debug text. " ) ;
2024-10-23 13:44:28 +02:00
SDL_SetRenderDrawColor ( renderer , 51 , 102 , 255 , SDL_ALPHA_OPAQUE ) ; /* light blue, full alpha */
2024-10-13 21:48:11 -04:00
SDL_RenderDebugText ( renderer , 184 , 200 , " You can do it in different colors. " ) ;
2024-10-23 13:44:28 +02:00
SDL_SetRenderDrawColor ( renderer , 255 , 255 , 255 , SDL_ALPHA_OPAQUE ) ; /* white, full alpha */
2024-10-13 21:48:11 -04:00
SDL_SetRenderScale ( renderer , 4.0f , 4.0f ) ;
SDL_RenderDebugText ( renderer , 14 , 65 , " It can be scaled. " ) ;
SDL_SetRenderScale ( renderer , 1.0f , 1.0f ) ;
SDL_RenderDebugText ( renderer , 64 , 350 , " This only does ASCII chars. So this laughing emoji won't draw: 🤣 " ) ;
2024-12-07 00:14:55 -05:00
2024-12-18 02:05:53 -05:00
SDL_RenderDebugTextFormat ( renderer , ( float ) ( ( WINDOW_WIDTH - ( charsize * 46 ) ) / 2 ) , 400 , " (This program has been running for % " SDL_PRIu64 " seconds.) " , SDL_GetTicks ( ) / 1000 ) ;
2024-12-07 00:14:55 -05:00
2024-10-13 21:48:11 -04:00
SDL_RenderPresent ( renderer ) ; /* put it all on the screen! */
return SDL_APP_CONTINUE ; /* carry on with the program! */
}
/* This function runs once at shutdown. */
void SDL_AppQuit ( void * appstate , SDL_AppResult result )
{
/* SDL will clean up the window/renderer for us. */
}