Direct7.h
#ifndef ______G35IOSA__
#define ______G35IOSA__
#define _RGB32BIT(a,r,g,b) ((b) + ((g) << 8) + ((r) << 16) + ((a) << 24))
#define _RGB16BIT555(r,g,b) ((b & 31) + ((g & 31) << 5) + ((r & 31) << 10))
#define _RGB16BIT565(r,g,b) ((b & 31) + ((g & 63) << 5) + ((r & 31) << 11))
#define _RGB24BIT(a,r,g,b) ((b) + ((g) << 8) + ((r) << 16))
#include "g3x.h"
typedef struct TAGDIRECTRECT
{
LONG im_left ;
LONG im_top ;
LONG im_right ;
LONG im_bottom ;
LONG wk_pos_x ;
LONG wk_pos_y ;
} GRAVERECT, *GPRECT ;
typedef struct DX7Graph_TAG
{
LPDIRECTDRAWSURFACE7 Auxil_Surface ;
DDSURFACEDESC2 Auxil_ddsd ;
UINT ExtraIO ;
RECT Hera ;
} DX7Graph_STRUCT,*DX7Graph_STRUCT_PTR ;
struct INTS
{
int x,y,height,width,Bit,L_BYTE ;
unsigned char* image_PTR ;
unsigned short IX_width,IX_height,IX_Pox_X,IX_Pox_Y ;
BITMAPFILEHEADER bitmapfileheader ;
BITMAPINFOHEADER bitmapinfoheader ;
int (*Flip)(struct INTS*,unsigned char*,int,int) ;
int (*Load)(struct INTS*,LPWSTR) ;
int (*Del)(struct INTS*) ;
void (*SetRECT)(struct INTS*,UINT,UINT,UINT,UINT,UINT,UINT) ;
RECT INTS_RECT ;
GRAVERECT Casion ;
} ;
void INTS_Slot(struct INTS*) ;
class DX7Graph : virtual public Gin
{
public:
LPDIRECTDRAW7 lpdd ;
LPDIRECTDRAWSURFACE7 Source_Surface ;
LPDIRECTDRAWPALETTE lpddpal ;
LPDIRECTDRAWCLIPPER lpddclipper ;
PALETTEENTRY v_palette[256] ;
PALETTEENTRY g_palette[256] ;
DDSURFACEDESC2 source_ddsd ;
DDBLTFX ddbltfx ;
DDSCAPS2 ddscaps ;
HRESULT ddrval ;
RECT source_RECT ;
DX7Graph::DX7Graph() ;
DX7Graph::~DX7Graph() ;
DWORD DX7Graph::InitMainSrf() ;
DWORD DX7Graph::InitAuxilSrf(DX7Graph_STRUCT&,bool,int) ;
DWORD DX7Graph::DirectDrawClipper(LPRECT) ;
DWORD DX7Graph::__24PixelPaint(INTS&,DX7Graph_STRUCT_PTR DX7 = NULL,UINT Pos_x = 0,UINT Pos_y = 0,UINT p_W = 0,UINT p_H = 0) ;
protected:
private:
vector <LPDIRECTDRAWSURFACE7> mT ;
void DX7Graph::Delete_DX7_STRUCT() ;
DWORD DX7Graph::ExchangeGL() ;
} ;
#endif
Direct7.cpp
#include "stdafx.h"
#include "GraphicsDevice.h"
extern HRESULT DIRECTEXTERMINATE ;
static int mapper_Flip(struct INTS*,unsigned char*,int,int) ;
static int mapper_Load(struct INTS*,LPWSTR) ;
static int mapper_Del(struct INTS*) ;
static void mapper_SetRECT(struct INTS*,UINT,UINT,UINT,UINT,UINT,UINT) ;
static UCHAR* CallBack_PTR = NULL ;
static pSTK V_K_S ;
static ULONG V_W_Q ;
extern RECT DirectX_Window_Model_RECT ;
extern RECT rectX ;
string ClipperBitmapSize(UINT,UINT,UINT,UINT) ;
HRESULT CheckDirectDrawError(HRESULT DIR_IVAS) // Error Msg
{
switch(DIR_IVAS)
{
case DDERR_DIRECTDRAWALREADYCREATED :
MsgErr("DDERR_DIRECTDRAWALREADYCREATED","IDirectDraw7 0x88760232")
return DIR_IVAS ;
case DDERR_GENERIC :
MsgErr("DDERR_GENERIC","IDirectDraw7 0x80004005")
return DIR_IVAS ;
case DDERR_INVALIDDIRECTDRAWGUID:
MsgErr("DDERR_INVALIDDIRECTDRAWGUID","IDirectDraw7 0x88760231")
return DIR_IVAS ;
case DDERR_INVALIDPARAMS:
MsgErr("DDERR_INVALIDPARAMS","IDirectDraw7 0x80070057")
return DIR_IVAS ;
case DDERR_NODIRECTDRAWHW:
MsgErr("DDERR_NODIRECTDRAWHW","IDirectDraw7 0x88760233")
return DIR_IVAS ;
case DDERR_OUTOFMEMORY:
MsgErr("DDERR_OUTOFMEMORY","IDirectDraw7 0x8007000E")
return DIR_IVAS ;
case DDERR_EXCLUSIVEMODEALREADYSET:
MsgErr("DDERR_EXCLUSIVEMODEALREADYSET","IDirectDraw7 0x88760245")
return DIR_IVAS ;
case DDERR_INVALIDOBJECT:
MsgErr("DDERR_INVALIDOBJECT","IDirectDraw7 0x88760082")
return DIR_IVAS ;
case DDERR_OUTOFVIDEOMEMORY:
MsgErr("DDERR_OUTOFVIDEOMEMORY","IDirectDraw7 0x8876017C")
return DIR_IVAS ;
case DDERR_PRIMARYSURFACEALREADYEXISTS:
MsgErr("DDERR_PRIMARYSURFACEALREADYEXISTS","IDirectDraw7 0x88760234")
return DIR_IVAS ;
default:
MsgErr("Unknown Error","IDirectDraw7 Unknown")
return DIR_IVAS ;
}
}
/*-----------------------------------------------------------
懒得写的了 .... 太多了 .. 自己去看 DirectX SDK文档吧...
DDERR_INCOMPATIBLEPRIMARY 0x8876005F
DDERR_INVALIDCAPS 0x88760064
DDERR_INVALIDPIXELFORMAT 0x88760091
DDERR_NOALPHAHW 0x887600B4
DDERR_NOCOOPERATIVELEVELSET 0x887600D4
DDERR_NODIRECTDRAWHW 0x88760233
DDERR_NOEMULATION 0x88760235
--------------------------------------------------------------*/
DX7Graph::DX7Graph() // 构造函数 填NULL 初始化 DDSURFACEDESC2 Struct
{
lpdd = NULL ;
Source_Surface = NULL ;
lpddpal = NULL ;
lpddclipper = NULL ;
ddrval = 0 ;
_asm0(source_ddsd) ;
RtlZeroMemory(v_palette,1024) ;
RtlZeroMemory(g_palette,1024) ;
}
DWORD DX7Graph::InitMainSrf() // 初始化主表面..
{
if (FAILED(DirectDrawCreateEx(NULL,(void**)(&lpdd),IID_IDirectDraw7,NULL)))
{
__asm MOV DIRECTEXTERMINATE,EAX
CheckDirectDrawError(DIRECTEXTERMINATE) ;
}
if (FAILED(lpdd->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
{
__asm MOV DIRECTEXTERMINATE,EAX