#include <SDL3_image/SDL_image.h>
#ifdef PNG_USES_IMAGEIO
#include "IMG_ImageIO.h"
#endif
#include "IMG.h"
#include "IMG_libpng.h"
#include "IMG_WIC.h"
#if !defined(SAVE_PNG)
#define SAVE_PNG 1
#endif
#if defined(LOAD_PNG)
bool IMG_isPNG(SDL_IOStream *src)
{
Sint64 start;
bool is_PNG;
Uint8 magic[4];
if (!src) {
return false;
}
start = SDL_TellIO(src);
is_PNG = false;
if (SDL_ReadIO(src, magic, sizeof(magic)) == sizeof(magic)) {
if (magic[0] == 0x89 &&
magic[1] == 'P' &&
magic[2] == 'N' &&
magic[3] == 'G') {
is_PNG = true;
}
}
SDL_SeekIO(src, start, SDL_IO_SEEK_SET);
return is_PNG;
}
SDL_Surface *IMG_LoadPNG_IO(SDL_IOStream *src)
{
#ifdef SDL_IMAGE_LIBPNG
if (IMG_InitPNG()) {
return IMG_LoadPNG_LIBPNG(src);
}
#endif
#if defined(SDL_IMAGE_USE_WIC_BACKEND)
if (WIC_Init()) {
return WIC_LoadImage(src);
}
#endif
#ifdef PNG_USES_IMAGEIO
return IMG_LoadPNG_ImageIO(src);
#else
return SDL_LoadPNG_IO(src, false);
#endif
}
#else
bool IMG_isPNG(SDL_IOStream *src)
{
return false;
}
SDL_Surface *IMG_LoadPNG_IO(SDL_IOStream *src)
{
SDL_SetError("SDL_image built without PNG support");
return NULL;
}
#endif
#if SAVE_PNG
bool IMG_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio)
{
if (!IMG_VerifyCanSaveSurface(surface)) {
return false;
}
#ifdef SDL_IMAGE_LIBPNG
if (IMG_InitPNG()) {
return IMG_SavePNG_LIBPNG(surface, dst, closeio);
}
#endif
return SDL_SavePNG_IO(surface, dst, closeio);
}
bool IMG_SavePNG(SDL_Surface *surface, const char *file)
{
if (!IMG_VerifyCanSaveSurface(surface)) {
return false;
}
SDL_IOStream *dst = SDL_IOFromFile(file, "wb");
if (dst) {
return IMG_SavePNG_IO(surface, dst, true);
} else {
return false;
}
}
#else
bool IMG_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio)
{
return SDL_SetError("SDL_image built without PNG save support");
}
bool IMG_SavePNG(SDL_Surface *surface, const char *file)
{
return SDL_SetError("SDL_image built without PNG save support");
}
#endif