📄 ddpdb.c
字号:
/* RGB blits only: */
{F(CID_RGB32),
F(CID_RGB24),
F(CID_RGB565),
F(CID_RGB555),
F(CID_RGB8)}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"Chips And Technologies, Accelerator (new)", "chipsnd.drv",
0x3b6,0x40013,0x102c, 0xe0, 0x0, 0x0, {0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}},
/* do NOT use overlays !!!: */
{0, 0, 0, 0, 0},
/* blits (use YUY2s & matching RGBs only): */
{F(CID_YUY2) + F(CID_RGB32),
F(CID_YUY2) + F(CID_RGB24),
F(CID_YUY2) + F(CID_RGB565),
F(CID_YUY2) + F(CID_RGB555),
F(CID_YUY2) + F(CID_RGB8)}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"Cirrus Logic 7548 PCI", "cirrusmm.drv", 0x7ee,0x40003,
0x1013, 0x38, 0x0, 0x0,
{0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}},
/* does not have overlays...: */
{0, 0, 0, 0, 0},
/* RGB blits only: */
{F(CID_RGB32),
F(CID_RGB24),
F(CID_RGB565),
F(CID_RGB555),
F(CID_RGB8)}
},
/* NeoMagic controllers (widely used in Dell laptops): */
{
VER_PLATFORM_WIN32_WINDOWS,
{"NeoMagic MagicGraph 128XD", "NmgcDD.dll", 0x10006,0x4000a,
0x10c8, 0x4, 0x751028, 0x0,
{0xd7b71e28,0x4344,0x11cf,{0x9e,0x73,0x74,0x20,0xa5,0xc2,0xc9,0x35}}},
/* overlays (use YUY2 only): */
{F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2)},
/* don't use BLITS!!!: */
{0, 0, 0, 0, 0}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"NeoMagic MagicGraph 128XD", "Nmgc.drv",
0x10004,0x4000a, 0x10c8, 0x4, 0x0, 0x0, {0,0,0,{0,0,0,0,0,0,0,0}}},
/* overlays (use YUY2 only): */
{F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2)},
/* don't use BLITS!!!: */
{0, 0, 0, 0, 0}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"NeoMagic MagicGraph 128 PCI", "nmx.drv",
0x5920000,0x40003, 0x0, 0x0, 0x0, 0x0, {0,0,0,{0,0,0,0,0,0,0,0}}},
/* overlays (use YUY2 only): */
{F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2)},
/* don't use BLITS!!!: */
{0, 0, 0, 0, 0}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"Diamond Stealth II G460",
"s2g432le.dll",
0x10542,0x4000a,
0x8086, 0x7800, 0x0, 0x0,
{0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}},
/* overlays (use YUY2 only): */
{F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2),
F(CID_YUY2)},
/* blits (use matching RGBs only): */
{F(CID_RGB32),
F(CID_RGB24),
F(CID_RGB565),
F(CID_RGB555),
F(CID_RGB8)}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"Diamond Stealth II G460",
"s2g432le.dll",
0x10542,0x4000a,
0x8086, 0x7800, 0x1001092, 0x21,
{0xd7b78e66,0x3b40,0x11cf,{0x60,0x76,0x1,0x21,0x84,0xc2,0xc9,0x35}}},
/* don't use overlays: */
{0, 0, 0, 0, 0},
/* blits (use matching RGBs only): */
{F(CID_RGB32),
F(CID_RGB24),
F(CID_RGB565),
F(CID_RGB555),
F(CID_RGB8)}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"NeoMagic MagicMedia 256AV",
"NmgcDD5.dll",
0x11451,0x4000a,
0x10c8, 0x5, 0x8f1028, 0x20,
{0xd7b71e28,0x4345,0x11cf,{0xc9,0x67,0x8e,0x20,0x85,0xc2,0xc9,0x35}}},
/* do NOT use overlays !!!: */
{0, 0, 0, 0, 0},
/* no blits either: */
{0, 0, 0, 0, 0}
},
{
VER_PLATFORM_WIN32_WINDOWS,
{"NVIDIA RIVA TNT2 Ultra",
"NVDD32.DLL",
0x10170,0x4000c,
0x10de, 0x29, 0x10211102, 0x11,
{0xd7b71e3e,0x4369,0x11cf,{0xc2,0x73,0x20,0x30,0xb2,0xc2,0xc9,0x35}}},
/* don't use overlays: */
{0, 0, 0, 0, 0},
/* no blits either: */
{0, 0, 0, 0, 0}
}}
};
static BOOL DDPDB_Opened = FALSE;
static BOOL DDPDB_NewProfile = FALSE;
static time_t DDPDB_FileTime;
/*
* Initializes profile database:
*/
BOOL DDPDB_Open(char *pszProfile)
{
BOOL bRet = FALSE;
/* check arguments: */
if (pszProfile && *pszProfile) {
struct _stat st;
/* get profile info: */
if (!_stat(pszProfile, &st) &&
/* check if we need to reload it: */
(!DDPDB_Opened || st.st_mtime != DDPDB_FileTime)) {
FILE *fp;
size_t s;
/* save profile time: */
DDPDB_FileTime = st.st_mtime;
/* try to open profile: */
if ((fp = fopen(pszProfile, "rb")) != NULL) {
/* try to read this file: */
if ((s = fread((void*)&DDPDB, 1, sizeof DDPDB, fp)) > 0 &&
!strncmp(DDPDB.szMagic, DDPDB_MAGIC, 5) &&
DDPDB.dwVersion >= DDPDB_VERSION &&
DDPDB.dwNumProfiles >= 1 &&
DDPDB.dwNumProfiles < MAXPROFILES &&
DDPDB.dwNumProfiles * sizeof(DDDEVICEPROFILE) + 16 == s) {
/* success: */
DDPDB_Opened ++;
DDPDB_NewProfile = TRUE;
bRet = TRUE;
}
/* close file: */
fclose(fp);
}
}
}
return bRet;
}
/*
* Terminates the use of profile database:
*/
BOOL DDPDB_Close ()
{
return DDPDB_Opened && !--DDPDB_Opened;
}
/*
* Checks if profile has been updated.
*/
BOOL DDPDB_IsNewProfile ()
{
BOOL bResult = DDPDB_NewProfile;
DDPDB_NewProfile = FALSE;
return bResult;
}
/*********************
* Default device profiles:
*/
static DDDEVICEPROFILE ddWinNTDefaultProfile =
{
VER_PLATFORM_WIN32_NT,
{"", "", 0,0, 0},
/* overlays (use YUVs only): */
{F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY)},
/* blits (use YUVs & matching RGBs): */
{F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB32),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB24),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB565),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB555),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB8)}
};
static DDDEVICEPROFILE ddWin9xDefaultProfile =
{
VER_PLATFORM_WIN32_WINDOWS,
{"", "", 0,0, 0,0,0,0, 0},
/* overlays (use YUVs only): */
{F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY)},
/* blits (use YUVs & matching RGBs): */
{F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB32),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB24),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB565),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB555),
F(CID_YV12) + F(CID_YUY2) + F(CID_UYVY) + F(CID_RGB8)}
};
/*
* Get pointer to a best matching DirectDraw device profile.
*/
LPDDDEVICEPROFILE DDPDB_GetDeviceProfile (LPDIRECTDRAW lpDD)
{
OSVERSIONINFO osVersion;
DDDEVICEIDENTIFIER ddID; /* DirectDraw & Win95 info */
char szChipType[MAXCHIPTYPE]; /* NT info */
unsigned int bestMatchIdx, deviceBestMatch, driverBestMatch;
unsigned int i, deviceMatch, driverMatch;
#if DIRECTDRAW_VERSION > 0x0500
LPDIRECTDRAW4 lpDD4;
#endif
/* check if we are runnning NT: */
memset(&osVersion,0, sizeof(OSVERSIONINFO));
osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osVersion) && osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) {
/* try to get WinNT device information: */
if (GetWinNTDeviceID (&ddID, szChipType)) {
/* clear best match criteria: */
deviceBestMatch = driverBestMatch = bestMatchIdx = 0;
/* scan database: */
for (i = 0; i < DDPDB.dwNumProfiles; i++) {
/* check platform ID: */
if (DDPDB.ddProfiles[i].dwPlatformId == VER_PLATFORM_WIN32_NT) {
/* clear match criteria: */
deviceMatch = driverMatch = 0;
/* check non-critical parameters: */
if (!DDPDB.ddProfiles[i].ID.WinNT.szDescription[0] ||
!strncmp (DDPDB.ddProfiles[i].ID.WinNT.szDescription, ddID.szDescription, MAXDESCRIPT-1))
deviceMatch ++;
if (!DDPDB.ddProfiles[i].ID.WinNT.szDriver[0] ||
!strnicmp (DDPDB.ddProfiles[i].ID.WinNT.szDriver, ddID.szDriver, MAXDRIVER-1))
driverMatch ++;
/* check critical data: */
if (!DDPDB.ddProfiles[i].ID.WinNT.dwDriverVersionHighPart)
driverMatch ++;
else if (DDPDB.ddProfiles[i].ID.WinNT.dwDriverVersionHighPart == (DWORD)ddID.liDriverVersion.HighPart)
driverMatch += 2;
else
continue;
if (!DDPDB.ddProfiles[i].ID.WinNT.dwDriverVersionLowPart)
driverMatch ++;
else if (DDPDB.ddProfiles[i].ID.WinNT.dwDriverVersionLowPart == (DWORD)ddID.liDriverVersion.LowPart)
driverMatch += 2;
else
continue;
if (!DDPDB.ddProfiles[i].ID.WinNT.szChipType[0])
deviceMatch += 1;
else if (!strncmp (DDPDB.ddProfiles[i].ID.WinNT.szChipType, szChipType, MAXCHIPTYPE-1))
deviceMatch += 2;
else
continue;
/* check the results: */
if (deviceMatch + driverMatch > deviceBestMatch + driverBestMatch &&
deviceMatch >= deviceBestMatch && driverMatch >= driverBestMatch)
{
/* update best match: */
deviceBestMatch = deviceMatch;
driverBestMatch = driverMatch;
bestMatchIdx = i;
}
}
}
/* check overal search results: */
if (deviceBestMatch && driverBestMatch >= 3)
{
return DDPDB.ddProfiles + bestMatchIdx ;
}
}
/* return WinNT default profile: */
return &ddWinNTDefaultProfile;
} else { /* Win9x: */
/* try to get DirectDraw device identifier: */
memset (&ddID, 0, sizeof (DDDEVICEIDENTIFIER));
#if DIRECTDRAW_VERSION > 0x0500 && !defined(IMPORT)
if ((IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void**)&lpDD4) == DD_OK &&
IDirectDraw4_GetDeviceIdentifier(lpDD4, &ddID, DDGDI_GETHOSTIDENTIFIER) == DD_OK) ||
/* try to gather Win9x device information manually: */
GetWin9xDeviceID (&ddID)) {
/* clear best match criteria: */
deviceBestMatch = driverBestMatch = bestMatchIdx = 0;
/* scan database: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -