diff options
author | Casimir666 <casimir666@users.sourceforge.net> | 2009-03-01 12:49:27 +0300 |
---|---|---|
committer | Casimir666 <casimir666@users.sourceforge.net> | 2009-03-01 12:49:27 +0300 |
commit | 7a7ddcb79fd2de74e1105cd7aebb8acfbd76cb6b (patch) | |
tree | 000c2216c29c6d52701666b4b1388a2a841025eb /src/filters/BaseClasses/ddmm.cpp | |
parent | 3f89e9541a0031cf320bb412855ce9131ef0e4a1 (diff) |
Added: Microsoft BaseClasses to the SVN
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@1006 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/filters/BaseClasses/ddmm.cpp')
-rw-r--r-- | src/filters/BaseClasses/ddmm.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/filters/BaseClasses/ddmm.cpp b/src/filters/BaseClasses/ddmm.cpp new file mode 100644 index 000000000..bfa700cb8 --- /dev/null +++ b/src/filters/BaseClasses/ddmm.cpp @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------
+// 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;
+}
|