//-----------------------------------------------------------------------------
//
// ImageLib Sources
// Copyright (C) 2000-2009 by Denton Woods
// Last modified: 01/06/2009
//
// Filename: IL/devil_internal_exports.h
//
// Description: Internal stuff for DevIL (IL, ILU and ILUT)
//
//-----------------------------------------------------------------------------

#ifndef IL_EXPORTS_H
#define IL_EXPORTS_H

#include "IL/il.h"

#ifdef DEBUG
	#include <assert.h>
#else
	#define assert(x)
#endif

//#ifndef NOINLINE
#ifndef INLINE
#if defined(__GNUC__)
	#define INLINE extern inline
#elif defined(_MSC_VER)	//@TODO: Get this working in MSVC++.
						//  http://www.greenend.org.uk/rjk/2003/03/inline.html
	#define NOINLINE
	//#define INLINE
	/*#ifndef _WIN64  // Cannot use inline assembly in x64 target platform.
		#define USE_WIN32_ASM
	#endif//_WIN64*/
	#define INLINE __inline
#else
	#define INLINE inline
#endif
#endif
//#else
//#define INLINE
//#endif //NOINLINE

#ifdef __cplusplus
extern "C" {
#endif

#define IL_MAX(a,b) (((a) > (b)) ? (a) : (b))
#define IL_MIN(a,b) (((a) < (b)) ? (a) : (b))


//! Basic Palette struct
typedef struct ILpal
{
	ILubyte* Palette; //!< the image palette (if any)
	ILuint   PalSize; //!< size of the palette (in bytes)
	ILenum   PalType; //!< the palette types in il.h (0x0500 range)
} ILpal;


//! The Fundamental Image structure
/*! Every bit of information about an image is stored in this internal structure.*/
typedef struct ILimage
{
	ILuint          Width;       //!< the image's width
	ILuint          Height;      //!< the image's height
	ILuint          Depth;       //!< the image's depth
	ILubyte         Bpp;         //!< bytes per pixel (now number of channels)
	ILubyte         Bpc;         //!< bytes per channel
	ILuint          Bps;         //!< bytes per scanline (components for IL)
	ILubyte*        Data;        //!< the image data
	ILuint          SizeOfData;  //!< the total size of the data (in bytes)
	ILuint          SizeOfPlane; //!< SizeOfData in a 2d image, size of each plane slice in a 3d image (in bytes)
	ILenum          Format;      //!< image format (in IL enum style)
	ILenum          Type;        //!< image type (in IL enum style)
	ILenum          Origin;      //!< origin of the image
	ILpal           Pal;         //!< palette details
	ILuint          Duration;    //!< length of the time to display this "frame"
	ILenum          CubeFlags;   //!< cube map flags for sides present in chain
	struct ILimage* Mipmaps;     //!< mipmapped versions of this image terminated by a NULL - usu. NULL
	struct ILimage* Next;        //!< next image in the chain - usu. NULL
	struct ILimage* Faces;       //!< next cubemap face in the chain - usu. NULL
	struct ILimage* Layers;      //!< subsequent layers in the chain - usu. NULL
	ILuint*         AnimList;    //!< animation list
	ILuint          AnimSize;    //!< animation list size
	void*           Profile;     //!< colour profile
	ILuint          ProfileSize; //!< colour profile size
	ILuint          OffX;        //!< x-offset of the image
	ILuint			OffY;        //!< y-offset of the image
	ILubyte*        DxtcData;    //!< compressed data
	ILenum          DxtcFormat;  //!< compressed data format
	ILuint          DxtcSize;    //!< compressed data size
} ILimage;


// Memory functions
ILAPI void* ILAPIENTRY ialloc(const ILsizei Size);
ILAPI void  ILAPIENTRY ifree(const void *Ptr);
ILAPI void* ILAPIENTRY icalloc(const ILsizei Size, const ILsizei Num);
#ifdef ALTIVEC_GCC
ILAPI void* ILAPIENTRY ivec_align_buffer(void *buffer, const ILuint size);
#endif

// Internal library functions in IL
ILAPI ILimage* ILAPIENTRY ilGetCurImage(void);
ILAPI void     ILAPIENTRY ilSetCurImage(ILimage *Image);
ILAPI void     ILAPIENTRY ilSetError(ILenum Error);
ILAPI void     ILAPIENTRY ilSetPal(ILpal *Pal);

//
// Utility functions
//
ILAPI ILubyte ILAPIENTRY ilGetBppFormat(ILenum Format);
ILAPI ILenum  ILAPIENTRY ilGetFormatBpp(ILubyte Bpp);
ILAPI ILubyte ILAPIENTRY ilGetBpcType(ILenum Type);
ILAPI ILenum  ILAPIENTRY ilGetTypeBpc(ILubyte Bpc);
ILAPI ILubyte ILAPIENTRY ilGetBppPal(ILenum PalType);
ILAPI ILenum  ILAPIENTRY ilGetPalBaseType(ILenum PalType);
ILAPI ILuint  ILAPIENTRY ilNextPower2(ILuint Num);
ILAPI ILenum  ILAPIENTRY ilTypeFromExt(ILconst_string FileName);
ILAPI void    ILAPIENTRY ilReplaceCurImage(ILimage *Image);
ILAPI void    ILAPIENTRY iMemSwap(ILubyte *, ILubyte *, const ILuint);

//
// Image functions
//
ILAPI void	    ILAPIENTRY iBindImageTemp  (void);
ILAPI ILboolean ILAPIENTRY ilClearImage_   (ILimage *Image);
ILAPI void      ILAPIENTRY ilCloseImage    (ILimage *Image);
ILAPI void      ILAPIENTRY ilClosePal      (ILpal *Palette);
ILAPI ILpal*    ILAPIENTRY iCopyPal        (void);
ILAPI ILboolean ILAPIENTRY ilCopyImageAttr (ILimage *Dest, ILimage *Src);
ILAPI ILimage*  ILAPIENTRY ilCopyImage_    (ILimage *Src);
ILAPI void      ILAPIENTRY ilGetClear      (void *Colours, ILenum Format, ILenum Type);
ILAPI ILuint    ILAPIENTRY ilGetCurName    (void);
ILAPI ILboolean ILAPIENTRY ilIsValidPal    (ILpal *Palette);
ILAPI ILimage*  ILAPIENTRY ilNewImage      (ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp, ILubyte Bpc);
ILAPI ILimage*  ILAPIENTRY ilNewImageFull  (ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp, ILenum Format, ILenum Type, void *Data);
ILAPI ILboolean ILAPIENTRY ilInitImage     (ILimage *Image, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp, ILenum Format, ILenum Type, void *Data);
ILAPI ILboolean ILAPIENTRY ilResizeImage   (ILimage *Image, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp, ILubyte Bpc);
ILAPI ILboolean ILAPIENTRY ilTexImage_     (ILimage *Image, ILuint Width, ILuint Height, ILuint Depth, ILubyte Bpp, ILenum Format, ILenum Type, void *Data);
ILAPI ILboolean ILAPIENTRY ilTexSubImage_  (ILimage *Image, void *Data);
ILAPI void*     ILAPIENTRY ilConvertBuffer (ILuint SizeOfData, ILenum SrcFormat, ILenum DestFormat, ILenum SrcType, ILenum DestType, ILpal *SrcPal, void *Buffer);
ILAPI ILimage*  ILAPIENTRY iConvertImage   (ILimage *Image, ILenum DestFormat, ILenum DestType);
ILAPI ILpal*    ILAPIENTRY iConvertPal     (ILpal *Pal, ILenum DestFormat);
ILAPI ILubyte*  ILAPIENTRY iGetFlipped     (ILimage *Image);
ILAPI ILboolean	ILAPIENTRY iMirror();
ILAPI void      ILAPIENTRY iFlipBuffer(ILubyte *buff, ILuint depth, ILuint line_size, ILuint line_num);
ILubyte*				   iFlipNewBuffer(ILubyte *buff, ILuint depth, ILuint line_size, ILuint line_num);
ILAPI void      ILAPIENTRY iGetIntegervImage(ILimage *Image, ILenum Mode, ILint *Param);

// Internal library functions in ILU
ILAPI ILimage* ILAPIENTRY iluRotate_(ILimage *Image, ILfloat Angle);
ILAPI ILimage* ILAPIENTRY iluRotate3D_(ILimage *Image, ILfloat x, ILfloat y, ILfloat z, ILfloat Angle);
ILAPI ILimage* ILAPIENTRY iluScale_(ILimage *Image, ILuint Width, ILuint Height, ILuint Depth);

#ifdef __cplusplus
}
#endif

#endif//IL_EXPORTS_H