module graphics.bindings.devil;

import std.string;

version(Windows)
{
	import std.c.windows.windows;
}
else version(linux)
{
	import std.c.linux.linux;
}
else
{
	static assert(false);
}

public immutable uint IL_COLOUR_INDEX     = 0x1900;
public immutable uint IL_COLOR_INDEX      = 0x1900;
public immutable uint IL_ALPHA			  = 0x1906;
public immutable uint IL_RGB              = 0x1907;
public immutable uint IL_RGBA             = 0x1908;
public immutable uint IL_BGR              = 0x80E0;
public immutable uint IL_BGRA             = 0x80E1;
public immutable uint IL_LUMINANCE        = 0x1909;
public immutable uint IL_LUMINANCE_ALPHA  = 0x190A;

public immutable uint IL_BYTE           = 0x1400;
public immutable uint IL_UNSIGNED_BYTE  = 0x1401;
public immutable uint IL_SHORT          = 0x1402;
public immutable uint IL_UNSIGNED_SHORT = 0x1403;
public immutable uint IL_INT            = 0x1404;
public immutable uint IL_UNSIGNED_INT   = 0x1405;
public immutable uint IL_FLOAT          = 0x1406;
public immutable uint IL_DOUBLE         = 0x140A;
public immutable uint IL_HALF           = 0x140B;

//Image Types
public immutable uint IL_TYPE_UNKNOWN = 0x0000;
public immutable uint IL_BMP          = 0x0420;  //!< Microsoft Windows Bitmap - .bmp extension
public immutable uint IL_CUT          = 0x0421;  //!< Dr. Halo - .cut extension
public immutable uint IL_DOOM         = 0x0422;  //!< DooM walls - no specific extension
public immutable uint IL_DOOM_FLAT    = 0x0423;  //!< DooM flats - no specific extension
public immutable uint IL_ICO          = 0x0424;  //!< Microsoft Windows Icons and Cursors - .ico and .cur extensions
public immutable uint IL_JPG          = 0x0425;  //!< JPEG - .jpg, .jpe and .jpeg extensions
public immutable uint IL_JFIF         = 0x0425;  //!<
public immutable uint IL_ILBM         = 0x0426;  //!< Amiga IFF (FORM ILBM) - .iff, .ilbm, .lbm extensions
public immutable uint IL_PCD          = 0x0427;  //!< Kodak PhotoCD - .pcd extension
public immutable uint IL_PCX          = 0x0428;  //!< ZSoft PCX - .pcx extension
public immutable uint IL_PIC          = 0x0429;  //!< PIC - .pic extension
public immutable uint IL_PNG          = 0x042A;  //!< Portable Network Graphics - .png extension
public immutable uint IL_PNM          = 0x042B;  //!< Portable Any Map - .pbm, .pgm, .ppm and .pnm extensions
public immutable uint IL_SGI          = 0x042C;  //!< Silicon Graphics - .sgi, .bw, .rgb and .rgba extensions
public immutable uint IL_TGA          = 0x042D;  //!< TrueVision Targa File - .tga, .vda, .icb and .vst extensions
public immutable uint IL_TIF          = 0x042E;  //!< Tagged Image File Format - .tif and .tiff extensions
public immutable uint IL_CHEAD        = 0x042F;  //!< C-Style Header - .h extension
public immutable uint IL_RAW          = 0x0430;  //!< Raw Image Data - any extension
public immutable uint IL_MDL          = 0x0431;  //!< Half-Life Model Texture - .mdl extension
public immutable uint IL_WAL          = 0x0432;  //!< Quake 2 Texture - .wal extension
public immutable uint IL_LIF          = 0x0434;  //!< Homeworld Texture - .lif extension
public immutable uint IL_MNG          = 0x0435;  //!< Multiple-image Network Graphics - .mng extension
public immutable uint IL_JNG          = 0x0435;  //!< 
public immutable uint IL_GIF          = 0x0436;  //!< Graphics Interchange Format - .gif extension
public immutable uint IL_DDS          = 0x0437;  //!< DirectDraw Surface - .dds extension
public immutable uint IL_DCX          = 0x0438;  //!< ZSoft Multi-PCX - .dcx extension
public immutable uint IL_PSD          = 0x0439;  //!< Adobe PhotoShop - .psd extension
public immutable uint IL_EXIF         = 0x043A;  //!< 
public immutable uint IL_PSP          = 0x043B;  //!< PaintShop Pro - .psp extension
public immutable uint IL_PIX          = 0x043C;  //!< PIX - .pix extension
public immutable uint IL_PXR          = 0x043D;  //!< Pixar - .pxr extension
public immutable uint IL_XPM          = 0x043E;  //!< X Pixel Map - .xpm extension
public immutable uint IL_HDR          = 0x043F;  //!< Radiance High Dynamic Range - .hdr extension
public immutable uint IL_ICNS			= 0x0440;  //!< Macintosh Icon - .icns extension
public immutable uint IL_JP2			= 0x0441;  //!< Jpeg 2000 - .jp2 extension
public immutable uint IL_EXR			= 0x0442;  //!< OpenEXR - .exr extension
public immutable uint IL_WDP			= 0x0443;  //!< Microsoft HD Photo - .wdp and .hdp extension
public immutable uint IL_VTF			= 0x0444;  //!< Valve Texture Format - .vtf extension
public immutable uint IL_WBMP			= 0x0445;  //!< Wireless Bitmap - .wbmp extension
public immutable uint IL_SUN			= 0x0446;  //!< Sun Raster - .sun, .ras, .rs, .im1, .im8, .im24 and .im32 extensions
public immutable uint IL_IFF			= 0x0447;  //!< Interchange File Format - .iff extension
public immutable uint IL_TPL			= 0x0448;  //!< Gamecube Texture - .tpl extension
public immutable uint IL_FITS			= 0x0449;  //!< Flexible Image Transport System - .fit and .fits extensions
public immutable uint IL_DICOM		= 0x044A;  //!< Digital Imaging and Communications in Medicine (DICOM) - .dcm and .dicom extensions
public immutable uint IL_IWI			= 0x044B;  //!< Call of Duty Infinity Ward Image - .iwi extension
public immutable uint IL_BLP			= 0x044C;  //!< Blizzard Texture Format - .blp extension
public immutable uint IL_FTX			= 0x044D;  //!< Heavy Metal: FAKK2 Texture - .ftx extension
public immutable uint IL_ROT			= 0x044E;  //!< Homeworld 2 - Relic Texture - .rot extension
public immutable uint IL_TEXTURE		= 0x044F;  //!< Medieval II: Total War Texture - .texture extension
public immutable uint IL_DPX			= 0x0450;  //!< Digital Picture Exchange - .dpx extension
public immutable uint IL_UTX			= 0x0451;  //!< Unreal (and Unreal Tournament) Texture - .utx extension
public immutable uint IL_MP3			= 0x0452;  //!< MPEG-1 Audio Layer 3 - .mp3 extension

// Origin Definitions
public immutable uint IL_ORIGIN_SET        = 0x0600;
public immutable uint IL_ORIGIN_LOWER_LEFT = 0x0601;
public immutable uint IL_ORIGIN_UPPER_LEFT = 0x0602;
public immutable uint IL_ORIGIN_MODE       = 0x0603;

// File definitions
public immutable uint IL_FILE_OVERWRITE	= 0x0620;
public immutable uint IL_FILE_MODE		= 0x0621;

public immutable uint IL_IMAGE_WIDTH	= 0x0DE4;
public immutable uint IL_IMAGE_HEIGHT	= 0x0DE5;
										    
public extern(System) void function(size_t, uint*) ilGenImages;
public extern(System) void function(uint) ilBindImage;
public extern(System) void function(uint, uint*) ilDeleteImages;
public extern(System) void function(uint, immutable(char)*) ilSave;
public extern(System) void function(immutable(char)*) ilLoadImage;
public extern(System) void function(immutable(char)*) ilSaveImage;
public extern(System) bool function(uint width, uint height, uint depth, ubyte Bpp, uint format, uint type, void* data) ilTexImage;
public extern(System) uint function() ilGetError;
public extern(System) void function() ilInit;
public extern(System) bool function(uint) ilOriginFunc;
public extern(System) bool function(uint) ilEnable;
public extern(System) bool function(uint) ilDisable;
public extern(System) int function(uint) ilGetInteger;
public extern(System) void function(uint, uint, uint, uint, uint, uint, uint, uint, void*) ilCopyPixels;

