mirror of
https://github.com/PCSX2/pcsx2.git
synced 2025-04-02 10:52:54 -04:00
Update it to the version found at https://github.com/Microsoft/Windows-classic-samples , which is in an MIT licensed repo, and add the LICENSE file (edited to remove the SIL Open Font LICENSE part since that doesn't apply). Some modifications have been made to reduce the diff/stop git complaining (not including any file that wasn't in the previous version and removing the related header includes in streams.h, and fixing some but not all of the whitespace issues).
129 lines
3 KiB
C++
129 lines
3 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: DDMM.cpp
|
|
//
|
|
// Desc: DirectShow base classes - implements routines for using DirectDraw
|
|
// on a multimonitor system.
|
|
//
|
|
// Copyright (c) 1995-2001 Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
#include <streams.h>
|
|
#include <ddraw.h>
|
|
#include "ddmm.h"
|
|
|
|
/*
|
|
* FindDeviceCallback
|
|
*/
|
|
typedef struct {
|
|
LPSTR szDevice;
|
|
GUID* lpGUID;
|
|
GUID GUID;
|
|
BOOL fFound;
|
|
} FindDeviceData;
|
|
|
|
BOOL CALLBACK FindDeviceCallback(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in 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(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam, HMONITOR 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(__in_opt 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(__in_opt 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;
|
|
}
|