Changed overlay support to ifdef

This commit is contained in:
pagefault
2001-06-16 01:06:03 +00:00
parent 0b59ad2fa0
commit dc160a5bb9
5 changed files with 89 additions and 191 deletions

View File

@@ -15,6 +15,8 @@
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//#define OVERLAY_SUPPORT
#define DIRECTINPUT_VERSION 0x0800
#define DIRECTSOUND_VERSION 0x0800
@@ -44,9 +46,9 @@ DWORD FirstSound=1;
int AllowDefault=0;
int SoundEnabled=1;
DWORD Overlay = 0;
DWORD Overlay_failed = 0;
#ifdef OVERLAY_SUPPORT
DWORD Overlay_Colorkey = 0;
#endif
DWORD FirstActivate = 1;
@@ -78,7 +80,9 @@ LPDIRECTDRAWSURFACE7 DD_Primary = NULL;
LPDIRECTDRAWSURFACE7 DD_CFB = NULL;
LPDIRECTDRAWSURFACE7 DD_BackBuffer = NULL;
LPDIRECTDRAWCLIPPER lpDDClipper = NULL;
#ifdef OVERLAY_SUPPORT
DDOVERLAYFX ddofx;
#endif
RECT rcWindow;
LPDIRECTINPUT8 DInput = NULL;
@@ -150,11 +154,6 @@ extern "C"
void drawscreenwin(void);
DWORD LastUsedPos=0;
DWORD CurMode=-1;
void initDirectDraw()
{
InitDirectDraw();
}
}
void DDrawError(){
@@ -166,20 +165,18 @@ void DDrawError(){
extern "C" BYTE vsyncon;
extern "C" BYTE TripleBufferWin;
extern "C" BYTE OverlayEnabled;
typedef DWORD (__fastcall* lpLockSurface)();
DWORD __fastcall LockSurface_normal();
DWORD __fastcall LockSurface_overlay();
lpLockSurface LockSurface;
typedef void (__fastcall* lpUnlockSurface)();
void __fastcall UnlockSurface_normal();
void __fastcall UnlockSurface_overlay();
lpUnlockSurface UnlockSurface;
void DrawScreen_normal()
void DrawScreen()
{
#ifdef OVERLAY_SUPPORT
if (vsyncon == 1)
{
if (DD_BackBuffer == NULL) InitDirectDraw();
DD_CFB->Flip(NULL,DDFLIP_WAIT);
}
else
if (DD_BackBuffer) InitDirectDraw();
#else
if (vsyncon == 1)
{
if(FullScreen == 1)
@@ -215,12 +212,7 @@ void DrawScreen_normal()
DD_Primary->Blt(&rcWindow, DD_CFB, NULL, DDBLT_WAIT, NULL);
}
}
}
void DrawScreen_overlay()
{
if (vsyncon == 1)
DD_CFB->Flip(NULL,DDFLIP_WAIT);
#endif
}
DWORD InputEn=0;
@@ -283,7 +275,6 @@ extern "C" void CheckAlwaysOnTop()
extern "C" void MinimizeWindow()
{
if (Overlay && (DD_CFB)) DD_CFB->UpdateOverlay(NULL, DD_Primary, NULL, DDOVER_HIDE, NULL);
ShowWindow(hMainWindow, SW_MINIMIZE);
IsActivated = 0;
}
@@ -463,30 +454,29 @@ LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_MOVE:
break;
case WM_PAINT:
if (Overlay && Overlay_Colorkey && (DD_Primary))
{
HDC hdc;
POINT pt;
RECT rc1;
struct tagPAINTSTRUCT ps;
DDBLTFX ddbfx;
#ifdef OVERLAY_SUPPORT
HDC hdc;
POINT pt;
RECT rc1;
struct tagPAINTSTRUCT ps;
DDBLTFX ddbfx;
hdc = BeginPaint(hWnd, &ps);
hdc = BeginPaint(hWnd, &ps);
rc1 = ps.rcPaint;
ClientToScreen(hMainWindow, ( LPPOINT )&rc1 );
ClientToScreen(hMainWindow, ( LPPOINT )&rc1 + 1 );
rc1 = ps.rcPaint;
ClientToScreen(hMainWindow, ( LPPOINT )&rc1 );
ClientToScreen(hMainWindow, ( LPPOINT )&rc1 + 1 );
ddbfx.dwSize = sizeof(DDBLTFX);
ddbfx.dwFillColor = Overlay_Colorkey;
ddbfx.dwSize = sizeof(DDBLTFX);
ddbfx.dwFillColor = Overlay_Colorkey;
DD_Primary->Blt(&rc1, NULL, &rc1, DDBLT_COLORFILL |
DDBLT_WAIT, &ddbfx);
DD_Primary->Blt(&rc1, NULL, &rc1, DDBLT_COLORFILL |
DDBLT_WAIT, &ddbfx);
EndPaint(hWnd, &ps);
}
else
EndPaint(hWnd, &ps);
#else
ValidateRect(hWnd,NULL);
#endif
break;
case WM_ACTIVATE:
if (LOWORD(wParam) != WA_INACTIVE)
@@ -494,10 +484,11 @@ LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
IsActivated = 1;
if(FirstActivate == 0)
{
if (Overlay == 1)
ShowWindow(hMainWindow, SW_SHOWNORMAL);
#ifdef OVERLAY_SUPPORT
ShowWindow(hMainWindow, SW_SHOWNORMAL);
#endif
initwinvideo();
if (Overlay == 1)
#ifdef OVERLAY_SUPPORT
{
HRESULT hr;
RECT rc1;
@@ -528,8 +519,8 @@ LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
sprintf(err,"IDirectDrawSurface7::UpdateOverlay failed: 0x%x", hr);
MessageBox(NULL, err, "DirectDraw Error", MB_ICONERROR);
}
}
#endif
}
InputAcquire();
if (FirstActivate == 1) FirstActivate = 0;
@@ -1230,20 +1221,21 @@ int InitDirectDraw()
}
if (OverlayEnabled == 1 && !Overlay_failed)
#ifdef OVERLAY_SUPPORT
ddcaps.dwSize = sizeof(DDCAPS);
if(lpDD->GetCaps(&ddcaps, NULL) != DD_OK)
{
ddcaps.dwSize = sizeof(DDCAPS);
if(lpDD->GetCaps(&ddcaps, NULL) != DD_OK)
{
MessageBox(NULL, "IDirectDraw7::GetCaps failed.", "DirectDraw Error", MB_ICONERROR);
}
if ((ddcaps.dwCaps & DDCAPS_OVERLAY) &&
(ddcaps.dwCaps & DDCAPS_OVERLAYSTRETCH))
Overlay = 1;
if (ddcaps.dwCaps & DDCAPS_COLORKEY)
Overlay_Colorkey = 1;
MessageBox(NULL, "IDirectDraw7::GetCaps failed.", "DirectDraw Error", MB_ICONERROR);
}
else Overlay = 0;
if ((ddcaps.dwCaps & DDCAPS_OVERLAY) == 0 ||
(ddcaps.dwCaps & DDCAPS_OVERLAYSTRETCH) == 0)
{
MessageBox(NULL, "Sorry, no support for overlays.", "DirectDraw Error", MB_ICONERROR);
exit(0);
}
if (ddcaps.dwCaps & DDCAPS_COLORKEY)
Overlay_Colorkey = 1;
#endif
if(FullScreen == 1)
{
@@ -1265,26 +1257,27 @@ int InitDirectDraw()
CheckAlwaysOnTop();
}
overlay_failed:
ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2));
ddsd2.dwSize = sizeof(DDSURFACEDESC2);
ddsd2.dwFlags = DDSD_CAPS;
ddsd2.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(!Overlay && FullScreen == 1)
#ifndef OVERLAY_SUPPORT
if(FullScreen == 1)
{
ddsd2.dwFlags |= DDSD_BACKBUFFERCOUNT;
ddsd2.dwBackBufferCount = 2;
ddsd2.ddsCaps.dwCaps |= DDSCAPS_FLIP | DDSCAPS_COMPLEX;
}
#endif
if (lpDD->CreateSurface( &ddsd2, &DD_Primary, NULL) != DD_OK)
{
MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR);
}
if(!Overlay && FullScreen == 1)
#ifndef OVERLAY_SUPPORT
if(FullScreen == 1)
{
ddsd2.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if (DD_Primary->GetAttachedSurface(&ddsd2.ddsCaps, &DD_BackBuffer) != DD_OK)
@@ -1292,6 +1285,7 @@ overlay_failed:
MessageBox(NULL, "IDirectDrawSurface7::GetAttachedSurface failed.", "DirectDraw Error", MB_ICONERROR);
}
}
#endif
if(FullScreen == 0)
{
if (lpDD->CreateClipper(0,&lpDDClipper,NULL) != DD_OK)
@@ -1324,11 +1318,13 @@ overlay_failed:
BitDepth=format.dwRGBBitCount;
GBitMask=format.dwGBitMask; // 0x07E0 or not
if (BitDepth==24 && Overlay==0)
#ifndef OVERLAY_SUPPORT
if (BitDepth==24)
{
MessageBox(NULL,"ZSNESw does not support 24bit color.\nPlease change your resolution to either 16bit or 32bit color","Error",MB_OK);
exit(0);
}
#endif
converta = (BitDepth==16 && GBitMask!=0x07E0);
@@ -1336,8 +1332,9 @@ overlay_failed:
ddsd2.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd2.dwWidth = SurfaceX;
ddsd2.dwHeight = SurfaceY;
if (Overlay)
{
#ifdef OVERLAY_SUPPORT
DWORD flags = DDOVER_SHOW, ddofx_ptr = NULL;
ddsd2.ddsCaps.dwCaps = DDSCAPS_OVERLAY;
@@ -1400,10 +1397,8 @@ overlay_failed:
{
DD_Primary->Release();
Overlay = 0;
Overlay_failed = 1;
OverlayEnabled = 0;
goto overlay_failed;
MessageBox(NULL,"Sorry, no overlay hardware available.", "DirectDraw Error", MB_ICONERROR);
exit(0);
}
if ( hr != DD_OK )
@@ -1477,12 +1472,7 @@ overlay_nocolorkey:
DD_Primary->Blt(&rc1, NULL, &rc1, DDBLT_COLORFILL | DDBLT_WAIT, &ddbfx);
}
LockSurface = (lpLockSurface) &LockSurface_overlay;
UnlockSurface = (lpUnlockSurface) &UnlockSurface_overlay;
}
else
{
#else
ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
@@ -1491,32 +1481,15 @@ overlay_nocolorkey:
{
MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR);
}
LockSurface = (lpLockSurface) &LockSurface_normal;
UnlockSurface = (lpUnlockSurface) &UnlockSurface_normal;
}
#endif
return TRUE;
}
BYTE* SurfBuf;
DDSURFACEDESC2 ddsd;
DWORD __fastcall LockSurface_normal()
{
if (DD_CFB == NULL) return(0);
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
if (DD_CFB->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL) != DD_OK)
{
return(0);
}
SurfBuf = (BYTE*)ddsd.lpSurface;
return(ddsd.lPitch);
}
DWORD __fastcall LockSurface_overlay()
DWORD LockSurface()
{
HRESULT hr;
@@ -1526,9 +1499,11 @@ DWORD __fastcall LockSurface_overlay()
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
if (DD_BackBuffer)
#ifdef OVERLAY_SUPPORT
if (vsyncon == 1 && (DD_BackBuffer))
hr=DD_BackBuffer->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
else
#endif
hr=DD_CFB->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
if (hr != DD_OK)
@@ -1540,19 +1515,15 @@ DWORD __fastcall LockSurface_overlay()
return(ddsd.lPitch);
}
void __fastcall UnlockSurface_normal()
void UnlockSurface()
{
DD_CFB->Unlock((struct tagRECT *)ddsd.lpSurface);
DrawScreen_normal();
}
void __fastcall UnlockSurface_overlay()
{
if (DD_BackBuffer)
#ifdef OVERLAY_SUPPORT
if (vsyncon == 1 && (DD_BackBuffer))
DD_BackBuffer->Unlock((struct tagRECT *)ddsd.lpSurface);
else
#endif
DD_CFB->Unlock((struct tagRECT *)ddsd.lpSurface);
DrawScreen_overlay();
DrawScreen();
}
extern "C" {
@@ -2797,14 +2768,12 @@ int GetMouseButton(void)
if (Y>(GetSystemMetrics( SM_CYSCREEN )-WindowHeight)) Y=(GetSystemMetrics( SM_CYSCREEN )-WindowHeight);
InputRead();
initwinvideo();
if (Overlay && (DD_CFB)) DD_CFB->SetOverlayPosition(X, Y);
}
}
if (Moving==1)
{
Moving=0;
initwinvideo();
if (Overlay && (DD_CFB)) DD_CFB->SetOverlayPosition(X, Y);
}
return((int)MouseButton);
}