The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

#ifndef aTHX_
#define aTHX_
#endif

#include <SDL.h>

#ifdef HAVE_SDL_IMAGE
#include <SDL_image.h>
#endif 

void test( char** xpm)
{

int x, y;
int w, h, ncolors, cpp;
char *line;
char ***xpmlines = NULL;


xpmlines = &xpm;

line = *(*xpmlines)++;

if(sscanf(line, "%d %d %d %d", &w, &h, &ncolors, &cpp) != 4
	   || w <= 0 || h <= 0 || ncolors <= 0 || cpp <= 0) {
		warn( "Invalid format description %s \n  %d %d %d %d", line, w, h, ncolors, cpp);
	}


}




MODULE = SDL::Image 	PACKAGE = SDL::Image    PREFIX = image_

#ifdef HAVE_SDL_IMAGE

const SDL_version*
image_linked_version()
	PREINIT:
		char* CLASS = "SDL::Version";
		SDL_version *version;
	CODE:
		version = (SDL_version *) safemalloc ( sizeof(SDL_version) );
		SDL_version* version_dont_free = (SDL_version *)IMG_Linked_Version();

		version->major = version_dont_free->major;
		version->minor = version_dont_free->minor;
		version->patch = version_dont_free->patch;
		RETVAL = version;
	OUTPUT:
		RETVAL

#if (SDL_IMAGE_MAJOR_VERSION >= 1) && (SDL_IMAGE_MINOR_VERSION >= 2) && (SDL_IMAGE_PATCHLEVEL >= 10)

int
image_init(flags)
	int flags
	CODE:
		RETVAL = IMG_Init(flags);
	OUTPUT:
		RETVAL 

void
image_quit()
	CODE:
		IMG_Quit();

#endif

SDL_Surface *
image_load ( filename )
	char *filename
	CODE:
		char* CLASS = "SDL::Surface";
		RETVAL = IMG_Load(filename);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_rw ( rw_file, src )
	SDL_RWops *rw_file
	int src
	PREINIT:
		char* CLASS = "SDL::Surface";
	CODE:
		RETVAL = IMG_Load_RW(rw_file, src);
	OUTPUT:
		RETVAL  

SDL_Surface * 
image_load_typed_rw(src, freesrc, type)
	SDL_RWops* src
	int freesrc
	char* type
	PREINIT:
		char* CLASS = "SDL::Surface";
	CODE:
		RETVAL = IMG_LoadTyped_RW(src, freesrc, type);
	OUTPUT:
		RETVAL

#if (SDL_IMAGE_MAJOR_VERSION >= 1) && (SDL_IMAGE_MINOR_VERSION >= 2) && (SDL_IMAGE_PATCHLEVEL >= 10)

SDL_Surface *
image_load_ICO_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadICO_RW(src);
	OUTPUT:
		RETVAL


SDL_Surface *
image_load_CUR_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadCUR_RW(src);
	OUTPUT:
		RETVAL

#endif

SDL_Surface *
image_load_BMP_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadBMP_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_GIF_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadGIF_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_JPG_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadJPG_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_LBM_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadLBM_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_PCX_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadPCX_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_PNG_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadPNG_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_PNM_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadPNM_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_TGA_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadTGA_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_TIF_rw(src)
	SDL_RWops* src
 	PREINIT:
 	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadTIF_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_XCF_rw(src)
	SDL_RWops* src
	PREINIT:
 	 	 char *CLASS = "SDL::Surface"; 
 	CODE:
		RETVAL = IMG_LoadXCF_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_XPM_rw(src)
	SDL_RWops* src
	PREINIT:
 	 	 char *CLASS = "SDL::Surface"; 
 	CODE:
		RETVAL = IMG_LoadXPM_RW(src);
	OUTPUT:
		RETVAL

SDL_Surface *
image_load_XV_rw(src)
	SDL_RWops* src
	PREINIT:
	 	 char *CLASS = "SDL::Surface";
 	CODE:
		RETVAL = IMG_LoadXV_RW(src);
	OUTPUT:
		RETVAL


int image_is_BMP(src)
	SDL_RWops* src;
	CODE:
		RETVAL=IMG_isBMP(src);
	OUTPUT:
		RETVAL

#if (SDL_IMAGE_MAJOR_VERSION >= 1) && (SDL_IMAGE_MINOR_VERSION >= 2) && (SDL_IMAGE_PATCHLEVEL >= 10)

int image_is_CUR(src)
	SDL_RWops* src;
	CODE:
		RETVAL=IMG_isCUR(src);
	OUTPUT:
		RETVAL


int image_is_ICO(src)
	SDL_RWops* src;
	CODE:
		RETVAL=IMG_isICO(src);
	OUTPUT:
		RETVAL

#endif

int 
image_is_GIF(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isGIF(src);
	OUTPUT:
		RETVAL

int 
image_is_JPG(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isJPG(src);
	OUTPUT:
		RETVAL

int 
image_is_LBM(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isLBM(src);
	OUTPUT:
		RETVAL

int 
image_is_PCX(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isPCX(src);
	OUTPUT:
		RETVAL

int 
image_is_PNG(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isPNG(src);
	OUTPUT:
		RETVAL

int 
image_is_PNM(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isPNM(src);
	OUTPUT:
		RETVAL

int 
image_is_TIF(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isTIF(src);
	OUTPUT:
		RETVAL

int 
image_is_XCF(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isXCF(src);
	OUTPUT:
		RETVAL

int 
image_is_XPM(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isXPM(src);
	OUTPUT:
		RETVAL

int 
image_is_XV(src)
	 SDL_RWops * src;
	CODE:
		RETVAL=IMG_isXV(src);
	OUTPUT:
		RETVAL



SDL_Surface *
image_read_XPM_from_array(array, w)
	int w
	AV* array 
	PREINIT:
		char* CLASS = "SDL::Surface";
	CODE:
		/*make columns first */
		int x, len;
		SV ** elem;
		len = av_len(array) + 1;
		char** src_x = safemalloc( len * sizeof(char*));
		char* temp;
		for(x=0; x < len ; x++)
		{
			 elem =  av_fetch(array, x, 0) ;
			 temp = SvPV_nolen(*elem);
			src_x[x] = safemalloc(w * sizeof(char) );
			memcpy( src_x[x], temp, w * sizeof(char) );
			/*warn("put in %s", src_x[x]); */
		}
	  		/*test(src_x);  */
		RETVAL = IMG_ReadXPMFromArray( src_x) ;
		for(x=0; x < len; x++)
		  safefree(src_x[x]);
		safefree(src_x);
	
	OUTPUT:
		RETVAL





#endif