mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
* unpacking defs speeded up by ~40%
This commit is contained in:
parent
847126f57a
commit
2cec1a2022
@ -418,73 +418,102 @@ CDefEssential * CLodHandler::giveDefEss(std::string defName)
|
||||
}
|
||||
std::vector<CDefHandler *> CLodHandler::extractManyFiles(std::vector<std::string> defNamesIn)
|
||||
{
|
||||
std::vector<CDefHandler *> ret(defNamesIn.size());
|
||||
std::vector<CDefHandler *> ret(defNamesIn.size());
|
||||
for(int hh=0; hh<defNamesIn.size(); ++hh)
|
||||
{
|
||||
std::transform(defNamesIn[hh].begin(), defNamesIn[hh].end(), defNamesIn[hh].begin(), (int(*)(int))toupper);
|
||||
}
|
||||
int i;
|
||||
std::vector<char> found(defNamesIn.size(), 0);
|
||||
for (int i=0;i<totalFiles;i++)
|
||||
{
|
||||
//std::cout << "Reading def "<<i<<": "<<entries[i].name<<std::endl;
|
||||
//std::cout<<'\r'<<"Reading defs: "<<(100.0*i)/((float)(totalFiles))<<"% ";
|
||||
std::string buf1 = std::string((char*)entries[i].name);
|
||||
//std::transform(buf1.begin(), buf1.end(), buf1.begin(), (int(*)(int))toupper);
|
||||
bool exists = false;
|
||||
int curDef;
|
||||
for(int hh=0; hh<defNamesIn.size(); ++hh)
|
||||
{
|
||||
if(buf1==defNamesIn[hh])
|
||||
{
|
||||
exists = true;
|
||||
found[hh] = '\1';
|
||||
curDef = hh;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!exists)
|
||||
Entry * e = entries.znajdz(defNamesIn[hh]);
|
||||
if(!e)
|
||||
continue;
|
||||
fseek(FLOD, entries[i].offset, 0);
|
||||
|
||||
fseek(FLOD, e->offset, 0);
|
||||
unsigned char * outp;
|
||||
if (entries[i].size==0) //file is not compressed
|
||||
if (e->size==0) //file is not compressed
|
||||
{
|
||||
outp = new unsigned char[entries[i].realSize];
|
||||
fread((char*)outp, 1, entries[i].realSize, FLOD);
|
||||
outp = new unsigned char[e->realSize];
|
||||
fread((char*)outp, 1, e->realSize, FLOD);
|
||||
CDefHandler * nh = new CDefHandler;
|
||||
nh->openFromMemory(outp, entries[i].realSize, std::string((char*)entries[i].name));
|
||||
nh->openFromMemory(outp, e->realSize, std::string((char*)e->name));
|
||||
nh->alphaTransformed = false;
|
||||
ret[curDef] = nh;
|
||||
ret[hh] = nh;
|
||||
}
|
||||
else //we will decompressing file
|
||||
{
|
||||
outp = new unsigned char[entries[i].size];
|
||||
fread((char*)outp, 1, entries[i].size, FLOD);
|
||||
outp = new unsigned char[e->size];
|
||||
fread((char*)outp, 1, e->size, FLOD);
|
||||
fseek(FLOD, 0, 0);
|
||||
unsigned char * decomp = NULL;
|
||||
int decRes = infs2(outp, entries[i].size, entries[i].realSize, decomp);
|
||||
int decRes = infs2(outp, e->size, e->realSize, decomp);
|
||||
CDefHandler * nh = new CDefHandler;
|
||||
nh->openFromMemory(decomp, entries[i].realSize, std::string((char*)entries[i].name));
|
||||
nh->openFromMemory(decomp, e->realSize, std::string((char*)e->name));
|
||||
nh->alphaTransformed = false;
|
||||
delete [] decomp;
|
||||
ret[curDef] = nh;
|
||||
ret[hh] = nh;
|
||||
}
|
||||
delete[] outp;
|
||||
}
|
||||
//std::cout<<'\r'<<"Reading defs: 100% "<<std::endl;
|
||||
for(int hh=0; hh<found.size(); ++hh)
|
||||
{
|
||||
if(!found[hh])
|
||||
{
|
||||
for(int ff=0; ff<hh; ++ff)
|
||||
{
|
||||
if(defNamesIn[ff]==defNamesIn[hh])
|
||||
{
|
||||
ret[hh]=ret[ff];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//int i;
|
||||
//std::vector<char> found(defNamesIn.size(), 0);
|
||||
//for (int i=0;i<totalFiles;i++)
|
||||
//{
|
||||
// //std::cout << "Reading def "<<i<<": "<<entries[i].name<<std::endl;
|
||||
// //std::cout<<'\r'<<"Reading defs: "<<(100.0*i)/((float)(totalFiles))<<"% ";
|
||||
// //std::string buf1 = std::string((char*)entries[i].name);
|
||||
// //std::transform(buf1.begin(), buf1.end(), buf1.begin(), (int(*)(int))toupper);
|
||||
// bool exists = false;
|
||||
// int curDef;
|
||||
// for(int hh=0; hh<defNamesIn.size(); ++hh)
|
||||
// {
|
||||
// if(entries[i].nameStr==defNamesIn[hh])
|
||||
// {
|
||||
// exists = true;
|
||||
// found[hh] = '\1';
|
||||
// curDef = hh;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if(!exists)
|
||||
// continue;
|
||||
// fseek(FLOD, entries[i].offset, 0);
|
||||
// unsigned char * outp;
|
||||
// if (entries[i].size==0) //file is not compressed
|
||||
// {
|
||||
// outp = new unsigned char[entries[i].realSize];
|
||||
// fread((char*)outp, 1, entries[i].realSize, FLOD);
|
||||
// CDefHandler * nh = new CDefHandler;
|
||||
// nh->openFromMemory(outp, entries[i].realSize, std::string((char*)entries[i].name));
|
||||
// nh->alphaTransformed = false;
|
||||
// ret[curDef] = nh;
|
||||
// }
|
||||
// else //we will decompressing file
|
||||
// {
|
||||
// outp = new unsigned char[entries[i].size];
|
||||
// fread((char*)outp, 1, entries[i].size, FLOD);
|
||||
// fseek(FLOD, 0, 0);
|
||||
// unsigned char * decomp = NULL;
|
||||
// int decRes = infs2(outp, entries[i].size, entries[i].realSize, decomp);
|
||||
// CDefHandler * nh = new CDefHandler;
|
||||
// nh->openFromMemory(decomp, entries[i].realSize, std::string((char*)entries[i].name));
|
||||
// nh->alphaTransformed = false;
|
||||
// delete [] decomp;
|
||||
// ret[curDef] = nh;
|
||||
// }
|
||||
// delete[] outp;
|
||||
//}
|
||||
////std::cout<<'\r'<<"Reading defs: 100% "<<std::endl;
|
||||
//for(int hh=0; hh<found.size(); ++hh)
|
||||
//{
|
||||
// if(!found[hh])
|
||||
// {
|
||||
// for(int ff=0; ff<hh; ++ff)
|
||||
// {
|
||||
// if(defNamesIn[ff]==defNamesIn[hh])
|
||||
// {
|
||||
// ret[hh]=ret[ff];
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//std::cout<<"*** Archive: "+FName+" closed\n";
|
||||
return ret;
|
||||
}
|
||||
|
@ -31,6 +31,10 @@ struct Entry
|
||||
int offset, //from beginning
|
||||
realSize, //size without compression
|
||||
size; //and with
|
||||
bool operator<(const std::string & comp) const
|
||||
{
|
||||
return nameStr<comp;
|
||||
}
|
||||
bool operator<(const Entry & comp) const
|
||||
{
|
||||
return nameStr<comp.nameStr;
|
||||
|
Loading…
Reference in New Issue
Block a user