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

📄 gstexturegroup.cpp

📁 网络泡泡被.net管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	gsbuf.posBegin	= 0;
//	gsbuf.dwSize	= 0;
//	
//	HRESULT hr	= Import(gsbuf, bLoadAll);
//
//	fbuf.close();
	GSFBUF gsbuf;
	if((gsbuf.p_fstream	= fopen(strFile, "rb"))==NULL)
		return E_FAIL;
	gsbuf.pos_begin	= 0;
	gsbuf.file_size	= 0;
	HRESULT hr = S_OK;
	if(bLoadAll)
	{	
		hr	= Import(gsbuf, bLoadAll);
	}
	else
	{
		Cleanup();
		t_texture_group_file_head head;
		ZeroMemory(&head, sizeof(head));
		fseek(gsbuf.p_fstream, gsbuf.pos_begin, SEEK_SET);
		fread(&head, sizeof(head), 1, gsbuf.p_fstream);
		if(strstr(head.str_version, "GSTG")!=head.str_version)
		{
			fclose(gsbuf.p_fstream);
			return E_FAIL;
		}
		m_flag		= head.flag;
		m_dwNumTeam	= head.num_team;
		m_fBaseAngle = head.base_angle;
		m_cache_size	= head.cache_size;
		m_default_delay	= head.default_delay;
		m_base_point	= head.base_point;
		if(head.default_delay<=10)
		{
			m_default_delay	= 1000;
		}
		for(int i=0; i<head.num_texture; i++)
		{
			m_apTexture.push_back(NULL);
		}
		char	strTEX[PATH_SIZE];
		for(i=0; i<head.num_texture; i++)
		{
			fseek(gsbuf.p_fstream, gsbuf.pos_begin + sizeof(t_texture_group_file_head) + sizeof(DWORD)*i, SEEK_SET);
			DWORD	pos_data;
			fread(&pos_data, sizeof(DWORD), 1, gsbuf.p_fstream);
			m_apTexture[i]	= m_pEngine->Register_texture();
			sprintf(strTEX, "%s,%d,%d", strFile, GSF_TEX, pos_data);
			m_apTexture[i]->SetStreamSource(strTEX, m_cache_size);
		}
		OnInitialize();
	}

	fclose(gsbuf.p_fstream);

	return hr;
}

HRESULT CGsTextureGroup::Import( GSFBUF& gsbuf, BOOL bLoadAll )
{
	Cleanup();
	HRESULT hr;
	t_texture_group_file_head head;
	ZeroMemory(&head, sizeof(head));
	fseek(gsbuf.p_fstream, gsbuf.pos_begin, SEEK_SET);
	fread(&head, sizeof(head), 1, gsbuf.p_fstream);
	if(strstr(head.str_version, "GSTG")!=head.str_version)
		return E_FAIL;
	m_flag		= head.flag;
	m_dwNumTeam	= head.num_team;
	m_fBaseAngle = head.base_angle;
	m_cache_size	= head.cache_size;
	m_default_delay	= head.default_delay;
	m_base_point	= head.base_point;
	if(head.default_delay<=10)
	{
		m_default_delay	= 1000;
	}
	for(int i=0; i<head.num_texture; i++)
	{
		m_apTexture.push_back(NULL);
	}
	if(bLoadAll==false)
	{
		OnInitialize();
		return S_OK;
	}
	GSFBUF	texbuf	= gsbuf;
	for(i=0; i<head.num_texture; i++)
	{
//		gsbuf.pfstream->seekg(gsbuf.posBegin + sizeof(t_texture_group_file_head) + sizeof(DWORD)*i, ios::beg);
		fseek(gsbuf.p_fstream, gsbuf.pos_begin + sizeof(t_texture_group_file_head) + sizeof(DWORD)*i, SEEK_SET);
		DWORD	pos_data;
//		gsbuf.pfstream->read((char*)&pos_data, sizeof(DWORD));
		fread(&pos_data, sizeof(DWORD), 1, gsbuf.p_fstream);
		m_apTexture[i]	= m_pEngine->Register_texture();
		texbuf.pos_begin	= pos_data;
		texbuf.file_size	= 0;
		if(FAILED(hr = m_apTexture[i]->Import(texbuf)))
		{
			Cleanup();
			return hr;
		}
		m_apTexture[i]->m_BasePoint + m_base_point;
	}
	OnInitialize();
	return S_OK;
}


BOOL CGsTextureGroup::SaveHeader()
{
	GSFILE_INFO* file_info = m_pEngine->FindSource(m_keySource.c_str());
	FILE* pFile;	
	if(file_info)
	{
		pFile = fopen(file_info->strFile, "r+b");
	}
	else
	{
		pFile = fopen(m_keySource.c_str(), "r+b");
	}
	if(NULL==pFile)
	{
		return FALSE;
	}
	t_texture_group_file_head head;
	ZeroMemory(&head, sizeof(head));
	head.num_texture	= m_apTexture.size();
	sprintf(head.str_version, "GSTG2003a");
	head.flag		= m_flag;
	head.num_team	= m_dwNumTeam;
	head.base_angle = m_fBaseAngle;
	head.cache_size	= m_cache_size;
	head.default_delay	= m_default_delay;
	head.base_point	= m_base_point;
	fseek(pFile, 0, SEEK_SET);
	fwrite(&head, sizeof(head), 1, pFile);
	fclose(pFile);
	return TRUE;


}


DWORD CGsTextureGroup::Export( const TCHAR* strFile, BOOL bCompress )
{
//	fstream fbuf;
//	fbuf.open(strFile, ios::in | ios::out | ios::binary | ios::trunc);
//	if(!fbuf)
//		return 0;
//	
//	GSBUF gsbuf;
//	gsbuf.pfstream	= &fbuf;
//	gsbuf.posBegin	= 0;
//	gsbuf.dwSize	= 0;
//
//	DWORD ret	= Export(gsbuf, bCompress);
//
//	fbuf.close();
//	return ret;
	GSFBUF gsbuf;
	if((gsbuf.p_fstream	= fopen(strFile, "wb"))==NULL)
		return 0;
	gsbuf.pos_begin	= 0;
	gsbuf.file_size	= 0;
	DWORD ret	= Export(gsbuf, bCompress);
	fclose(gsbuf.p_fstream);
	return ret;}

DWORD CGsTextureGroup::Export( GSFBUF& gsbuf, BOOL bCompress )
{
	DWORD dwBytes	= 0;

	for(int i=0; i<m_apTexture.size(); i++)
	{
		assert(NULL!=GetTexture(i));
	}

	t_texture_group_file_head head;
	ZeroMemory(&head, sizeof(head));
	head.num_texture	= m_apTexture.size();
	sprintf(head.str_version, "GSTG2003a");
	head.flag		= m_flag;
	head.num_team	= m_dwNumTeam;
	head.base_angle = m_fBaseAngle;
	head.cache_size	= m_cache_size;
	head.default_delay	= m_default_delay;
	head.base_point	= m_base_point;
//	gsbuf.pfstream->seekp(gsbuf.posBegin);
//	gsbuf.pfstream->write((char*)&head, sizeof(head));
	fseek(gsbuf.p_fstream, gsbuf.pos_begin, SEEK_SET);
	fwrite(&head, sizeof(head), 1, gsbuf.p_fstream);

	GSFBUF	texbuf	= gsbuf;
	dwBytes			= sizeof(head) + head.num_texture*sizeof(DWORD);
	texbuf.pos_begin	+= dwBytes;

	for(i=0; i<head.num_texture; i++)
	{
//		gsbuf.pfstream->seekp(gsbuf.posBegin + sizeof(t_texture_group_file_head) + sizeof(DWORD)*i, ios::beg);
//		gsbuf.pfstream->write((char*)&texbuf.posBegin, sizeof(DWORD));
		fseek(gsbuf.p_fstream, gsbuf.pos_begin + sizeof(t_texture_group_file_head) + sizeof(DWORD)*i, SEEK_SET);
		fwrite(&texbuf.pos_begin, sizeof(DWORD), 1, texbuf.p_fstream);
		DWORD dwWrite = GetTexture(i)->Export(texbuf, bCompress);
		dwBytes	+= dwWrite;
//		gsbuf.pfstream->seekp(0,ios::end);
//		texbuf.posBegin	= gsbuf.pfstream->tellp();
		fseek(gsbuf.p_fstream, 0, SEEK_END);
		texbuf.pos_begin = ftell(gsbuf.p_fstream);
	}

	return dwBytes;/*
	DWORD dwBytes	= 0;

	for(int i=0; i<m_apTexture.size(); i++)
	{
		assert(NULL!=GetTexture(i));
	}

	t_texture_group_file_head head;
	ZeroMemory(&head, sizeof(head));
	head.num_texture	= m_apTexture.size();
	sprintf(head.str_version, "GSTG2003a");
	head.flag		= m_flag;
	head.num_team	= m_dwNumTeam;
	head.base_angle = m_fBaseAngle;
//	gsbuf.pfstream->seekp(gsbuf.posBegin);
//	gsbuf.pfstream->write((char*)&head, sizeof(head));
	fseek(gsbuf.p_fstream, gsbuf.pos_begin, SEEK_SET);
	fwrite(&head, sizeof(head), 1, gsbuf.p_fstream);
	GSFBUF	texbuf	= gsbuf;
	dwBytes			= sizeof(head) + head.num_texture*sizeof(DWORD);
	texbuf.pos_begin	+= dwBytes;

	for(i=0; i<head.num_texture; i++)
	{
//		gsbuf.pfstream->seekp(gsbuf.posBegin + sizeof(t_texture_group_file_head) + sizeof(DWORD)*i, ios::beg);
//		gsbuf.pfstream->write((char*)&texbuf.posBegin, sizeof(DWORD));
		fseek(gsbuf.p_fstream, gsbuf.pos_begin + sizeof(t_texture_group_file_head) + sizeof(DWORD)*i, SEEK_SET);
		fwrite(&texbuf.pos_begin, sizeof(DWORD), 1, gsbuf.p_fstream);
		DWORD dwWrite = m_apTexture[i]->Export(texbuf, bCompress);
		dwBytes	+= dwWrite;
		fseek(gsbuf.p_fstream, 0, SEEK_END);
		texbuf.pos_begin = ftell(gsbuf.p_fstream);
//		gsbuf.pfstream->seekp(0,ios::end);
//		texbuf.posBegin	= gsbuf.pfstream->tellp();
	}

	return dwBytes;
*/
}

