#ifndef video_dx_h__
#define video_dx_h__

#include "PlatformSetup.h"
#include "math/rtRect.h"

class SoftSurface;
class Surface;

typedef struct _DDCOLORKEY
{
	uint32       dwColorSpaceLowValue;   // low boundary of color space that is to
	// be treated as Color Key, inclusive
	uint32       dwColorSpaceHighValue;  // high boundary of color space that is
	// to be treated as Color Key, inclusive
} DDCOLORKEY;

typedef struct _DDBLTFX
{
	uint32       dwSize;                         // size of structure
	uint32       dwDDFX;                         // FX operations
	uint32       dwROP;                          // Win32 raster operations
	uint32       dwDDROP;                        // Raster operations new for DirectDraw
	uint32       dwRotationAngle;                // Rotation angle for blt
	uint32       dwZBufferOpCode;                // ZBuffer compares
	uint32       dwZBufferLow;                   // Low limit of Z buffer
	uint32       dwZBufferHigh;                  // High limit of Z buffer
	uint32       dwZBufferBaseDest;              // Destination base value
	uint32       dwZDestConstBitDepth;           // Bit depth used to specify Z constant for destination

	DDCOLORKEY  ddckDestColorkey;               // DestColorkey override
	DDCOLORKEY  ddckSrcColorkey;                // SrcColorkey override

	uint32   dwFillColor;                    // color in RGB or Palettized
	uint32   dwFillDepth;                    // depth value for z-buffer
	uint32   dwFillPixel;                    // pixel value for RGBA or RGBZ

} DDBLTFX;

typedef DDBLTFX * LPDDBLTFX;

enum eTransparencyType
{
	TRANSPARENT_NONE,
	TRANSPARENT_BLACK,
	TRANSPARENT_WHITE,
	TRANSPARENT_MAGENTA

};



//blt flags
#define DDBLT_KEYSRC                            0x00008000l
#define DDBLT_COLORFILL                         0x00000400l
#define DDBLT_WAIT                              0x01000000l


#define DD_OK                                   0L
#define DD_FALSE                                1L
/****************************************************************************
*
* BLTFAST FLAGS
*
****************************************************************************/

#define DDBLTFAST_NOCOLORKEY                    0x00000000
#define DDBLTFAST_SRCCOLORKEY                   0x00000001
#define DDBLTFAST_DESTCOLORKEY                  0x00000002
#define DDBLTFAST_WAIT                          0x00000010
#define DDBLTFAST_DONOTWAIT  


//my fake DD wrapper that really uses GL under the hood
class IDirectDrawSurface
{
public:

	enum eMode
	{
		MODE_NORMAL, //8 bit image only
		MODE_PRIMARY_GL, //just a dummy surface, blitting to it goes straight to the screen
		MODE_SHADOW_GL //keep an 8 bit version but cache a HW GL surface as well
	};
	
	IDirectDrawSurface();
	~IDirectDrawSurface();

 int Blt(rtRect32 *pDestRect, IDirectDrawSurface * pSrcSurf, rtRect32 *pSrcRect, uint32 flags, DDBLTFX *pFX);
 int BltFast(int x, int y, IDirectDrawSurface *pSrcSurf, rtRect32 *pSrcRect, uint32 dwTrans);;
 void UpdateLastUsedTime();
 void UpdateShadowSurface();
 Surface * GetGLSuface(); //update it and send back a valid surface if possible

 Surface *m_pGLSurf;
 eMode m_mode;
 SoftSurface *m_pSurf;
 int m_gameTickOfLastUse;


};

typedef class IDirectDrawSurface *LPDIRECTDRAWSURFACE;

IDirectDrawSurface * InitOffscreenSurface(int x, int y, IDirectDrawSurface::eMode mode = IDirectDrawSurface::MODE_NORMAL, bool bHiColor = false, SoftSurface * pSurfaceToCopyFrom = NULL);

extern LPDIRECTDRAWSURFACE lpDDSBack;

void dderror(int hErr);
bool InitializeVideoSystem();
void KillVideoEngine();
void GetSizeOfSurface(IDirectDrawSurface *pdds, int *pX, int *pY);

IDirectDrawSurface * LoadBitmapIntoSurface(const char *pName, eTransparencyType trans= TRANSPARENT_NONE, IDirectDrawSurface::eMode mode = IDirectDrawSurface::MODE_SHADOW_GL, byte *pMem = NULL,
	bool bUseCheckerboardFix = false);

#endif // video_dx_h__