Reputation: 13
To load .png file to window using SDL3 and SDL2_image library, I downloaded the following code from the link below:
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3_image/SDL_image.h>
#include <string>
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
//Starts up SDL and creates window
bool init();
//Loads media
bool loadMedia();
//Frees media and shuts down SDL
void close();
//Loads individual image
SDL_Surface* loadSurface( std::string path );
//The window we'll be rendering to
SDL_Window* gWindow = NULL;
//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;
//Current displayed PNG image
SDL_Surface* gPNGSurface = NULL;
bool init()
{
//Initialization flag
bool success = true;
//Initialize SDL
if( !SDL_Init( SDL_INIT_VIDEO ) )
{
SDL_Log( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Create window
gWindow = SDL_CreateWindow( "SDL Tutorial", SCREEN_WIDTH, SCREEN_HEIGHT, 0 );
if( gWindow == NULL )
{
SDL_Log( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;
if( !( IMG_Init( imgFlags ) & imgFlags ) )
{
SDL_Log( "SDL_image could not initialize! SDL_image Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Get window surface
gScreenSurface = SDL_GetWindowSurface( gWindow );
}
}
}
return success;
}
bool loadMedia()
{
//Loading success flag
bool success = true;
//Load PNG surface
gPNGSurface = loadSurface( "loaded.png" );
if( gPNGSurface == NULL )
{
SDL_Log( "Failed to load PNG image!\n" );
success = false;
}
return success;
}
void close()
{
//Free loaded image
SDL_DestroySurface( gPNGSurface );
gPNGSurface = NULL;
//Destroy window
SDL_DestroyWindow( gWindow );
gWindow = NULL;
//Quit SDL subsystems
IMG_Quit();
SDL_Quit();
}
SDL_Surface* loadSurface( std::string path )
{
//The final optimized image
SDL_Surface* optimizedSurface = NULL;
//Load image at specified path
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
if( loadedSurface == NULL )
{
SDL_Log( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), SDL_GetError() );
}
else
{
//Convert surface to screen format
optimizedSurface = SDL_ConvertSurface( loadedSurface, gScreenSurface->format );
if( optimizedSurface == NULL )
{
SDL_Log( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
//Get rid of old loaded surface
SDL_DestroySurface( loadedSurface );
}
return optimizedSurface;
}
int main( int argc, char* args[] )
{
//Start up SDL and create window
if( !init() )
{
SDL_Log( "Failed to initialize!\n" );
}
else
{
//Load media
if( !loadMedia() )
{
SDL_Log( "Failed to load media!\n" );
}
else
{
//Main loop flag
bool quit = false;
//Event handler
SDL_Event e;
//While application is running
while( !quit )
{
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_EVENT_QUIT )
{
quit = true;
}
}
//Apply the PNG image
SDL_BlitSurface( gPNGSurface, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
}
}
}
//Free resources and close SDL
close();
return 0;
}
To setup SDL3 and SDL_Image library:
https://github.com/libsdl-org/SDL/releases/tag/preview-3.1.6
https://github.com/libsdl-org/SDL_image/releases
686-w64-mingw32 x86_64-w64-mingw32 cmake
https://github.com/libsdl-org/SDL_image/blob/main/include/SDL3_image/SDL_image.h
For project settings in CodeBlocks 20.03 32 bit:
SDL3.dll SDL2_image.dll
The program compiles without any problems, but when I run it, it gives the error "SDL2.dll not found".
The examples except loading .png files with SDL3 work fine. Could there be a bug in loading the SDL3_image library or what am I missing?
Both settings below have the same functionality and give "undefined reference to 'IMG_Init'" error message
Build log
Upvotes: 0
Views: 147
Reputation: 96689
SDL2_image
, as the name implies, is for SDL2, not for SDL3.
It seems a version of SDL_image for SDL3 wasn't released yet, but but they do support SDL3 in their main
branch. So you'll have to build SDL_image from source.
Upvotes: 1