📄 d3dutil.cpp
字号:
// --------------------------------------------------------------------------
// Dingus project - a collection of subsystems for game/graphics applications
// --------------------------------------------------------------------------
#include "stdafx.h"
#include "D3DUtil.h"
#include "DXUtil.h"
const TCHAR* dingus::convertD3DFormatToString( D3DFORMAT format )
{
const TCHAR* pstr = NULL;
switch( format ) {
case D3DFMT_UNKNOWN: pstr = TEXT("UNKNOWN"); break;
case D3DFMT_R8G8B8: pstr = TEXT("R8G8B8"); break;
case D3DFMT_A8R8G8B8: pstr = TEXT("A8R8G8B8"); break;
case D3DFMT_X8R8G8B8: pstr = TEXT("X8R8G8B8"); break;
case D3DFMT_R5G6B5: pstr = TEXT("R5G6B5"); break;
case D3DFMT_X1R5G5B5: pstr = TEXT("X1R5G5B5"); break;
case D3DFMT_A1R5G5B5: pstr = TEXT("A1R5G5B5"); break;
case D3DFMT_A4R4G4B4: pstr = TEXT("A4R4G4B4"); break;
case D3DFMT_R3G3B2: pstr = TEXT("R3G3B2"); break;
case D3DFMT_A8: pstr = TEXT("A8"); break;
case D3DFMT_A8R3G3B2: pstr = TEXT("A8R3G3B2"); break;
case D3DFMT_X4R4G4B4: pstr = TEXT("X4R4G4B4"); break;
case D3DFMT_A2B10G10R10: pstr = TEXT("A2B10G10R10"); break;
case D3DFMT_A8B8G8R8: pstr = TEXT("A8B8G8R8"); break;
case D3DFMT_X8B8G8R8: pstr = TEXT("X8B8G8R8"); break;
case D3DFMT_G16R16: pstr = TEXT("G16R16"); break;
case D3DFMT_A2R10G10B10: pstr = TEXT("A2R10G10B10"); break;
case D3DFMT_A16B16G16R16: pstr = TEXT("A16B16G16R16"); break;
case D3DFMT_A8P8: pstr = TEXT("A8P8"); break;
case D3DFMT_P8: pstr = TEXT("P8"); break;
case D3DFMT_L8: pstr = TEXT("L8"); break;
case D3DFMT_A8L8: pstr = TEXT("A8L8"); break;
case D3DFMT_A4L4: pstr = TEXT("A4L4"); break;
case D3DFMT_V8U8: pstr = TEXT("V8U8"); break;
case D3DFMT_L6V5U5: pstr = TEXT("L6V5U5"); break;
case D3DFMT_X8L8V8U8: pstr = TEXT("X8L8V8U8"); break;
case D3DFMT_Q8W8V8U8: pstr = TEXT("Q8W8V8U8"); break;
case D3DFMT_V16U16: pstr = TEXT("V16U16"); break;
case D3DFMT_A2W10V10U10: pstr = TEXT("A2W10V10U10"); break;
case D3DFMT_UYVY: pstr = TEXT("UYVY"); break;
case D3DFMT_YUY2: pstr = TEXT("YUY2"); break;
case D3DFMT_DXT1: pstr = TEXT("DXT1"); break;
case D3DFMT_DXT2: pstr = TEXT("DXT2"); break;
case D3DFMT_DXT3: pstr = TEXT("DXT3"); break;
case D3DFMT_DXT4: pstr = TEXT("DXT4"); break;
case D3DFMT_DXT5: pstr = TEXT("DXT5"); break;
case D3DFMT_D16_LOCKABLE: pstr = TEXT("D16_LOCKABLE"); break;
case D3DFMT_D32: pstr = TEXT("D32"); break;
case D3DFMT_D15S1: pstr = TEXT("D15S1"); break;
case D3DFMT_D24S8: pstr = TEXT("D24S8"); break;
case D3DFMT_D24X8: pstr = TEXT("D24X8"); break;
case D3DFMT_D24X4S4: pstr = TEXT("D24X4S4"); break;
case D3DFMT_D16: pstr = TEXT("D16"); break;
case D3DFMT_L16: pstr = TEXT("L16"); break;
case D3DFMT_VERTEXDATA: pstr = TEXT("VERTEXDATA"); break;
case D3DFMT_INDEX16: pstr = TEXT("INDEX16"); break;
case D3DFMT_INDEX32: pstr = TEXT("INDEX32"); break;
case D3DFMT_Q16W16V16U16: pstr = TEXT("Q16W16V16U16"); break;
case D3DFMT_MULTI2_ARGB8: pstr = TEXT("MULTI2_ARGB8"); break;
case D3DFMT_R16F: pstr = TEXT("R16F"); break;
case D3DFMT_G16R16F: pstr = TEXT("G16R16F"); break;
case D3DFMT_A16B16G16R16F: pstr = TEXT("A16B16G16R16F"); break;
case D3DFMT_R32F: pstr = TEXT("R32F"); break;
case D3DFMT_G32R32F: pstr = TEXT("G32R32F"); break;
case D3DFMT_A32B32G32R32F: pstr = TEXT("A32B32G32R32F"); break;
case D3DFMT_CxV8U8: pstr = TEXT("CxV8U8"); break;
default: pstr = TEXT("Unknown format"); break;
}
return pstr;
}
HRESULT dingus::setDeviceCursor( IDirect3DDevice9& device, HCURSOR hCursor )
{
HRESULT hr = E_FAIL;
ICONINFO iconinfo;
bool bwCursor;
IDirect3DSurface9* cursorSurface = NULL;
HDC hdcColor = NULL;
HDC hdcMask = NULL;
HDC hdcScreen = NULL;
BITMAP bm;
DWORD dwWidth;
DWORD dwHeightSrc;
DWORD dwHeightDest;
COLORREF crColor;
COLORREF crMask;
int x;
int y;
BITMAPINFO bmi;
COLORREF* pcrArrayColor = NULL;
COLORREF* pcrArrayMask = NULL;
DWORD* pBitmap;
HGDIOBJ hgdiobjOld;
ZeroMemory( &iconinfo, sizeof(iconinfo) );
if( !GetIconInfo( hCursor, &iconinfo ) )
goto _end;
if( 0 == GetObject((HGDIOBJ)iconinfo.hbmMask, sizeof(BITMAP), (LPVOID)&bm) )
goto _end;
dwWidth = bm.bmWidth;
dwHeightSrc = bm.bmHeight;
if( iconinfo.hbmColor == NULL ) {
bwCursor = TRUE;
dwHeightDest = dwHeightSrc / 2;
} else {
bwCursor = FALSE;
dwHeightDest = dwHeightSrc;
}
// Create a surface for the fullscreen cursor
if( FAILED( hr = device.CreateOffscreenPlainSurface( dwWidth, dwHeightDest,
D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &cursorSurface, NULL ) ) )
{
goto _end;
}
pcrArrayMask = new DWORD[dwWidth * dwHeightSrc];
ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = dwWidth;
bmi.bmiHeader.biHeight = dwHeightSrc;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
hdcScreen = GetDC( NULL );
hdcMask = CreateCompatibleDC( hdcScreen );
if( hdcMask == NULL )
{
hr = E_FAIL;
goto _end;
}
hgdiobjOld = SelectObject(hdcMask, iconinfo.hbmMask);
GetDIBits(hdcMask, iconinfo.hbmMask, 0, dwHeightSrc,
pcrArrayMask, &bmi, DIB_RGB_COLORS);
SelectObject(hdcMask, hgdiobjOld);
if (!bwCursor)
{
pcrArrayColor = new DWORD[dwWidth * dwHeightDest];
hdcColor = CreateCompatibleDC( hdcScreen );
if( hdcColor == NULL )
{
hr = E_FAIL;
goto _end;
}
SelectObject(hdcColor, iconinfo.hbmColor);
GetDIBits(hdcColor, iconinfo.hbmColor, 0, dwHeightDest,
pcrArrayColor, &bmi, DIB_RGB_COLORS);
}
// Transfer cursor image into the surface
D3DLOCKED_RECT lr;
cursorSurface->LockRect( &lr, NULL, 0 );
pBitmap = (DWORD*)lr.pBits;
for( y = 0; y < dwHeightDest; y++ )
{
for( x = 0; x < dwWidth; x++ )
{
if (bwCursor)
{
crColor = pcrArrayMask[dwWidth*(dwHeightDest-1-y) + x];
crMask = pcrArrayMask[dwWidth*(dwHeightSrc-1-y) + x];
}
else
{
crColor = pcrArrayColor[dwWidth*(dwHeightDest-1-y) + x];
crMask = pcrArrayMask[dwWidth*(dwHeightDest-1-y) + x];
}
if (crMask == 0)
pBitmap[dwWidth*y + x] = 0xff000000 | crColor;
else
pBitmap[dwWidth*y + x] = 0x00000000;
}
}
cursorSurface->UnlockRect();
// Set the device cursor
if( FAILED( hr = device.SetCursorProperties( iconinfo.xHotspot,
iconinfo.yHotspot, cursorSurface ) ) )
{
goto _end;
}
hr = S_OK;
_end:
if( iconinfo.hbmMask != NULL )
DeleteObject( iconinfo.hbmMask );
if( iconinfo.hbmColor != NULL )
DeleteObject( iconinfo.hbmColor );
if( hdcScreen != NULL )
ReleaseDC( NULL, hdcScreen );
if( hdcColor != NULL )
DeleteDC( hdcColor );
if( hdcMask != NULL )
DeleteDC( hdcMask );
safeDeleteArray( pcrArrayColor );
safeDeleteArray( pcrArrayMask );
safeRelease( cursorSurface );
return hr;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -