📄 dxc_ddraw.cpp
字号:
// DXC_ddraw.cpp: implementation of the DXC_ddraw class.
//
//////////////////////////////////////////////////////////////////////
#include <string.h>
#include <objbase.h>
#include "DXC_ddraw.h"
extern HWND G_hEditWnd;
extern HWND G_hWnd;
#ifdef DEF_HTMLCOMMOM // Html 促捞倔肺弊 何盒..
extern HWND G_hInternetWnd;
#endif
extern long G_lTransG100[64][64], G_lTransRB100[64][64];
extern long G_lTransG70[64][64], G_lTransRB70[64][64];
extern long G_lTransG50[64][64], G_lTransRB50[64][64];
extern long G_lTransG25[64][64], G_lTransRB25[64][64];
extern long G_lTransG2[64][64], G_lTransRB2[64][64];
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DXC_ddraw::DXC_ddraw()
{
m_lpFrontB4 = NULL;
m_lpDD4 = NULL;
m_lpPDBGS = NULL;
m_lpBackB4flip = NULL;
m_cPixelFormat = 0;
#ifdef _DEBUG
m_bFullMode = FALSE;
#else
m_bFullMode = TRUE;
#endif
}
DXC_ddraw::~DXC_ddraw()
{
if (m_hFontInUse != NULL) DeleteObject(m_hFontInUse);
if (m_lpBackB4flip != NULL) m_lpBackB4flip->Release();
if (m_lpBackB4 != NULL) m_lpBackB4->Release();
if (m_lpFrontB4 != NULL) m_lpFrontB4->Release();
if (m_bFullMode == TRUE)
{
if (m_lpDD4 != NULL) m_lpDD4->RestoreDisplayMode();
}
if (m_lpDD4 != NULL) m_lpDD4->Release();
}
BOOL DXC_ddraw::bInit(HWND hWnd)
{
HRESULT ddVal;
DDSURFACEDESC2 ddsd;
int iS, iD;
SetRect(&m_rcClipArea, 0,0, 640, 480);
ddVal = DirectDrawCreateEx(NULL, (VOID**)&m_lpDD4, IID_IDirectDraw7, NULL);
if (ddVal != DD_OK) return FALSE;
if( m_bFullMode == TRUE )
{
DDSCAPS2 ddscaps;
// 傈眉拳搁 葛靛捞促.
ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if (ddVal != DD_OK) return FALSE;
ddVal = m_lpDD4->SetDisplayMode(640, 480, 16,0,0);
if (ddVal != DD_OK) return FALSE;
// 橇沸飘 滚欺 积己
memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;//2; //v1.3
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
if (ddVal != DD_OK) return FALSE;
ZeroMemory(&ddscaps, sizeof(ddscaps));
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddVal = m_lpFrontB4->GetAttachedSurface(&ddscaps, &m_lpBackB4flip);
if (ddVal != DD_OK) return FALSE;
SetRect(&m_rcFlipping, 0, 0, 640, 480); // our fictitious sprite bitmap is
}
else
{
// 扩档快 葛靛捞促.
int cx = GetSystemMetrics(SM_CXFULLSCREEN);
int cy = GetSystemMetrics(SM_CYFULLSCREEN);
ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
if (ddVal != DD_OK) return FALSE;
cx = cx/2;
cy = cy/2;
if(cy>280) cy -= 40;
SetWindowPos( hWnd, HWND_TOP, cx-320, cy-240, 640, 480, SWP_SHOWWINDOW);
// 橇沸飘 滚欺 积己
memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS;
//ddsd.dwBackBufferCount = 0;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
if (ddVal != DD_OK) return FALSE;
SetRect(&m_rcFlipping, cx-320, cy-240, cx+320, cy+240); // our fictitious sprite bitmap is
}
InitFlipToGDI(hWnd);
// 归滚欺 积己
m_lpBackB4 = pCreateOffScreenSurface(640, 480);
if (m_lpBackB4 == NULL) return FALSE;
// Pre-draw background surface 滚欺 积己
m_lpPDBGS = pCreateOffScreenSurface(640+32, 480+32);
if (m_lpPDBGS == NULL) return FALSE;
// 归滚欺狼 林家客 乔摹甫 掘绢柯促.
ddsd.dwSize = sizeof(ddsd);
if (m_lpBackB4->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) return FALSE;
m_pBackB4Addr = (WORD *)ddsd.lpSurface;
m_sBackB4Pitch = (short)ddsd.lPitch >> 1;
m_lpBackB4->Unlock(NULL);
// 侨伎备炼甫 舅酒郴 拿矾 抛捞喉阑 积己茄促.
_TestPixelFormat();
for (iS = 0; iS < 64; iS++)
for (iD = 0; iD < 64; iD++) {
m_lTransRB100[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 1.0f);
m_lTransG100[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 1.0f);
m_lTransRB70[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.7f);
m_lTransG70[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 0.7f);
m_lTransRB50[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.5f);
m_lTransG50[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 0.5f);
m_lTransRB25[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.25f);
m_lTransG25[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 0.25f);
m_lTransRB2[iD][iS] = _CalcMaxValue(iS, iD, 'R', 2, 1.0f);
m_lTransG2[iD][iS] = _CalcMaxValue(iS, iD, 'G', 2, 1.0f);
m_lFadeRB[iD][iS] = _CalcMinValue(iS, iD, 'R');
m_lFadeG[iD][iS] = _CalcMinValue(iS, iD, 'G');
G_lTransRB100[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 1.0f);
G_lTransG100[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 1.0f);
G_lTransRB70[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.7f);
G_lTransG70[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 0.7f);
G_lTransRB50[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.5f);
G_lTransG50[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 0.5f);
G_lTransRB25[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.25f);
G_lTransG25[iD][iS] = _CalcMaxValue(iS, iD, 'G', 1, 0.25f);
G_lTransRB2[iD][iS] = _CalcMaxValue(iS, iD, 'R', 2, 1.0f);
G_lTransG2[iD][iS] = _CalcMaxValue(iS, iD, 'G', 2, 1.0f);
}
m_hFontInUse = NULL;
#if DEF_LANGUAGE == 1 // 攫绢:Taiwan
m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, CHINESEBIG5_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "MingLiu") ;
#endif
#if DEF_LANGUAGE == 2 // 攫绢:Chinese
m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "MingLiu") ;
#endif
#if DEF_LANGUAGE == 3 // 攫绢:Korean
m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, HANGUL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "官帕") ;
#endif
#if DEF_LANGUAGE == 4 // 攫绢:English
m_hFontInUse = CreateFont(16,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "Comic Sans MS") ;
#endif
#if DEF_LANGUAGE == 5 // 攫绢:Japanese
m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "MS PGothic") ;
#endif
m_hDC = NULL;
return TRUE;
}
HRESULT DXC_ddraw::iFlip()
{
HRESULT ddVal;
if( m_bFullMode )
{
#ifdef DEF_USING_WIN_IME
ddVal = m_lpFrontB4->Blt( NULL, m_lpBackB4, NULL, DDBLT_WAIT, NULL );
if (G_hEditWnd != NULL) {
if (ddVal != DDERR_SURFACELOST) m_lpDD4->FlipToGDISurface();
}
#else
#ifdef DEF_HTMLCOMMOM
if( G_hInternetWnd != NULL ) {
ddVal = m_lpFrontB4->Blt( NULL, m_lpBackB4, NULL, DDBLT_WAIT, NULL );
m_lpDD4->FlipToGDISurface();
}
else {
ddVal = m_lpBackB4flip->BltFast( 0, 0, m_lpBackB4, &m_rcFlipping, DDBLTFAST_NOCOLORKEY); // | DDBLTFAST_WAIT);
ddVal = m_lpFrontB4->Flip(m_lpBackB4flip, DDFLIP_WAIT);
}
#else
ddVal = m_lpBackB4flip->BltFast( 0, 0, m_lpBackB4, &m_rcFlipping, DDBLTFAST_NOCOLORKEY); // | DDBLTFAST_WAIT);
ddVal = m_lpFrontB4->Flip(m_lpBackB4flip, DDFLIP_WAIT);
#endif
#endif
}
else
{
//SetRect( &m_rcFlipping, 0, 0, 1152, 864 );
ddVal = m_lpFrontB4->Blt(&m_rcFlipping, m_lpBackB4, NULL, DDBLT_WAIT, NULL);
}
if (ddVal == DDERR_SURFACELOST) {
DDSURFACEDESC2 ddsd2;
// 辑其捞胶啊 颊角登菌促. 汗备茄促.
m_lpFrontB4->Restore();
m_lpBackB4->Restore();
// 归滚欺狼 林家甫 掘绢柯促.
ddsd2.dwSize = sizeof(ddsd2);
if (m_lpBackB4->Lock(NULL, &ddsd2, DDLOCK_WAIT, NULL) != DD_OK) return FALSE;
m_pBackB4Addr = (WORD *)ddsd2.lpSurface;
m_lpBackB4->Unlock(NULL);
return DDERR_SURFACELOST;
}
return DD_OK;
}
void DXC_ddraw::ChangeDisplayMode(HWND hWnd)
{
HRESULT ddVal;
DDSURFACEDESC2 ddsd;
if (m_lpBackB4flip != NULL)
{
m_lpBackB4flip->Release();
m_lpBackB4flip = NULL;
}
if (m_lpBackB4 != NULL) m_lpBackB4->Release();
if (m_lpFrontB4 != NULL) m_lpFrontB4->Release();
if (m_lpDD4 != NULL)
{
if (m_bFullMode == TRUE) m_lpDD4->RestoreDisplayMode();
}
if( m_bFullMode == TRUE )
{
int cx = GetSystemMetrics(SM_CXFULLSCREEN);
int cy = GetSystemMetrics(SM_CYFULLSCREEN);
ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
if (ddVal != DD_OK) return;
cx = cx/2;
cy = cy/2;
if(cy>280) cy -= 40;
SetWindowPos( hWnd, NULL, cx-320, cy-240, 640, 480, SWP_SHOWWINDOW);
// 橇沸飘 滚欺 积己
memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS;
//ddsd.dwBackBufferCount = 0;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
if (ddVal != DD_OK) return;
SetRect(&m_rcFlipping, cx-320, cy-240, cx+320, cy+240); // our fictitious sprite bitmap is
m_bFullMode = FALSE;
}
else
{
DDSCAPS2 ddscaps;
// 傈眉拳搁 葛靛捞促.
ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if (ddVal != DD_OK) return;
ddVal = m_lpDD4->SetDisplayMode(640, 480, 16,0,0);
if (ddVal != DD_OK) return;
// 橇沸飘 滚欺 积己
memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;//2; //v1.3
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
if (ddVal != DD_OK) return;
ZeroMemory(&ddscaps, sizeof(ddscaps));
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddVal = m_lpFrontB4->GetAttachedSurface(&ddscaps, &m_lpBackB4flip);
if (ddVal != DD_OK) return;
SetRect(&m_rcFlipping, 0, 0, 640, 480); // our fictitious sprite bitmap is
m_bFullMode = TRUE;
}
InitFlipToGDI(hWnd);
// 归滚欺 积己
m_lpBackB4 = pCreateOffScreenSurface(640, 480);
if (m_lpBackB4 == NULL) return;
// Pre-draw background surface 滚欺 积己
m_lpPDBGS = pCreateOffScreenSurface(640+32, 480+32);
if (m_lpPDBGS == NULL) return;
// 归滚欺狼 林家客 乔摹甫 掘绢柯促.
ddsd.dwSize = sizeof(ddsd);
if (m_lpBackB4->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) return;
m_pBackB4Addr = (WORD *)ddsd.lpSurface;
m_sBackB4Pitch = (short)ddsd.lPitch >> 1;
m_lpBackB4->Unlock(NULL);
}
IDirectDrawSurface7 * DXC_ddraw::pCreateOffScreenSurface(WORD wSzX, WORD wSzY)
{
DDSURFACEDESC2 ddsd;
IDirectDrawSurface7 * pdds4;
ZeroMemory(&ddsd, sizeof(ddsd));
if ((wSzX % 4) != 0) wSzX += 4 - (wSzX % 4);
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth = (DWORD)wSzX;
ddsd.dwHeight = (DWORD)wSzY;
if (m_lpDD4->CreateSurface(&ddsd, &pdds4, NULL) != DD_OK) return NULL;
return pdds4;
}
HRESULT DXC_ddraw::iSetColorKey(IDirectDrawSurface7 * pdds4, COLORREF rgb)
{
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = _dwColorMatch(pdds4, rgb);
ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
return pdds4->SetColorKey(DDCKEY_SRCBLT, &ddck);
}
HRESULT DXC_ddraw::iSetColorKey(IDirectDrawSurface7 * pdds4, WORD wColorKey)
{
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = _dwColorMatch(pdds4, wColorKey);
ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
return pdds4->SetColorKey(DDCKEY_SRCBLT, &ddck);
}
DWORD DXC_ddraw::_dwColorMatch(IDirectDrawSurface7 * pdds4, COLORREF rgb)
{
COLORREF rgbT;
HDC hdc;
DWORD dw = CLR_INVALID;
DDSURFACEDESC2 ddsd2;
HRESULT hres;
if (rgb != CLR_INVALID && pdds4->GetDC(&hdc) == DD_OK)
{
rgbT = GetPixel(hdc, 0, 0);
SetPixel(hdc, 0, 0, rgb);
pdds4->ReleaseDC(hdc);
}
ddsd2.dwSize = sizeof(ddsd2);
while ((hres = pdds4->Lock(NULL, &ddsd2, 0, NULL)) == DDERR_WASSTILLDRAWING);
if (hres == DD_OK)
{
dw = *(DWORD *)ddsd2.lpSurface;
dw &= (1 << ddsd2.ddpfPixelFormat.dwRGBBitCount)-1;
pdds4->Unlock(NULL);
}
if (rgb != CLR_INVALID && pdds4->GetDC(&hdc) == DD_OK)
{
SetPixel(hdc, 0, 0, rgbT);
pdds4->ReleaseDC(hdc);
}
return dw;
}
DWORD DXC_ddraw::_dwColorMatch(IDirectDrawSurface7 * pdds4, WORD wColorKey)
{
DWORD dw = CLR_INVALID, * dwp;
DDSURFACEDESC2 ddsd2;
HRESULT hres;
ddsd2.dwSize = sizeof(ddsd2);
while ((hres = pdds4->Lock(NULL, &ddsd2, 0, NULL)) == DDERR_WASSTILLDRAWING);
if (hres == DD_OK)
{
dwp = (DWORD *)ddsd2.lpSurface;
*dwp = (DWORD)wColorKey;
dw = *(DWORD *)ddsd2.lpSurface;
dw &= (1 << ddsd2.ddpfPixelFormat.dwRGBBitCount)-1;
pdds4->Unlock(NULL);
}
return dw;
}
void DXC_ddraw::TextOut(int x, int y, char * cStr, COLORREF rgb)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -