?? ddutil.cpp
字號:
// Now lock the surface so we can read back the converted color
//
ddsd.dwSize = sizeof(ddsd);
while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING);
if (hres == DD_OK)
{
dw = *(DWORD *) ddsd.lpSurface; // Get DWORD
if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1; // Mask it to bpp
pdds->Unlock(NULL);
}
//
// Now put the color that was there back.
//
if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
{
SetPixel(hdc, 0, 0, rgbT);
pdds->ReleaseDC(hdc);
}
return dw;
}
//-----------------------------------------------------------------------------
// Name: DDSetColorKey()
// Desc: Set a color key for a surface, given a RGB.
// If you pass CLR_INVALID as the color key, the pixel
// in the upper-left corner will be used.
//-----------------------------------------------------------------------------
extern "C" HRESULT
DDSetColorKey(IDirectDrawSurface7 * pdds, COLORREF rgb)
{
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = RGB(0, 0, 0);//DDColorMatch(pdds, rgb);
ddck.dwColorSpaceHighValue = RGB(1, 1, 1);//ddck.dwColorSpaceLowValue;
return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck);
}
VOID SurfaceDataToFile(CHAR* szSaveFileName, LPDIRECTDRAWSURFACE7 lpdds)
{
DDSURFACEDESC2 ddsd;
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
lpdds->Lock(NULL, &ddsd, 0, NULL);
BYTE* pb;
pb = new BYTE[ddsd.dwWidth*ddsd.dwHeight];
ZeroMemory(pb, ddsd.dwWidth*ddsd.dwHeight);
memcpy(pb, ddsd.lpSurface, ddsd.dwWidth*ddsd.dwHeight);
WORD wWidth = (WORD)ddsd.dwWidth;
WORD wHeight = (WORD)ddsd.dwHeight;
lpdds->Unlock(NULL);
HANDLE hFile;
hFile = CreateFile( szSaveFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL );
if ( hFile != INVALID_HANDLE_VALUE )
{
DWORD dwReadLen;
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
WriteFile(hFile, &wWidth, sizeof(WORD), &dwReadLen, NULL);
WriteFile(hFile, &wHeight, sizeof(WORD), &dwReadLen, NULL);
WriteFile(hFile, pb, ddsd.dwWidth*ddsd.dwHeight, &dwReadLen, NULL);
CloseHandle(hFile);
}
free(pb);
}
LPDIRECTDRAWSURFACE7 FileToSurfaceData(LPDIRECTDRAW7 lpdd, CHAR* szFileName)
{
HANDLE hFile;
hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL );
WORD wWidth, wHeight;
LPDIRECTDRAWSURFACE7 lpdds;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
ddsd.dwSize = sizeof(ddsd);
if ( hFile != INVALID_HANDLE_VALUE )
{
DWORD dwReadLen;
ReadFile(hFile, &wWidth, sizeof(WORD), &dwReadLen, NULL);
ReadFile(hFile, &wHeight, sizeof(WORD), &dwReadLen, NULL);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;// | DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth = wWidth;
ddsd.dwHeight = wHeight;
lpdd->CreateSurface(&ddsd, &lpdds, NULL);
lpdds->Lock(NULL, &ddsd, 0, NULL);
ReadFile(hFile, (BYTE*)ddsd.lpSurface, wWidth*wHeight, &dwReadLen, NULL);
lpdds->Unlock(NULL);
CloseHandle(hFile);
return lpdds;
}
return NULL;
}
LPDIRECTDRAWSURFACE7 LoadBitmap8BitsInSurface(LPDIRECTDRAW7 lpdd, LPCTSTR pszFileName)
{
BITMAPFILEHEADER stFileHeader;
LPBITMAPINFO pstBmpInfo;
LPBITMAPINFOHEADER pstInfoHeader;
DWORD dwReadSize = 0;
HANDLE hFile = ::CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
// 厚飄甘 慶歹瀝焊.(鑒輯措肺 扁廢等促.)
//BITMAPFILEHEADER
//BITMAPINFO(BITMAPINFOHEADER, RGBQUAD)
//撈固瘤單撈磐
if ( hFile )
{
ZeroMemory(&stFileHeader, sizeof(stFileHeader));
// 頗老慶歹佬扁.
ReadFile(hFile, &stFileHeader, sizeof(stFileHeader), &dwReadSize, NULL);
// BMP牢瘤甫 犬牢茄促.
if ( HIBYTE(stFileHeader.bfType) == 'M' && LOBYTE(stFileHeader.bfType) == 'B' )
{
pstBmpInfo = (LPBITMAPINFO) malloc(sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256);
// 牢器慶歹父怒父 老竄 佬綽促.
ReadFile(hFile, pstBmpInfo, sizeof(BITMAPINFO)-sizeof(RGBQUAD), &dwReadSize, NULL);
pstInfoHeader = &(pstBmpInfo->bmiHeader);
// 8厚飄烙闌 犬牢茄促.
if( pstInfoHeader->biBitCount == 8 && pstInfoHeader->biCompression == BI_RGB)
{
DWORD dwColorTableSize = 256 * sizeof(RGBQUAD);
ReadFile(hFile, pstBmpInfo->bmiColors, dwColorTableSize, &dwReadSize, NULL);
BYTE* pbDataBit = NULL;
// BYTE* pbDataBit = (BYTE*)malloc(pstBmpInfo->bmiHeader.biSizeImage);
if ( pstBmpInfo->bmiHeader.biSizeImage )
{
pbDataBit = (BYTE*)malloc(pstBmpInfo->bmiHeader.biSizeImage);
ReadFile(hFile, pbDataBit, pstBmpInfo->bmiHeader.biSizeImage, &dwReadSize, NULL);
}
else
{
pbDataBit = (BYTE*)malloc(pstBmpInfo->bmiHeader.biWidth*pstBmpInfo->bmiHeader.biHeight);
ReadFile(hFile, pbDataBit, pstBmpInfo->bmiHeader.biWidth*pstBmpInfo->bmiHeader.biHeight, &dwReadSize, NULL);
}
// 角力掘籃單撈鷗甫 輯喬膠俊 持綽促.
LPDIRECTDRAWSURFACE7 lpdds;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;/*| DDSD_PIXELFORMAT;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB;
ddsd.ddpfPixelFormat.dwRGBBitCount = 8;*/
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth = pstBmpInfo->bmiHeader.biWidth;
ddsd.dwHeight = pstBmpInfo->bmiHeader.biHeight;
lpdd->CreateSurface(&ddsd, &lpdds, NULL);
lpdds->Lock(NULL, &ddsd, 0, NULL);
//扼牢喊 單撈鷗綽 鞍瘤父 扼牢撈 困何磐 第官差菌扁錠鞏俊 促矯 倒妨霖促.
/* INT nLineCnt = 0;
for ( INT nY=(ddsd.dwHeight-1); nY>=0; nY-- )
{
memcpy((BYTE*)ddsd.lpSurface+(nLineCnt*ddsd.lPitch), pbDataBit+(nY*ddsd.lPitch), ddsd.lPitch);
nLineCnt++;
}
*/
for ( UINT nY=0; nY<(ddsd.dwHeight-1); nY++ )
{
memcpy((BYTE*)ddsd.lpSurface+(nY*ddsd.lPitch), pbDataBit+((ddsd.dwHeight-nY-1)*ddsd.dwWidth), ddsd.dwWidth);
}
// memcpy((BYTE*)ddsd.lpSurface, pbDataBit, ddsd.dwWidth*ddsd.dwHeight);
lpdds->Unlock(NULL);
free(pbDataBit);
return lpdds;
}
}
CloseHandle(hFile);
}
return NULL;
}
LPDIRECTDRAWSURFACE7 LoadWilIntoSurface(LPDIRECTDRAW7 lpdd, CHAR* szWilFile)
{
HANDLE hFile;
hFile = CreateFile(szWilFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL );
if ( hFile != INVALID_HANDLE_VALUE )
{
DWORD dwReadLen;
CHAR szTitle[44];
INT nImageCount;
INT nColorCount;
INT nPaletteSize;
SHORT shWidth;
SHORT shHeight;
SHORT shPX;
SHORT shPY;
RGBQUAD rgbQuad[256];
BYTE* pbData;
ReadFile(hFile, szTitle, 44, &dwReadLen, NULL);
ReadFile(hFile, &nImageCount, sizeof(INT), &dwReadLen, NULL);
ReadFile(hFile, &nColorCount, sizeof(INT), &dwReadLen, NULL);
ReadFile(hFile, &nPaletteSize, sizeof(INT), &dwReadLen, NULL);
ReadFile(hFile, rgbQuad, sizeof(RGBQUAD)*256, &dwReadLen, NULL);
ReadFile(hFile, &shWidth, sizeof(SHORT), &dwReadLen, NULL);
ReadFile(hFile, &shHeight, sizeof(SHORT), &dwReadLen, NULL);
ReadFile(hFile, &shPX, sizeof(SHORT), &dwReadLen, NULL);
ReadFile(hFile, &shPY, sizeof(SHORT), &dwReadLen, NULL);
pbData = new BYTE[shWidth*shHeight];
ReadFile(hFile, pbData, shWidth*shHeight, &dwReadLen, NULL);
CloseHandle(hFile);
// 角力掘籃單撈鷗甫 輯喬膠俊 持綽促.
LPDIRECTDRAWSURFACE7 lpdds;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;/*| DDSD_PIXELFORMAT;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB;
ddsd.ddpfPixelFormat.dwRGBBitCount = 8;*/
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth = shWidth;
ddsd.dwHeight = shHeight;
lpdd->CreateSurface(&ddsd, &lpdds, NULL);
lpdds->Lock(NULL, &ddsd, 0, NULL);
//扼牢喊 單撈鷗綽 鞍瘤父 扼牢撈 困何磐 第官差菌扁錠鞏俊 促矯 倒妨霖促.
/* INT nLineCnt = 0;
for ( INT nY=(ddsd.dwHeight-1); nY>=0; nY-- )
{
memcpy((BYTE*)ddsd.lpSurface+(nLineCnt*ddsd.lPitch), pbDataBit+(nY*ddsd.lPitch), ddsd.lPitch);
nLineCnt++;
}
*/
for ( UINT nY=0; nY<(ddsd.dwHeight-1); nY++ )
{
memcpy((BYTE*)ddsd.lpSurface+(nY*ddsd.lPitch), pbData+((ddsd.dwHeight-nY-1)*ddsd.dwWidth), ddsd.dwWidth);
}
// memcpy((BYTE*)ddsd.lpSurface, pbDataBit, ddsd.dwWidth*ddsd.dwHeight);
lpdds->Unlock(NULL);
free(pbData);
CloseHandle(hFile);
return lpdds;
}
return NULL;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -