gssurface.cpp

来自「网络泡泡被.net管理」· C++ 代码 · 共 356 行

CPP
356
字号
// GsSurface.cpp: implementation of the CGsSurface class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GSLib_Internal.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGsSurface::CGsSurface(CGsEngine* pEngine) : CDxSurface( pEngine )
{
    m_bColorKeyed = false;
	m_dwKeyColor	= 0xffffffff;
	m_bUseVideoMem	= false;
}

CGsSurface::~CGsSurface()
{

}



//-----------------------------------------------------------------------------
// Name: Lock()
// Desc: 
//-----------------------------------------------------------------------------
HRESULT CGsSurface::BeginLock(BYTE* &pDes, LONG &lPitch)
{
	if(!m_pdds)
		return E_FAIL;
	HRESULT hr;
	DDSURFACEDESC2	ddsd;
	memset(&ddsd,0,sizeof(ddsd));
	ddsd.dwSize	= sizeof(ddsd);
	hr = m_pdds->Lock (NULL, &ddsd, DDLOCK_WAIT, NULL);
	if(FAILED(hr))
		return hr;
	pDes	= (BYTE*)ddsd.lpSurface;
	lPitch	= ddsd.lPitch;
	return hr;
}
//-----------------------------------------------------------------------------
// Name: UnLock()
// Desc: 
//-----------------------------------------------------------------------------
HRESULT CGsSurface::EndLock()
{
	if(!m_pdds)
		return E_FAIL;
	return m_pdds->Unlock(NULL);
}


HRESULT CGsSurface::CreateEx(int width, int height, BOOL bUseVideoMem)
{
	HRESULT hr = S_OK;
	if(NULL == m_pEngine)
		return E_FAIL;
    LPDIRECTDRAW7				pDD			= m_pEngine->GetDirectDraw();				
	if(!pDD)
		return E_FAIL;
	SAFE_RELEASE(m_pdds);
	CGsFunc::DxInitSurfaceDesc(m_ddsd);
	m_ddsd.dwFlags         = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;//|DDSD_PIXELFORMAT;
							   
	m_ddsd.ddsCaps.dwCaps  = DDSCAPS_OFFSCREENPLAIN;//|DDSCAPS_VIDEOMEMORY;
	m_ddsd.ddsCaps.dwCaps2 = 0L;
	m_ddsd.dwWidth         = width;
	m_ddsd.dwHeight        = height;
	m_isUseVideoMemory	= bUseVideoMem;
	if( !m_isUseVideoMemory )
		m_ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
    hr = pDD->CreateSurface( &m_ddsd, &m_pdds, NULL );
    if( FAILED(hr) )
        return hr;
	m_isDismiss	= false;
	m_ddsd.dwSize = sizeof(m_ddsd);
	m_pdds->GetSurfaceDesc( &m_ddsd );

	m_dxsf	= D3DXMakeSurfaceFormat( &m_ddsd.ddpfPixelFormat );
	m_dwColorCount	= m_ddsd.ddpfPixelFormat.dwRGBBitCount;

	m_bUseVideoMem	= bUseVideoMem;

	OnCreate();
	return hr;
}

HRESULT CGsSurface::CreateEx(PIXMAP const& pixmap, BOOL bUseVideoMem)
{
	HRESULT hr = S_OK;

	return hr;
}


