www.pudn.com > GameEngine_src.rar > CSurface.h


#ifndef CSurface_h 
#define CSurface_h 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
#include  
#include  
#include  
 
 
//***************************************************CSurface类声明******************************************************* 
//魔法特效操作: 
enum SURF_MAGIC 
{ 
	HALF_ALPHA = 0,			//半透明 
	CONTOUR_ONLY = 1,		//精灵轮廓 
	CONTOUR_IMAGE = 2,		//带轮廓的精灵图 
	GRAY_IMAGE = 3,			//灰度图 
	RED_IMAGE = 4,			//红色图 
	GREEN_IMAGE = 5,		//青色图 
	BLUE_IMAGE = 6,			//蓝色图 
	MASK_OR = 7,			//用遮码作或操作 
	MASK_AND = 8,			//用遮码作与操作 
	ALPHA_SHADOW = 9,		//特殊半透明(不能公开) 
}; 
 
///////////////////////////////////////////////////////////////// 
//DDraw离屏页面类 
///////////////////////////////////////////////////////////////// 
class CSurface 
{ 
public: 
	CSurface(); 
	CSurface( CSurface &surf ); 
	CSurface &operator = ( CSurface &surf ); 
	~CSurface(); 
 
	bool Init(); 
	void FreeSurface(); 
 
	bool CreateImageSurface( char *szFileName, bool isSysMemory, bool isColorKey, DWORD ColorKey ); 
	bool CreateNullSurface( int iw, int ih, bool isSysMemory, bool isColorKey, DWORD ColorKey ); 
	bool CreateBmpSurface( char *szFileName, bool isSysMemory, bool isColorKey, DWORD ColorKey ); 
	inline bool CreateJpegSurface( char *szFileName, bool isSysMemory, bool isColorKey, DWORD ColorKey ); 
	inline bool CreateEcpSurface( char *szFileName, bool isSysMemory ); 
	 
	bool CreateEcpSurfaceHelp( FILE *fp, int offset, POINT *pPoint, bool isSysMemory ); 
	bool CreateEcpSurfaceFromMemory( BYTE *pData, bool isSysMemory, POINT *point ); 
	bool CreateBmpSurfaceFromMemory( BYTE *pData, bool isSysMemory ); 
 
	bool LoadEcpShadowFromMemory( BYTE *pData, POINT *point ); 
	 
	bool CreateCopySurface(); 
 
	void DrawSurface( int x, int y, RECT *pRect ); 
	void DrawAutoClip( int x, int y ); 
	void DrawAlphaShadow( int x, int y ); 
	void DrawAlphaMMX( int x, int y ); 
	void DrawContour( int x, int y ); 
 
	bool IsSurfaceSelected( int x, int y ); 
 
	bool Restore(); 
 
	void BltTo( int destX, int destY, CSurface *pDestSurf, RECT *rcSrc ); 
	void AlphaBlendSurface( CSurface *pSrcSurf, RECT *rcSrc, RECT *rcDest, DWORD alpha ); 
	void WriteText( const char *szText, int TextLen, int x, int y, DWORD Color ); 
	void WriteTextCenter( const char *szText, DWORD Color ); 
	void ClearSurface( DWORD color, RECT *pRect ); 
	void ClearCopySurface( DWORD color, RECT *pRect ); 
	bool CopySurfaceToBmp( char *szBmpName, RECT *pRect ); 
	bool SaveSurfaceToEcp( char *szBmpName, RECT *pRect ); 
	int  SaveSurfaceToEcpHelp( FILE *fp, int offset, const POINT *pPoint, RECT *pRect ); 
 
	bool MagicSurface( enum SURF_MAGIC magic, WORD colorkey, WORD mask, RECT *pRect ); 
 
	LPDIRECTDRAWSURFACE7 GetSurface() { return m_lpDDSurface; } 
	bool GetWH( int *pWidth, int *pHeight ); 
	int  GetWidth(); 
	int  GetHeight(); 
	bool IsEmpty() { return m_lpDDSurface == NULL; } 
 
	void  SetSurfaceColorKey( DWORD ColorKey ); 
	void  AutoSetColorKey(); 
	void  AutoClip(); 
	DWORD GetColorKey(); 
	bool  IsColorKey() {return m_ColorKeyType == DDBLTFAST_SRCCOLORKEY;} 
 
	WORD *BeginDraw( int *iWidthOut, int *iHeightOut, int *iPitchOut, RECT *pRectIn ); 
	void EndDraw(); 
	void CopySurface( CSurface * psurf ); 
 
	bool BeginDrawText( int x, int y ); 
	void DrawText( const char *sz, DWORD color, bool isNextLine ); 
	void EndDrawText(); 
	const RECT &GetTextRect() {return g_TextRect;} 
 
 
private: 
	bool OnCreateSurface( bool isSysMemory, bool isColorKey ); 
 
private: 
	LPDIRECTDRAWSURFACE7 m_lpDDSurface; 
	LPDIRECTDRAWSURFACE7 m_lpDDSurfaceCopy; 
	DWORD m_ColorKeyType; 
	int	  m_iWidth, m_iHeight; 
 
	static int		g_TextOutX; 
	static int		g_TextOutY; 
	static HDC		g_hdc; 
	static HFONT	g_hFont; 
	static RECT		g_TextRect; 
}; 
 
typedef CSurface* PSURFACE; 
 
 
 
 
//------------------------------------------------------ECP文件相关定义--------------------------------------------------- 
//------------------------------------------------------------------ 
//ecp文件头结构 
//------------------------------------------------------------------ 
struct ECPFILEHEADER 
{ 
	DWORD ecpFileType;								//文件类型ECP 
	DWORD ecpFileSize;								//文件大小(未使用) 
	DWORD ecpWidth;									//图像宽 
	DWORD ecpHeight;								//图像高 
	DWORD ecpColorKeyType;							//关键色类型 
	DWORD ecpColorKey;								//关键色 
	BOOL  ecpIsCompress;							//是否压缩 
	POINT ecpBaseOffset;							//基点偏移 
}; 
 
const DWORD ECP = 'ECP'; 
const DWORD ECP_SHADOW = 'ES';	//存储阴影的ECP图片,ecpWidth低位是图片实际宽,高位是逻辑宽,同理ecpHeight; 
 
const BYTE PIXEL_COUNT		= (BYTE)0x01;			//01表示像素开始,后跟像素数目 
const BYTE COLORKEY_COUNT	= (BYTE)0x02;			//02表示关健色开始,后跟关键色数目 
const BYTE LINE_END			= (BYTE)0x03;			//03表示一行的结束 
const BYTE ECP_FILE_END		= (BYTE)0x04;			//04表示图形数据的结束语 
 
//------------------------------------------------------------------ 
//压缩数据单位 
//------------------------------------------------------------------ 
struct COMPRESS_DATA 
{ 
	BYTE byte1; 
	BYTE byte2; 
}; 
 
#endif