📄 directdraw.cpp
字号:
return;
}
}
}
///////////////////////////////////////////////////////////////////////////////
//
BOOL
DDLoadBitmap( LPDIRECTDRAW lpDirectDraw, LPSURFACEINFO lpSurfaceInfo, char* lpszFilePath )
{
HBITMAP hbm;
BITMAP bm;
hbm = ( HBITMAP )LoadImage( NULL, lpszFilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );
if ( hbm == NULL )
{
return FALSE;
}
GetObject( hbm, sizeof( bm ), &bm );
//DDSURFACEDESC ddsd;
//LPDIRECTDRAWSURFACE pdds;
//ZeroMemory( &ddsd, sizeof( ddsd ) );
//ddsd.dwSize = sizeof( ddsd );
//ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
//ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
//ddsd.dwWidth = bm.bmWidth;
//ddsd.dwHeight = bm.bmHeight;
//if ( lpDirectDraw->CreateSurface( &ddsd, &pdds, NULL ) == DD_OK )
//{
// lpSurfaceInfo->lpSurface = pdds;
//}
//else
//{
// lpSurfaceInfo->lpSurface = NULL;
//}
lpSurfaceInfo->rect.left = 0;
lpSurfaceInfo->rect.top = 0;
lpSurfaceInfo->rect.right = bm.bmWidth;
lpSurfaceInfo->rect.bottom = bm.bmHeight;
lpSurfaceInfo->lpSurface = CreateSurface( lpDirectDraw, bm.bmWidth, bm.bmHeight );
DDCopyBitmap( lpSurfaceInfo->lpSurface, hbm, 0, 0, 0, 0 );
DeleteObject( hbm );
// lpSurfaceInfo->dwFillColor = DDColorMatch( lpSurfaceInfo->lpSurface, RGB( 255, 0, 255 ) );
// DDSetColorKey( lpSurfaceInfo->lpSurface, lpSurfaceInfo->dwFillColor );
DDSetColorKey( lpSurfaceInfo->lpSurface, RGB( 255, 0, 255 ) );
return TRUE;
}
BOOL
DDReLoadBitmap( LPDIRECTDRAWSURFACE lpSurface, char* lpszFilePath )
{
HBITMAP hBitmap;
hBitmap = ( HBITMAP )LoadImage( NULL, lpszFilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );
if ( hBitmap == NULL )
{
return FALSE;
}
DDCopyBitmap( lpSurface, hBitmap, 0, 0, 0, 0 );
DeleteObject( hBitmap );
return TRUE;
}
BOOL
DDCopyBitmap( LPDIRECTDRAWSURFACE lpSurface, HBITMAP hBitmap, int x, int y, int dx, int dy )
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
DDSURFACEDESC ddsd;
if ( hBitmap == NULL || lpSurface == NULL )
{
return FALSE;
}
lpSurface->Restore( );
hdcImage = CreateCompatibleDC( NULL );
if ( !hdcImage )
{
return FALSE;
}
SelectObject( hdcImage, hBitmap );
GetObject( hBitmap, sizeof( bm ), &bm );
dx = dx == 0 ? bm.bmWidth : dx;
dy = dy == 0 ? bm.bmHeight : dy;
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
lpSurface->GetSurfaceDesc( &ddsd );
if ( lpSurface->GetDC( &hdc ) == DD_OK )
{
StretchBlt( hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY );
lpSurface->ReleaseDC( hdc );
}
DeleteDC( hdcImage );
return TRUE;
}
DWORD
DDColorMatch( LPDIRECTDRAWSURFACE lpSurface, COLORREF rgb )
{
COLORREF rgbT;
HDC hdc;
DWORD dw = CLR_INVALID;
DDSURFACEDESC ddsd;
HRESULT hResult;
if ( rgb != CLR_INVALID && lpSurface->GetDC( &hdc ) == DD_OK )
{
rgbT = GetPixel( hdc, 0, 0 );
SetPixel( hdc, 0, 0, rgb );
lpSurface->ReleaseDC( hdc );
}
ddsd.dwSize = sizeof( ddsd );
while ( ( hResult = lpSurface->Lock( NULL, &ddsd, 0, NULL ) ) == DDERR_WASSTILLDRAWING )
{
;
}
if ( hResult == DD_OK )
{
dw = *( DWORD* )ddsd.lpSurface;
if ( ddsd.ddpfPixelFormat.dwRGBBitCount < 32 )
{
dw &= ( 1 << ddsd.ddpfPixelFormat.dwRGBBitCount ) - 1;
}
lpSurface->Unlock( NULL );
}
if ( rgb != CLR_INVALID && lpSurface->GetDC( &hdc ) == DD_OK )
{
SetPixel( hdc, 0, 0, rgbT );
lpSurface->ReleaseDC( hdc );
}
return dw;
}
HRESULT
DDSetColorKey( LPDIRECTDRAWSURFACE lpSurface, COLORREF rgb )
{
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = DDColorMatch( lpSurface, rgb );
ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
return lpSurface->SetColorKey( DDCKEY_SRCBLT, &ddck );
}
void
StretchBltScreen( LPDIRECTDRAWSURFACE lpSurfaceDst, LPRECT lpRectDst,
LPDIRECTDRAWSURFACE lpSurfaceSrc, LPRECT lpRectSrc,
DWORD dwColorFill, int nDirection )
{
DDBLTFX ddbltfx;
ZeroMemory( &ddbltfx, sizeof( ddbltfx ) );
ddbltfx.dwSize = sizeof( ddbltfx );
ddbltfx.dwFillColor = dwColorFill;
lpSurfaceDst->Blt( lpRectDst, lpSurfaceSrc, lpRectSrc, DDBLT_KEYSRC | DDBLT_DDFX | DDBLT_WAIT, &ddbltfx );
}
void
BltGrid( LPDIRECTDRAWSURFACE lpSurfaceDst, LPRECT lpRectDst, LPDIRECTDRAWSURFACE lpSurfaceSrc, LPRECT lpRectSrc )
{
DDSURFACEDESC ddsdSrc, ddsdDst;
register int x, y;
WORD wColorKey;
ZeroMemory( &ddsdSrc, sizeof( ddsdSrc ) );
ddsdSrc.dwSize = sizeof( ddsdSrc );
ddsdSrc.dwFlags = DDSD_PIXELFORMAT;
if ( FAILED( lpSurfaceSrc->GetSurfaceDesc( &ddsdSrc ) ) )
{
return;
}
ZeroMemory( &ddsdDst, sizeof( ddsdDst ) );
ddsdDst.dwSize = sizeof( ddsdDst );
if ( FAILED( lpSurfaceDst->GetSurfaceDesc( &ddsdDst ) ) )
{
return;
}
DDPIXELFORMAT ddpfSrc;
ZeroMemory( &ddpfSrc, sizeof( ddpfSrc ) );
ddpfSrc.dwSize = sizeof( ddpfSrc );
lpSurfaceSrc->GetPixelFormat( &ddpfSrc );
switch ( ddpfSrc.dwRBitMask )
{
case 0x7C00: // RGB 5:5:5
wColorKey = ( 255 >> 3 ); // Blue
wColorKey += ( 0 >> 3 ) << 5; // Green
wColorKey += ( 255 >> 3 ) << 10; // Red
break;
case 0xF800: // RGB 5:6:5
wColorKey = ( 255 >> 3 ); // Blue
wColorKey += ( 0 >> 2 ) << 5; // Green
wColorKey += ( 255 >> 3 ) << 11; // Red
break;
}
if ( FAILED( lpSurfaceSrc->Lock( NULL, &ddsdSrc, DDLOCK_WAIT, NULL ) ) )
{
return;
}
if ( FAILED( lpSurfaceDst->Lock( NULL, &ddsdDst, DDLOCK_WAIT, NULL ) ) )
{
lpSurfaceSrc->Unlock( NULL );
return;
}
LPWORD lpwSrc = ( LPWORD )ddsdSrc.lpSurface + lpRectSrc->top * ( ddsdSrc.lPitch / sizeof( WORD ) ) + lpRectSrc->left;
LPWORD lpwDst = ( LPWORD )ddsdDst.lpSurface + lpRectDst->top * ( ddsdDst.lPitch / sizeof( WORD ) ) + lpRectDst->left;
int cx = lpRectDst->right - lpRectDst->left;
int cy = lpRectDst->bottom - lpRectDst->top;
for ( y = 0; y < cy; y++ )
{
for ( x = 0; x < cx; x++ )
{
if ( y % 2 == 0 )
{
if ( x % 2 == 0 )
{
if ( *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) != wColorKey )
{
*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
}
}
}
else
{
if ( x % 2 == 1 )
{
if ( *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) != wColorKey )
{
*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
}
}
}
}
}
lpSurfaceSrc->Unlock( NULL );
lpSurfaceDst->Unlock( NULL );
}
void
BltTrans( LPDIRECTDRAWSURFACE lpSurfaceDst, LPRECT lpRectDst, LPDIRECTDRAWSURFACE lpSurfaceSrc, LPRECT lpRectSrc )
{
DDSURFACEDESC ddsdSrc, ddsdDst;
register int x, y;
WORD wColorKey;
WORD wSrcRed, wSrcGreen, wSrcBlue;
WORD wDstRed, wDstGreen, wDstBlue;
WORD wImageSrc, wImageDst;
ZeroMemory( &ddsdSrc, sizeof( ddsdSrc ) );
ddsdSrc.dwSize = sizeof( ddsdSrc );
ddsdSrc.dwFlags = DDSD_PIXELFORMAT;
if ( FAILED( lpSurfaceSrc->GetSurfaceDesc( &ddsdSrc ) ) )
{
return;
}
ZeroMemory( &ddsdDst, sizeof( ddsdDst ) );
ddsdDst.dwSize = sizeof( ddsdDst );
if ( FAILED( lpSurfaceDst->GetSurfaceDesc( &ddsdDst ) ) )
{
return;
}
DDPIXELFORMAT ddpfSrc;
ZeroMemory( &ddpfSrc, sizeof( ddpfSrc ) );
ddpfSrc.dwSize = sizeof( ddpfSrc );
lpSurfaceSrc->GetPixelFormat( &ddpfSrc );
switch ( ddpfSrc.dwRBitMask )
{
case 0x7C00: // RGB 5:5:5
wColorKey = ( 255 >> 3 ); // Blue
wColorKey += ( 0 >> 3 ) << 5; // Green
wColorKey += ( 255 >> 3 ) << 10; // Red
break;
case 0xF800: // RGB 5:6:5
wColorKey = ( 255 >> 3 ); // Blue
wColorKey += ( 0 >> 2 ) << 5; // Green
wColorKey += ( 255 >> 3 ) << 11; // Red
break;
}
if ( FAILED( lpSurfaceSrc->Lock( NULL, &ddsdSrc, DDLOCK_WAIT, NULL ) ) )
{
return;
}
if ( FAILED( lpSurfaceDst->Lock( NULL, &ddsdDst, DDLOCK_WAIT, NULL ) ) )
{
lpSurfaceSrc->Unlock( NULL );
return;
}
LPWORD lpwSrc = ( LPWORD )ddsdSrc.lpSurface + lpRectSrc->top * ( ddsdSrc.lPitch / sizeof( WORD ) ) + lpRectSrc->left;
LPWORD lpwDst = ( LPWORD )ddsdDst.lpSurface + lpRectDst->top * ( ddsdDst.lPitch / sizeof( WORD ) ) + lpRectDst->left;
int cx = lpRectDst->right - lpRectDst->left;
int cy = lpRectDst->bottom - lpRectDst->top;
LPWORD lpwImageSrc, lpwImageDst;
for ( y = 0; y < cy; y++ )
{
lpwImageSrc = lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) );
lpwImageDst = lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) );
for ( x = 0; x < cx; x++ )
{
//wSrc = *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
//lpwImageSrc = ( LPWORD )*( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
if ( *lpwImageSrc != wColorKey )
{
wImageSrc = *lpwImageSrc;
wImageDst = *lpwImageDst;
//wDst = *( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
//lpwImageDst = ( LPWORD )*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
//wSrcRed = ( ( wSrc ) ) & ( 0x1F );
//wSrcGreen = ( ( wSrc ) >> 5 ) & ( 0x1F );
//wSrcBlue = ( ( wSrc ) >> 10 ) & ( 0x1F );
//wSrc = ( ( ( wSrcBlue * 11 ) + ( wSrcGreen * 59 ) + ( wSrcRed * 30 ) ) / 100 );
//wSrc = ( ( WORD )( ( ( BYTE )( wSrc ) | ( ( WORD )( ( BYTE )( wSrc ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wSrc ) ) << 10 ) ) );
//wDstRed = ( ( wDst ) ) & ( 0x1F );
//wDstGreen = ( ( wDst ) >> 5 ) & ( 0x1F );
//wDstBlue = ( ( wDst ) >> 10 ) & ( 0x1F );
//wDst = ( ( ( wDstBlue * 11 ) + ( wDstGreen * 59 ) + ( wDstRed * 30 ) ) / 100 );
//wDst = ( ( WORD )( ( ( BYTE )( wDst ) | ( ( WORD )( ( BYTE )( wDst ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wDst ) ) << 10 ) ) );
wSrcBlue = ( wImageSrc ) & ( 0x001f );
wSrcGreen = ( wImageSrc >> 5 ) & ( 0x001f );
wSrcRed = ( wImageSrc >> 10 ) & ( 0x001f );
wDstBlue = ( wImageDst ) & ( 0x001f );
wDstGreen = ( wImageDst >> 5 ) & ( 0x001f );
wDstRed = ( wImageDst >> 10 ) & ( 0x001f );
//wPixel = ( ( ( wBlue * 11 ) + ( wGreen * 59 ) + ( wRed * 30 ) ) / 100 );
//wPixel = ( ( WORD )( ( ( BYTE )( Pixel ) | ( ( WORD )( ( BYTE )( wPixel ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wPixel ) ) << 10 ) ) );
// wPixel = ( ( WORD )( ( ( BYTE )( wRed ) | ( ( WORD )( ( BYTE )( wGreen ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wBlue ) ) << 10 ) ) );
// wPixel = ( ( wBlue >> 3 ) | ( ( wGreen >> 3 ) << 5 ) | ( ( wRed >> 3 ) << 10 ) );
// *( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = ( ( wBlue ) | ( ( wGreen ) << 5 ) | ( ( wRed ) << 10 ) );
// *( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = ( ( wBlue ) | ( ( wGreen ) << 5 ) | ( ( wRed ) << 10 ) );
//*lpwImageDst = ( ( wSrcBlue ) | ( ( wSrcGreen ) << 5 ) | ( ( wSrcRed ) << 10 ) );
*lpwImageDst = ( ( wSrcBlue >> 3 ) | ( ( wSrcGreen >> 3 ) << 5 ) | ( ( wSrcRed >> 3 ) << 10 ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -