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

📄 sharedresourcemgr.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// SharedResourceMgr.cpp: implementation of the CSharedResourceMgr class.
//
//////////////////////////////////////////////////////////////////////

#include "basedefs_de.h"
#include "cpp_clientshell_de.h"
#include "SharedResourceMgr.h"
#include <mbstring.h>

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

CSharedResourceMgr::CSharedResourceMgr()
{
	m_pClientDE=DNULL;
}

CSharedResourceMgr::~CSharedResourceMgr()
{
	Term();
}

// Intialization
DBOOL CSharedResourceMgr::Init(CClientDE *pClientDE)
{
	m_pClientDE=pClientDE;

	if (m_pClientDE == DNULL)
	{
		return DFALSE;
	}

	return DTRUE;
}

// Termination
void CSharedResourceMgr::Term()
{
	if (!m_pClientDE)
	{
		return;
	}

	unsigned int i;
	for (i=0; i < m_sharedSurfaceArray.GetSize(); i++)
	{
		m_pClientDE->DeleteSurface(m_sharedSurfaceArray[i]->m_hSurface);
		delete m_sharedSurfaceArray[i];
	}
	m_sharedSurfaceArray.SetSize(0);
}

// Returns a handle to a surface from its bitmap filename.  This increments the
// reference count by one.
HSURFACE CSharedResourceMgr::GetSurface(char *lpszSurface)
{
	if (!lpszSurface)
	{
		return DNULL;
	}

	// Search for the surface to see if it has been loaded yet
	int nIndex=FindSurfaceIndex(lpszSurface);

	// Return the surface if it is already loaded
	if (nIndex != -1)
	{
		m_sharedSurfaceArray[nIndex]->m_nReferenceCount++;
		return m_sharedSurfaceArray[nIndex]->m_hSurface;
	}

	// Load the surface
	HSURFACE hSurface=m_pClientDE->CreateSurfaceFromBitmap(lpszSurface);
	if (hSurface == DNULL)
	{
		return DNULL;
	}

	// Create the new resource class
	CSharedResourceSurface *pSharedSurface=new CSharedResourceSurface;

	// Copy the filename
	int nBufferSize=_mbstrlen(lpszSurface)+1;
	pSharedSurface->m_lpszPathName=new char[nBufferSize];
	_mbsncpy((unsigned char*)pSharedSurface->m_lpszPathName, (const unsigned char*)lpszSurface, nBufferSize);
	
	pSharedSurface->m_hSurface=hSurface;		// Copy the surface handle
	pSharedSurface->m_nReferenceCount++;		// Setup the reference count
	m_sharedSurfaceArray.Add(pSharedSurface);	// Add the class to the array

	// Return the surface handle
	return pSharedSurface->m_hSurface;
}

// Frees a surface.  It is only removed when its reference count reaches zero
void CSharedResourceMgr::FreeSurface(char *lpszSurface)
{
	int nIndex=FindSurfaceIndex(lpszSurface);

	if (nIndex == -1)
	{
		assert(DFALSE);
		return;
	}

	FreeSurface(nIndex);
}

// Frees a surface.  It is only removed when its reference count reaches zero
void CSharedResourceMgr::FreeSurface(HSURFACE hSurface)
{
	int nIndex=FindSurfaceIndex(hSurface);

	if (nIndex == -1)
	{
		assert(DFALSE);
		return;
	}

	FreeSurface(nIndex);
}

// Frees a surface based on its index into the surface array
void CSharedResourceMgr::FreeSurface(int nIndex)
{
	if (!m_pClientDE)
	{
		return;
	}

	m_sharedSurfaceArray[nIndex]->m_nReferenceCount--;

	if (m_sharedSurfaceArray[nIndex]->m_nReferenceCount == 0)
	{
		m_pClientDE->DeleteSurface(m_sharedSurfaceArray[nIndex]->m_hSurface);			

		delete m_sharedSurfaceArray[nIndex];
		m_sharedSurfaceArray.Remove(nIndex);
	}
}

// Finds a surface index into the surface array
int CSharedResourceMgr::FindSurfaceIndex(char *lpszSurface)
{
	unsigned int i;
	for (i=0; i < m_sharedSurfaceArray.GetSize(); i++)
	{
		if (_mbsicmp((const unsigned char*)m_sharedSurfaceArray[i]->m_lpszPathName, (const unsigned char*)lpszSurface) == 0)
		{
			return i;
		}
	}

	// Surface was not found
	return -1;
}

// Finds a surface index into the surface array
int CSharedResourceMgr::FindSurfaceIndex(HSURFACE hSurface)
{
	unsigned int i;
	for (i=0; i < m_sharedSurfaceArray.GetSize(); i++)
	{
		if (m_sharedSurfaceArray[i]->m_hSurface == hSurface)
		{
			return i;
		}
	}

	// Surface was not found
	return -1;
}

⌨️ 快捷键说明

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