#ifndef _duck_dxl_h
#define _duck_dxl_h


/******************************************************************************\
*                                                                              *
* duck_dxl.h  -   TrueMotion include file for decompression libraries          *
*                                                                              *
*                 Version:      6.0.0                                          *
*                 Created:      3/3/98                                         *
*                 Copyright (c) 1994-98, The Duck Corp. All rights reserved.   * 
*                                                                              *
\******************************************************************************/

#if defined(__cplusplus)
extern "C" {
#endif

/* enumerated data types */

typedef enum BLITQUALITY {
	DXBLIT_SAME = 0,        /* Blit directly, w/o stretching */
	DXBLIT_R1,
	DXBLIT_R2,
	DXBLIT_STRETCH,         /* double horizontally, skip lines vertically */
	DXBLIT_R3,
	DXBLIT_STRETCH_BRIGHT,  /* double horizontally, interpolate vertically */
	DXBLIT_R4,
	DXBLIT_R5,
	DXBLIT_R6,
	DXBLIT_NONE,
	DXBLITMAX
} dxvBlitQuality ;

typedef enum BITDEPTH { 
    DXRGBNULL = 0, 
    DXRGB8 = 1, 
    
	DXRGB16_555 = 2, 
    DXRGB24 = 3, 
    DXRGB_UNUSED = 4,
    DXRGB16VESA = 5,
    DXRGB8VESA = 6,
    DXRGB16_565 = 7,

    DXYUY2 = 8, 
    DXYVU9 = 9, 
    DXYV12 = 10, 
    DXUYVY = 11, 
    
	DXRGB32 = 12, 
    DXRGB16VESA_565 = 13, 
	DXHALFTONE8 =14,
	DXMAX
} dxvBitDepth ;

#define DXRGB16	DXRGB16_555
#define DXRGB24CHAR DXRGB24

typedef enum OFFSETXY { 
	DXL_ABSOLUTE = 0, 
	DXL_RELATIVE 
} dxvOffsetMode;

typedef enum IMAGETYPE {
	DXL_INTRAFRAME = 0, 
	DXL_INTERFRAME, 
	DXL_SPRITE 
} dxvImageType;

typedef enum DXL_ERR{
    DXL_LOW_ERR = -32000,
    DXL_INVALID_REQUEST = -8,
    DXL_VERSION_CONFLICT = -7,
    DXL_INVALID_DATA = -7,
    DXL_INVALID_BLIT = -6,
    DXL_BAD_DATA = -5,
    DXL_ALLOC_FAILED = -4,
    DXL_NULL_FRAME = -3, 
    DXL_NULLSOURCE = -2, 
    DXL_NOTINUSE = -1, 
    DXL_OK = 0,
    DXL_HOLD_FRAME = 1
} dxvError ;

typedef enum BGMODE   /* sprite drawing modes 
                         v1.0.2 supports NORM & NO_BACKGROUND */{ 
    NORM = 0,         /* normal sprite mode, blend edges w/background */
    NO_BACKGROUND = 1,/* transparant sprite mode 1, 
                         sets all background data transparant no blending */
    NORM_TRANS = 2,   /* transparant sprite mode 2, 
                         blend edges (alphas) w/separate background buffer, 
                         set sprite background to trans */
    RGB_OPAQUE = 3,   /* blend edges to sprColor, set background to sprColor*/
    RGB_TRANS = 4     /* blend edges w/sprColor, set background to trans */ 
} dxvBackgroundMode ;

/*********************************************************/

/* definition of data handles */                                         

typedef struct vScreen *DXL_VSCREEN_HANDLE;
typedef struct tXImage *DXL_XIMAGE_HANDLE;
typedef struct tXAudioSource *DXL_XAUDIOSRC_HANDLE;
typedef struct tAudioBuff *DXL_AUDIODST_HANDLE;

/* main video decompression init, exit and query */

int DXL_InitVideo(int maxScreens,int maxImages);
void DXL_ExitVideo(void); 

/*get pointer to NULL terminated 
  array of supported fourCCs */
unsigned long *DXL_GetFourCCList(void);

/* create an xImage (decompressor) object,
	based on the provided compressed data */
DXL_XIMAGE_HANDLE DXL_CreateXImage(
	unsigned char *data
	); 

/* create an xImage (decompressor) object 
    of a specific type */
DXL_XIMAGE_HANDLE DXL_CreateXImageOfType(
	unsigned char *data,
	unsigned long fccType
	);

/* destroy the specified xImage */
void DXL_DestroyXImage(DXL_XIMAGE_HANDLE src);

/* feed the xImage new data, get ready to decompress */
int DXL_AlterXImageData(
	DXL_XIMAGE_HANDLE src,
	unsigned char *ptrData
	);

/* explicitly alter attributes of an xImage */
DXL_XIMAGE_HANDLE DXL_AlterXImage(
	DXL_XIMAGE_HANDLE ,
	unsigned char *ptrData,
	int xImType,
	dxvBitDepth bitDepth ,
	int maxWidth,int maxHeight 
	);

/* get xImage target bounding rectangle */
int DXL_GetXImageDirtyXYWH(
	DXL_XIMAGE_HANDLE ,
	int *,int *,int *,int *
	);

/* force decompressor to refresh all destination pixels */
int DXL_SetXImageBlitAll(
	DXL_XIMAGE_HANDLE xImage
	);

/* if available, get pointer to internal frameBuffer */
void *DXL_GetXImageFrameBuffer(
	DXL_XIMAGE_HANDLE src
	);

long DXL_GetXImageCSize(
	DXL_XIMAGE_HANDLE src
	);

/* change x,y, offset at which to decompress image */
int DXL_MoveXImage(
	DXL_XIMAGE_HANDLE src,
	dxvOffsetMode mode, 
	int x,int y
	);

/* set sprite transparency mode (SegaSaturn only) */
int DXL_AlterXImageSpriteModes(
	DXL_XIMAGE_HANDLE src,
	int sprMode, int sprColor
	);

/* get application specified x,y offset, 
	and overall decompressed width and height */
int DXL_GetXImageXYWH(
	DXL_XIMAGE_HANDLE src,
	int *x,int *y,int *w, int *h
	);

int DXL_GetXImageType(DXL_XIMAGE_HANDLE src);
int DXL_GetXImageColorDepth(DXL_XIMAGE_HANDLE src);
int DXL_IsXImageKeyFrame(DXL_XIMAGE_HANDLE src);

/* decompress and blit as a single process */
int DXL_dxImageToVScreen(
	DXL_XIMAGE_HANDLE src, 
	DXL_VSCREEN_HANDLE dst
	);

/* compatibility check prior between 
	decompressor and destination */
int DXL_CheckdxImageToVScreen(
	DXL_XIMAGE_HANDLE src,
	DXL_VSCREEN_HANDLE dst
	);

/* blit from xImage internal "working area" to vScreen */
int DXL_BlitXImageToVScreen(
	DXL_XIMAGE_HANDLE src, 
	DXL_VSCREEN_HANDLE dst
	);

/* vscreen management functions */

/* create a virtual screen target for decompression (renderer?) */
DXL_VSCREEN_HANDLE DXL_CreateVScreen(
	unsigned char *addr,
	dxvBitDepth colorMode, 
	short bytePitch,
	short height
	);

/* alter attributes of an existing vScreen */
int DXL_AlterVScreen(
	DXL_VSCREEN_HANDLE dst, 
	unsigned char *addr,
	dxvBitDepth colorMode,
	int bytePitch,
	int height
	);
	

void DXL_VScreenSetInfoDotsFlag(DXL_VSCREEN_HANDLE vScreen, int showDots);
	

/* alter clipping rectangle of vScreen */
/* not supported by all decompressors */
int DXL_AlterVScreenClip(
	DXL_VSCREEN_HANDLE dst,
	int x,int y,
	int w,int h
	);

/* alter viewport rectangle of vScreen */
/* width/height not supported by all decompressors */
int DXL_AlterVScreenView(
	DXL_VSCREEN_HANDLE dst,
	int x,int y,
	int w,int h
	);

/* destroy a vScreen object/struct */
void DXL_DestroyVScreen(
	DXL_VSCREEN_HANDLE dst
	);

/* set blit mode/quality of a vScreen 
   same (normal), stretch (black lined)
   stretch bright (stretched w/interpolation) */    
int DXL_SetVScreenBlitQuality(
	DXL_VSCREEN_HANDLE dest,
	dxvBlitQuality bq
	);

/* get vScreens current blit mode/quality */
dxvBlitQuality DXL_GetVScreenBlitQuality(
	DXL_VSCREEN_HANDLE
	);

/* alter spite background associated with a vscreen */
/* used only by SegaSaturn for hardware sprite support */
int DXL_AlterVScreenBackground(
	DXL_VSCREEN_HANDLE ,
	unsigned char *,
	dxvBitDepth bd ,int ,int ,int ,int 
	);

/* set DOS VESA mode for vScreen (DOS only) */
int DXL_AlterVScreenVESAMode(
	DXL_VSCREEN_HANDLE ,
	int vesaMode
	);

/* set physical screen to vScreen's vesa mode */
int DXL_ActivateVScreenVESAMode(DXL_VSCREEN_HANDLE);

/* get vScreen (generally physical) vesa mode */
int DXL_GetVScreenVESAMode(DXL_VSCREEN_HANDLE );

void DXL_EraseVScreen(DXL_VSCREEN_HANDLE );
void DXL_BlackLineVScreen(DXL_VSCREEN_HANDLE );

/* copy one vScreen to another */
/* provides support for offscreen compositing,
   16 bit and 8 bit modes only */
int DXL_BlitVScreenToVScreen(
	DXL_VSCREEN_HANDLE fromVScreen,
	DXL_VSCREEN_HANDLE toVScreen
	);

/* get attributes of the vScreen */
int DXL_GetVScreenAttributes(
    DXL_VSCREEN_HANDLE vScreen,
    void **addr, 
    dxvBlitQuality *bq, 
    short *pitch, 
    short *height
	);   

char *DXL_GetXImageStats(DXL_XIMAGE_HANDLE xImage,char *storage);


/* get vScreen's current viewport rectangle
	a viewport represents an x,y, offset and 
	a clipping width and height */        
int DXL_GetVScreenView(
	DXL_VSCREEN_HANDLE dst,
	int *x,int *y,int *w,int *h
	);

/* get vScreen's current clipping rectangle */        
int DXL_GetVScreenClip(
	DXL_VSCREEN_HANDLE dst,
	int *x,int *y,int *w,int *h
	);

/* provide Color lookup tables for 8 bit support */
int DXL_SetVScreenCLUTs(
	DXL_VSCREEN_HANDLE vScr, 
	unsigned char *clpt, 
	unsigned char *clpt2,
	int exp
	);

/* return the palette currently used */
int DXL_GetBitDepthPalette(dxvBitDepth colorMode,
	unsigned char **pal);

/* relinquish color lookup table structures */
void DXL_ResetVScreenCLUTs(
	DXL_VSCREEN_HANDLE vScr
	);

/* check to see if a blit mode is supported */

int DXL_CheckVScreenBlit(DXL_VSCREEN_HANDLE dst,unsigned long fourcc);
int DXL_CheckVScreenXImageBlit(DXL_VSCREEN_HANDLE dst,DXL_XIMAGE_HANDLE src);

/* audio function prototypes */

int DXL_InitAudio(int srcs,int dsts);
void DXL_ExitAudio(void);

typedef struct tDKWAVEFORM *DKWAVEFORMPTR; /* place holder pointer */

/* create a compressed audio source (decompressor) */
DXL_XAUDIOSRC_HANDLE DXL_CreateXAudioSrc(
	DKWAVEFORMPTR wv, 
	unsigned char *addr,int length
	);

/* feed an audio decompressor new data (w/o decompressing) */
void DXL_AlterXAudioData(
	DXL_XAUDIOSRC_HANDLE xSource,
	unsigned char *addr,int length
	);

/* destroy an audio decompressor */
void DXL_DestroyXAudioSrc(DXL_XAUDIOSRC_HANDLE xSource);
        
/* create a audio destination description */
DXL_AUDIODST_HANDLE DXL_CreateAudioDst(
    void *addrL,void *addrR,
    int length,int bitDepth,
    int numChannels,
    int sampleRate
	);

/* change characteristics of audio destination descriptor */
void DXL_AlterAudioDst(
    DXL_AUDIODST_HANDLE dst,
    void *addrL,void *addrR,
    int length,int bitDepth,
    int numChannels,
    int sampleRate
	);

/* destroy audio destination description struct */
void DXL_DestroyAudioDst(DXL_AUDIODST_HANDLE dst);

/* decompress up to maxSamplesToDecompress */
/* function returns the actual number of 
	samples decompressed */
int DXL_dxAudio(
	DXL_XAUDIOSRC_HANDLE src,
	DXL_AUDIODST_HANDLE dst,
	int maxSamplesToDecompress
	);

/* windows 95 dll system abstraction functions */

/* set memory allocator function */
void DXV_Setmalloc(
	void *(*mallocFuncPtr)(unsigned int size)
	);

/* set cleared memory allocator function */
void DXV_Setcalloc(
	void *(*callocFuncPtr)(unsigned int size, unsigned int number)
	);

/*set memory free function */
void DXV_Setfree(
	void (*freeFuncPtr)(void *)
	);


/* can only have a max of 32 cpu specific features */
typedef enum tCPU_FEATURES 
{
    NO_FEATURES = 0,
    MMX_SUPPORTED = 1
} CPU_FEATURES;

CPU_FEATURES DXL_GetCPUFeatures(void);
unsigned long DXL_GetXImageFOURCC(DXL_XIMAGE_HANDLE src);

#if defined(__cplusplus)
}
#endif

#endif /* include guards */
