Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
134 lines
3.3 KiB
C++
134 lines
3.3 KiB
C++
//==========================================================================;
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
// PURPOSE.
|
|
//
|
|
// Copyright (c) 1995 - 1998 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
// File: ddmm.cpp
|
|
// Content: Routines for using DirectDraw on a multimonitor system
|
|
//--------------------------------------------------------------------------;
|
|
|
|
#include <streams.h>
|
|
#include <ddraw.h>
|
|
#include "ddmm.h"
|
|
|
|
/*
|
|
* FindDeviceCallback
|
|
*/
|
|
typedef struct {
|
|
LPSTR szDevice;
|
|
GUID* lpGUID;
|
|
GUID GUID;
|
|
BOOL fFound;
|
|
} FindDeviceData;
|
|
|
|
BOOL CALLBACK FindDeviceCallback(GUID* lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam)
|
|
{
|
|
FindDeviceData *p = (FindDeviceData*)lParam;
|
|
|
|
if (lstrcmpiA(p->szDevice, szDevice) == 0) {
|
|
if (lpGUID) {
|
|
p->GUID = *lpGUID;
|
|
p->lpGUID = &p->GUID;
|
|
} else {
|
|
p->lpGUID = NULL;
|
|
}
|
|
p->fFound = TRUE;
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CALLBACK FindDeviceCallbackEx(GUID* lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam, HANDLE hMonitor)
|
|
{
|
|
FindDeviceData *p = (FindDeviceData*)lParam;
|
|
|
|
if (lstrcmpiA(p->szDevice, szDevice) == 0) {
|
|
if (lpGUID) {
|
|
p->GUID = *lpGUID;
|
|
p->lpGUID = &p->GUID;
|
|
} else {
|
|
p->lpGUID = NULL;
|
|
}
|
|
p->fFound = TRUE;
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* DirectDrawCreateFromDevice
|
|
*
|
|
* create a DirectDraw object for a particular device
|
|
*/
|
|
IDirectDraw * DirectDrawCreateFromDevice(LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, PDRAWENUM DirectDrawEnumerateP)
|
|
{
|
|
IDirectDraw* pdd = NULL;
|
|
FindDeviceData find;
|
|
|
|
if (szDevice == NULL) {
|
|
DirectDrawCreateP(NULL, &pdd, NULL);
|
|
return pdd;
|
|
}
|
|
|
|
find.szDevice = szDevice;
|
|
find.fFound = FALSE;
|
|
DirectDrawEnumerateP(FindDeviceCallback, (LPVOID)&find);
|
|
|
|
if (find.fFound)
|
|
{
|
|
//
|
|
// In 4bpp mode the following DDraw call causes a message box to be popped
|
|
// up by DDraw (!?!). It's DDraw's fault, but we don't like it. So we
|
|
// make sure it doesn't happen.
|
|
//
|
|
UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
|
DirectDrawCreateP(find.lpGUID, &pdd, NULL);
|
|
SetErrorMode(ErrorMode);
|
|
}
|
|
|
|
return pdd;
|
|
}
|
|
|
|
|
|
/*
|
|
* DirectDrawCreateFromDeviceEx
|
|
*
|
|
* create a DirectDraw object for a particular device
|
|
*/
|
|
IDirectDraw * DirectDrawCreateFromDeviceEx(LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, LPDIRECTDRAWENUMERATEEXA DirectDrawEnumerateExP)
|
|
{
|
|
IDirectDraw* pdd = NULL;
|
|
FindDeviceData find;
|
|
|
|
if (szDevice == NULL) {
|
|
DirectDrawCreateP(NULL, &pdd, NULL);
|
|
return pdd;
|
|
}
|
|
|
|
find.szDevice = szDevice;
|
|
find.fFound = FALSE;
|
|
DirectDrawEnumerateExP(FindDeviceCallbackEx, (LPVOID)&find,
|
|
DDENUM_ATTACHEDSECONDARYDEVICES);
|
|
|
|
if (find.fFound)
|
|
{
|
|
//
|
|
// In 4bpp mode the following DDraw call causes a message box to be popped
|
|
// up by DDraw (!?!). It's DDraw's fault, but we don't like it. So we
|
|
// make sure it doesn't happen.
|
|
//
|
|
UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
|
DirectDrawCreateP(find.lpGUID, &pdd, NULL);
|
|
SetErrorMode(ErrorMode);
|
|
}
|
|
|
|
return pdd;
|
|
}
|