version(Windows)
{
	private HANDLE devilLibHandle;
}
else version(linux)
{
	private void* devilLibHandle;
}
else
{
	static assert(false);
}


private static this()
{
	version(Windows)
	{
		devilLibHandle = LoadLibraryA("DevIL.dll");
		
		ilGenImages = cast(void function(uint, uint*))GetProcAddress(devilLibHandle, "ilGenImages");
		ilBindImage = cast(void function(uint))GetProcAddress(devilLibHandle, "ilBindImage");
		ilDeleteImages = cast(void function(uint, uint*))GetProcAddress(devilLibHandle, "ilDeleteImages");
		ilSave = cast(void function(uint, immutable(char)*))GetProcAddress(devilLibHandle, "ilSave");
		ilSaveImage = cast(void function(immutable(char)*))GetProcAddress(devilLibHandle, "ilSaveImage");
		ilTexImage = cast(bool function(uint, uint, uint, ubyte, uint, uint, void*))GetProcAddress(devilLibHandle, "ilTexImage");
		ilGetError = cast(uint function())GetProcAddress(devilLibHandle, "ilGetError");
		ilInit = cast(void function())GetProcAddress(devilLibHandle, "ilInit");
		ilOriginFunc = cast(bool function(uint))GetProcAddress(devilLibHandle, "ilOriginFunc");
		ilEnable = cast(bool function(uint))GetProcAddress(devilLibHandle, "ilEnable");
		ilDisable = cast(bool function(uint))GetProcAddress(devilLibHandle, "ilDisable");
		ilGetInteger = cast(int function(uint))GetProcAddress(devilLibHandle, "ilGetInteger");
		ilLoadImage = cast(void function(immutable(char)*))GetProcAddress(devilLibHandle, "ilLoadImage");
		ilCopyPixels = cast(void function(uint, uint, uint, uint, uint, uint, uint, uint, void*))GetProcAddress(devilLibHandle, "ilCopyPixels");
	}
	else version(linux)
	{
		devilLibHandle = dlopen(std.string.toStringz("libIL.so"), RTLD_LAZY);
		
		ilGenImages = cast(void function(uint, uint*))dlsym(devilLibHandle, std.string.toStringz("ilGenImages"));
		ilBindImage = cast(void function(uint))dlsym(devilLibHandle, std.string.toStringz("ilBindImage"));
		ilDeleteImages = cast(void function(uint, uint*))dlsym(devilLibHandle, std.string.toStringz("ilDeleteImages"));
		ilSave = cast(void function(uint, immutable(char)*))dlsym(devilLibHandle, std.string.toStringz("ilSave"));
		ilSaveImage = cast(void function(immutable(char)*))dlsym(devilLibHandle, std.string.toStringz("ilSaveImage"));
		ilTexImage = cast(bool function(uint, uint, uint, ubyte, uint, uint, void*))dlsym(devilLibHandle, std.string.toStringz("ilTexImage"));
		ilGetError = cast(uint function())dlsym(devilLibHandle, std.string.toStringz("ilGetError"));
		ilInit = cast(void function())dlsym(devilLibHandle, std.string.toStringz("ilInit"));
		ilOriginFunc = cast(bool function(uint))dlsym(devilLibHandle, std.string.toStringz("ilOriginFunc"));
		ilEnable = cast(bool function(uint))dlsym(devilLibHandle, std.string.toStringz("ilEnable"));
		ilDisable = cast(bool function(uint))dlsym(devilLibHandle, std.string.toStringz("ilDisable"));
		ilGetInteger = cast(int function(uint))dlsym(devilLibHandle, std.string.toStringz("ilGetInteger"));
		ilLoadImage = cast(void function(immutable(char)*))dlsym(devilLibHandle, std.string.toStringz("ilLoadImage"));
		ilCopyPixels = cast(void function(uint, uint, uint, uint, uint, uint, uint, uint, void*))dlsym(devilLibHandle, std.string.toStringz("ilCopyPixels"));
	}
	else
	{
		static assert(false);
	}
}

private static ~this()
{
}
