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