CGsTexture*	CGsTextureGroup::InsertTexture( int insert_pos )
{
	//for(int i=0; i<m_apTexture.size(); i++)
	//{
	//	assert(NULL!=GetTexture(i));
	//}
	CGsTexture*	pTexture	= m_pEngine->Register_texture();

	if(insert_pos>=m_apTexture.size() || insert_pos<0)
	{
		m_apTexture.push_back(pTexture);
	}
	else
	{
		std::vector<CGsTexture*>::iterator	it	= m_apTexture.begin();
		for(int i=0; i<insert_pos; i++)
		{
			it++;
		}
		m_apTexture.insert(it, pTexture);
	}
	OnInitialize();
	return pTexture;
}

BOOL CGsTextureGroup::DeleteTexture( int delete_pos )
{
	for(int i=0; i<m_apTexture.size(); i++)
	{
		assert(NULL!=GetTexture(i));
	}

	if(delete_pos>=m_apTexture.size() || delete_pos<0)
	{
		return FALSE;
	}
	else
	{
		std::vector<CGsTexture*>::iterator	it	= m_apTexture.begin();
		for(i=0; i<delete_pos; i++)
		{
			it++;
		}
		m_apTexture.erase(it);
	}
	OnInitialize();
	return TRUE;
}

BOOL CGsTextureGroup::SwapTexture( int pos1, int pos2 )
{
	for(int i=0; i<m_apTexture.size(); i++)
	{
		assert(NULL!=GetTexture(i));
	}

	if(pos1>=m_apTexture.size() || pos1<0 || pos2>=m_apTexture.size() || pos2<0 )
	{
		return FALSE;
	}

	CGsTexture*	pTexture	= m_apTexture[pos1];
	m_apTexture[pos1]		= m_apTexture[pos2];
	m_apTexture[pos2]		= pTexture;

	return TRUE;
}

VOID CGsTextureGroup::SetBasePoint(LONG x, LONG y)
{
//	for(int i=0; i<m_apTexture.size(); i++)
//	{
//		assert(NULL!=GetTexture(i));
//	}
	m_base_point	= GPOINT(x,y);
	for(int i=0; i<m_apTexture.size(); i++)
	{
		GPOINT point = m_apTexture[i]->GetBasePoint() + GPOINT(x,y);
		m_apTexture[i]->SetBasePoint(point);
	}
}




int CGsTextureGroup::Release()
{
	m_nUser--;
	if(m_nUser<1)
	{
		Cleanup();
//		m_pEngine->FreeTextureGroup(m_keySource.c_str());
	}	
	return m_nUser;
}

int CGsTextureGroup::AddUser()
{
	m_nUser++;
	return m_nUser;
}

VOID CGsTextureGroup::ReleaseObjects()
{
	{
		m_nRef_in_use=0;
		for(int i=0; i<m_apTexture.size(); i++)
		{
			if(m_bLoadAll)
			{
				SAFE_DELETE(m_apTexture[i]);
			}
			else
			{
				m_apTexture[i]->ReleaseObjects();
			}
	//		SAFE_DELETE(m_apTexture[i]);
		}
	}
//	m_cache_indices.clear();
}

HRESULT CGsTextureGroup::RestoreObjects()
{
//	if(m_bLoadAll)
//	{
//		SetStreamSource(m_keySource.c_str());
//	}
//	for(int i=0; i<m_apTexture.size(); i++)
//	{
//		m_apTexture[i]->RestoreObjects();
//		m_apTexture[i]->m_BasePoint += m_base_point;
//	}
	return S_OK;
}



int CGsTextureGroup::SetCurrentUse(BOOL use)
{
	if(use)
	{
		m_nRef_in_use++;
	}
	else
	{
		if(m_nRef_in_use<=0)
			return 0;
		m_nRef_in_use--;
	}
	if(m_nRef_in_use<=0)
	{
		m_nRef_in_use=0;
		ClearCache();
	}
	return m_nRef_in_use;
}

BOOL CGsTextureGroup::LoadFromGif(LPCSTR strFile)
{
	CGif89a* pGif	= new CGif89a(strFile, TRUE);
	m_extern_cache_data	= (void*)pGif;
	for (int i=0; i<pGif->getNumFrame(); i++)
	{
		CGsTexture*	pTex	= InsertTexture();
		if(pTex==NULL)
		{
			Cleanup();
			return FALSE;
		}
		char str[MAX_PATH];
		sprintf(str, "%s,%d,%d", m_keySource.c_str(), GSF_GIF, i);
		if(!pTex->SetStreamSource(str, 1))
		{
			Cleanup();
			return FALSE;
		}
	}
	return TRUE;
}

⌨️ 快捷键说明

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