📄 gstexturegroup.cpp
字号:
// 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 + -