HRESULT CGsSurface::CreateFromBitmap( const TCHAR* strBMP, DWORD dwDesiredWidth, DWORD dwDesiredHeight, BOOL bUseVideoMem, DWORD KeyColor )
{
	HRESULT hr = S_OK;

	{
//		// Attempt to load bitmap as a file
//		BITMAPFILEHEADER  bf;
//		BITMAPINFOHEADER  bi;
//		HANDLE            hFile = NULL;
//		DWORD			  dwBytesRead;
//		hFile = CreateFile( strBMP, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL );
//		if( NULL == hFile )
//			return E_FAIL;
//
//		// Read the BITMAPFILEHEADER
//		ReadFile( hFile, &bf, sizeof(bf), &dwBytesRead, NULL );
//		if( dwBytesRead != sizeof(bf) )
//		{
//			CloseHandle( hFile );
//			return E_FAIL;
//		}
//
//		// Read the BITMAPINFOHEADER
//		ReadFile( hFile, &bi, sizeof(bi), &dwBytesRead, NULL );
//		if( dwBytesRead != sizeof(bi) )
//		{
//			CloseHandle( hFile );
//			return E_FAIL;
//		}
//		CloseHandle( hFile );

		HBITMAP			hBMP = NULL;
		BITMAP			bmp;
		DWORD			width = 0;
		DWORD			height = 0;
		//  Try to load the bitmap as a resource, if that fails, try it as a file
		hBMP = (HBITMAP) LoadImage( GetModuleHandle(NULL), strBMP, 
									IMAGE_BITMAP, width, height, 
									LR_CREATEDIBSECTION );
		if( hBMP == NULL )
		{
			hBMP = (HBITMAP) LoadImage( NULL, strBMP, 
										IMAGE_BITMAP, width, height, 
										LR_LOADFROMFILE | LR_CREATEDIBSECTION );
			if( hBMP == NULL )
				return E_FAIL;
		}

		// Get size of the bitmap
		GetObject( hBMP, sizeof(bmp), &bmp );
		
		if(0==dwDesiredWidth)
			dwDesiredWidth	= bmp.bmWidth;
		if(0==dwDesiredHeight)
			dwDesiredHeight	= bmp.bmHeight;

		DeleteObject( hBMP );
		
	}


	CreateEx( dwDesiredWidth, dwDesiredHeight, bUseVideoMem );

	DrawBitmap( strBMP, dwDesiredWidth, dwDesiredHeight );

	if( KeyColor!=0xffffffff )
	{
		SetColorKey(KeyColor);
	}

	OnCreate();
	return hr;
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
HRESULT CGsSurface::SetColorKey( COLORREF dwColorKey )
{
    if( NULL == m_pdds )
        return E_POINTER;

    m_bColorKeyed = TRUE;
	m_dwKeyColor	= dwColorKey;

    DDCOLORKEY ddck;
    ddck.dwColorSpaceLowValue  = this->ConvertGDIColor( dwColorKey );
    ddck.dwColorSpaceHighValue = ConvertGDIColor( dwColorKey);
    
    return m_pdds->SetColorKey( DDCKEY_SRCBLT, &ddck );
}


//-----------------------------------------------------------------------------
// Name: CGsSurface::ConvertGDIColor()
// Desc: Converts a GDI color (0x00bbggrr) into the equivalent color on a 
//       DirectDrawSurface using its pixel format.  
//-----------------------------------------------------------------------------
DWORD CGsSurface::ConvertGDIColor( COLORREF dwGDIColor )
{
    if( m_pdds == NULL )
	    return 0x00000000;

    COLORREF       rgbT;
    HDC            hdc;
    DWORD          dw = CLR_INVALID;
    DDSURFACEDESC2 ddsd;
    HRESULT        hr;

    //  Use GDI SetPixel to color match for us
    if( dwGDIColor != CLR_INVALID && m_pdds->GetDC(&hdc) == DD_OK)
    {
        rgbT = GetPixel(hdc, 0, 0);     // Save current pixel value
        SetPixel(hdc, 0, 0, dwGDIColor);       // Set our value
        m_pdds->ReleaseDC(hdc);
    }

    // Now lock the surface so we can read back the converted color
    ddsd.dwSize = sizeof(ddsd);
    hr = m_pdds->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
    if( hr == DD_OK)
    {
        dw = *(DWORD *) ddsd.lpSurface; 
        if( ddsd.ddpfPixelFormat.dwRGBBitCount < 32 ) // Mask it to bpp
            dw &= ( 1 << ddsd.ddpfPixelFormat.dwRGBBitCount ) - 1;  
        m_pdds->Unlock(NULL);
    }

    //  Now put the color that was there back.
    if( dwGDIColor != CLR_INVALID && m_pdds->GetDC(&hdc) == DD_OK )
    {
        SetPixel( hdc, 0, 0, rgbT );
        m_pdds->ReleaseDC(hdc);
    }
    
    return dw;    
}


BOOL CGsSurface::SetStreamSource(const char *strSource)
{
	if(m_keySource==strSource)
		return TRUE;
	Cleanup();
	m_keySource	= strSource;
	return TRUE;

}

HRESULT CGsSurface::RestoreObjects()
{
	if(m_pdds!=NULL)
		return S_OK;
	HRESULT hr;

	char str[PATH_SIZE];
	strcpy(str, m_keySource.c_str());


	GSFILE_INFO* file_info = m_pEngine->FindSource(m_keySource.c_str());
	if(file_info)
	{
		switch(file_info->fft)
		{
		case GSF_JPG:
			{
				hr = CreateFromJPEG(file_info->strFile);
				if(FAILED(hr))
					return hr;
			}
			break;
		case GSF_TGA:
			{
			}
			break;
		case GSF_GIF:
			{
			}
			break;
//		case GSF_PGG:
//			return E_FAIL;
//			break;
//		case GSF_TXG:
//			return E_FAIL;
//			break;
//		case GSF_INI:
//			return E_FAIL;
//			break;
//		case GSF_TXT:
//			return FALSE;
//			break;
		default:
			return E_FAIL;
			break;
		}
	}
	else
	{
		GSFBUF gsbuf = CGsFunc::GSFBUF_Create(m_keySource.c_str(), "rb");
		if(gsbuf.p_fstream!=NULL)
		{
			switch(CGsFunc::File_GetFFT(m_keySource.c_str()))
			{
			case GSF_JPG:
				{
					hr = CreateFromJPEG(m_keySource.c_str());
					if(FAILED(hr))
						return hr;
				}
				break;
			default:
				return E_FAIL;
				break;
			}

		}
		else
		{

		}	
	}

	return S_OK;

}

HRESULT CGsSurface::CreateFromJPEG(const char* strFile)
{
	HRESULT hr;
	GSFBUF fbuf = CGsFunc::GSFBUF_Create(strFile, "rb");
	if(fbuf.p_fstream==NULL)
		return E_FAIL;
	SIZE size = CGsFunc::FileGetJpegSize(&fbuf);
	if(FAILED(hr=CreateEx(size.cx, size.cy, m_bUseVideoMem)))
	{
		fclose(fbuf.p_fstream);
		return hr;
	}
	if(FAILED(hr=LoadFromJpegFile(&fbuf)))
	{
		fclose(fbuf.p_fstream);
		return hr;
	}
	fclose(fbuf.p_fstream);

	return hr;
}


VOID CGsSurface::ReleaseObjects()
{
	SAFE_RELEASE(m_pdds);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?