⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddutil.cpp

📁 网络游戏传奇2客户端的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    // 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 + -