mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	* various improvements and code cleanups
This commit is contained in:
		| @@ -22,24 +22,6 @@ int readNormalNr (int pos, int bytCon, const unsigned char * str); | |||||||
|  |  | ||||||
| extern DLL_EXPORT CLodHandler *bitmaph; | extern DLL_EXPORT CLodHandler *bitmaph; | ||||||
|  |  | ||||||
| void BMPHeader::print(std::ostream & out) |  | ||||||
| { |  | ||||||
| 	CDefHandler::print(out,fullSize,4); |  | ||||||
| 	CDefHandler::print(out,_h1,4); |  | ||||||
| 	CDefHandler::print(out,_c1,4); |  | ||||||
| 	CDefHandler::print(out,_c2,4); |  | ||||||
| 	CDefHandler::print(out,x,4); |  | ||||||
| 	CDefHandler::print(out,y,4); |  | ||||||
| 	CDefHandler::print(out,_c3,2); |  | ||||||
| 	CDefHandler::print(out,_c4,2); |  | ||||||
| 	CDefHandler::print(out,_h2,4); |  | ||||||
| 	CDefHandler::print(out,_h3,4); |  | ||||||
| 	CDefHandler::print(out,dataSize1,4); |  | ||||||
| 	CDefHandler::print(out,dataSize2,4); |  | ||||||
| 	for (int i=0;i<8;i++) |  | ||||||
| 		out << _c5[i]; |  | ||||||
| 	out.flush(); |  | ||||||
| } |  | ||||||
| void CPCXConv::openPCX(char * PCX, int len) | void CPCXConv::openPCX(char * PCX, int len) | ||||||
| { | { | ||||||
| 	pcxs=len; | 	pcxs=len; | ||||||
| @@ -57,11 +39,11 @@ void CPCXConv::fromFile(std::string path) | |||||||
| 	is.close(); | 	is.close(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void CPCXConv::saveBMP(std::string path) | void CPCXConv::saveBMP(std::string path) const | ||||||
| { | { | ||||||
| 	std::ofstream os; | 	std::ofstream os; | ||||||
| 	os.open(path.c_str(), std::ios::binary); | 	os.open(path.c_str(), std::ios::binary); | ||||||
| 	os.write((char*)bmp,bmps); | 	os.write(reinterpret_cast<const char*>(bmp), bmps); | ||||||
| 	os.close(); | 	os.close(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -131,19 +113,14 @@ SDL_Surface * CPCXConv::getSurface() const | |||||||
| 			tp.unused = 0; | 			tp.unused = 0; | ||||||
| 			*(ret->format->palette->colors+i) = tp; | 			*(ret->format->palette->colors+i) = tp; | ||||||
| 		} | 		} | ||||||
| 		for (y=height;y>0;y--) | 		for (y=height; y>0; --y) | ||||||
| 		{ | 		{ | ||||||
| 			it=0xC+(y-1)*width; | 			it = 0xC + (y-1)*width; | ||||||
| 			for (int j=0;j<width;j++) | 			memcpy((char*)ret->pixels + ret->pitch * (y-1), pcx + it, width); | ||||||
| 			{ |  | ||||||
| 				*((char*)ret->pixels + ret->pitch * (y-1) + ret->format->BytesPerPixel * j) = pcx[it+j]; |  | ||||||
| 			} |  | ||||||
| 			if (add>0) | 			if (add>0) | ||||||
| 			{ | 			{ | ||||||
| 				for (int j=0;j<add;j++) | 				memset((char*)ret->pixels + ret->pitch * (y-1) + width, 0, add); | ||||||
| 				{ |  | ||||||
| 					*((char*)ret->pixels + ret->pitch * (y-1) + ret->format->BytesPerPixel * (j+width)) = 0; |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -151,17 +128,13 @@ SDL_Surface * CPCXConv::getSurface() const | |||||||
| 	{ | 	{ | ||||||
| 		for (y=height; y>0; y--) | 		for (y=height; y>0; y--) | ||||||
| 		{ | 		{ | ||||||
| 			it=0xC+(y-1)*width*3; | 			it = 0xC + (y-1)*width*3; | ||||||
| 			for (int j=0;j<width*3;j++) |  | ||||||
| 			{ | 			memcpy((char*)ret->pixels + ret->pitch * (y-1), pcx + it, width*3); | ||||||
| 				*((char*)ret->pixels + ret->pitch * (y-1) + j) = pcx[it+j]; |  | ||||||
| 			} |  | ||||||
| 			if (add>0) | 			if (add>0) | ||||||
| 			{ | 			{ | ||||||
| 				for (int j=0;j<add*3;j++) | 				memset((char*)ret->pixels + ret->pitch * (y-1) + width*3, 0, add*3); | ||||||
| 				{ |  | ||||||
| 					*((char*)ret->pixels + ret->pitch * (y-1) + (j+width*3)) = 0; |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -24,27 +24,13 @@ struct BMPPalette | |||||||
| 	unsigned char R,G,B,F; | 	unsigned char R,G,B,F; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct BMPHeader |  | ||||||
| { |  | ||||||
| 	int fullSize, _h1, _h2, _h3, _c1, _c2, _c3, _c4, x, y, |  | ||||||
| 		dataSize1, dataSize2; //DataSize=X*Y+2*Y |  | ||||||
| 	unsigned char _c5[8]; |  | ||||||
| 	void print(std::ostream & out); |  | ||||||
| 	BMPHeader() |  | ||||||
| 	{ |  | ||||||
| 		_h1=_h2=0; |  | ||||||
| 		for(int i=0;i<8;i++) |  | ||||||
| 			_c5[i]=0; |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class CPCXConv | class CPCXConv | ||||||
| {	 | {	 | ||||||
| public: | public: | ||||||
| 	unsigned char * pcx, *bmp; | 	unsigned char * pcx, *bmp; | ||||||
| 	int pcxs, bmps; | 	int pcxs, bmps; | ||||||
| 	void fromFile(std::string path); | 	void fromFile(std::string path); | ||||||
| 	void saveBMP(std::string path); | 	void saveBMP(std::string path) const; | ||||||
| 	void openPCX(char * PCX, int len); | 	void openPCX(char * PCX, int len); | ||||||
| 	SDL_Surface * getSurface() const; //for standard H3 PCX | 	SDL_Surface * getSurface() const; //for standard H3 PCX | ||||||
| 	//SDL_Surface * getSurfaceZ(); //for ZSoft PCX | 	//SDL_Surface * getSurfaceZ(); //for ZSoft PCX | ||||||
|   | |||||||
| @@ -155,4 +155,13 @@ void CCursorHandler::shiftPos( int &x, int &y ) | |||||||
| 			y -= 20; | 			y -= 20; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | CCursorHandler::~CCursorHandler() | ||||||
|  | { | ||||||
|  | 	if(help) | ||||||
|  | 		SDL_FreeSurface(help); | ||||||
|  |  | ||||||
|  | 	for(int g=0; g<cursors.size(); ++g) | ||||||
|  | 		delete cursors[g]; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ public: | |||||||
|  |  | ||||||
| 	std::vector<CDefHandler*> cursors; | 	std::vector<CDefHandler*> cursors; | ||||||
| 	int xpos, ypos; //position of cursor | 	int xpos, ypos; //position of cursor | ||||||
| 	void initCursor(); //inits cursorHandler | 	void initCursor(); //inits cursorHandler - run only once, it's not memleak-proof (rev 1333) | ||||||
| 	void cursorMove(const int & x, const int & y); //change cursor's positions to (x, y) | 	void cursorMove(const int & x, const int & y); //change cursor's positions to (x, y) | ||||||
| 	void changeGraphic(const int & type, const int & no); //changes cursor graphic for type type (0 - adventure, 1 - combat, 2 - default, 3 - spellbook) and frame no (not used for type 3) | 	void changeGraphic(const int & type, const int & no); //changes cursor graphic for type type (0 - adventure, 1 - combat, 2 - default, 3 - spellbook) and frame no (not used for type 3) | ||||||
| 	void draw1(); | 	void draw1(); | ||||||
| @@ -34,6 +34,7 @@ public: | |||||||
| 	void draw2(); | 	void draw2(); | ||||||
| 	void hide(){Show=0;}; | 	void hide(){Show=0;}; | ||||||
| 	void show(){Show=1;}; | 	void show(){Show=1;}; | ||||||
|  | 	~CCursorHandler(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ void CDefHandler::openFromMemory(unsigned char *table, std::string name) | |||||||
| 	DEFType = SDL_SwapLE32(de.DEFType); | 	DEFType = SDL_SwapLE32(de.DEFType); | ||||||
| 	width = SDL_SwapLE32(de.width); | 	width = SDL_SwapLE32(de.width); | ||||||
| 	height = SDL_SwapLE32(de.height); | 	height = SDL_SwapLE32(de.height); | ||||||
| 	totalBlocks = SDL_SwapLE32(de.totalBlocks); | 	unsigned int totalBlocks = SDL_SwapLE32(de.totalBlocks); | ||||||
|  |  | ||||||
| 	for (unsigned int it=0;it<256;it++) | 	for (unsigned int it=0;it<256;it++) | ||||||
| 	{ | 	{ | ||||||
| @@ -91,7 +91,7 @@ void CDefHandler::openFromMemory(unsigned char *table, std::string name) | |||||||
| 	p = reinterpret_cast<unsigned char *>(&de); | 	p = reinterpret_cast<unsigned char *>(&de); | ||||||
| 	p += sizeof(de); | 	p += sizeof(de); | ||||||
|  |  | ||||||
| 	totalEntries=0; | 	int totalEntries=0; | ||||||
| 	for (unsigned int z=0; z<totalBlocks; z++) | 	for (unsigned int z=0; z<totalBlocks; z++) | ||||||
| 	{ | 	{ | ||||||
| 		SDefEntryBlock &block = * reinterpret_cast<SDefEntryBlock *>(p); | 		SDefEntryBlock &block = * reinterpret_cast<SDefEntryBlock *>(p); | ||||||
| @@ -139,27 +139,6 @@ void CDefHandler::openFromMemory(unsigned char *table, std::string name) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| unsigned char * CDefHandler::writeNormalNr (int nr, int bytCon) |  | ||||||
| { |  | ||||||
| 	//int tralalalatoniedziala = 2*9+100-4*bytCon; |  | ||||||
| 	//unsigned char * ret = new unsigned char[bytCon]; |  | ||||||
| 	unsigned char * ret = NULL; |  | ||||||
| 	for(int jj=0; jj<100; ++jj) |  | ||||||
| 	{ |  | ||||||
| 		ret = (unsigned char*)calloc(1, bytCon); |  | ||||||
| 		if(ret!=NULL) |  | ||||||
| 			break; |  | ||||||
| 	} |  | ||||||
| 	long long amp = pow((long long int)256,bytCon-1); |  | ||||||
| 	for (int i=bytCon-1; i>=0;i--) |  | ||||||
| 	{ |  | ||||||
| 		int test2 = nr/(amp); |  | ||||||
| 		ret[i]=test2; |  | ||||||
| 		nr -= (nr/(amp))*amp; |  | ||||||
| 		amp/=256; |  | ||||||
| 	} |  | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| void CDefHandler::expand(unsigned char N,unsigned char & BL, unsigned char & BR) | void CDefHandler::expand(unsigned char N,unsigned char & BL, unsigned char & BR) | ||||||
| { | { | ||||||
| 	BL = (N & 0xE0) >> 5; | 	BL = (N & 0xE0) >> 5; | ||||||
| @@ -191,15 +170,8 @@ int CDefHandler::readNormalNr (int pos, int bytCon, const unsigned char * str, b | |||||||
| 	} | 	} | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| void CDefHandler::print (std::ostream & stream, int nr, int bytcon) |  | ||||||
| { |  | ||||||
| 	unsigned char * temp = writeNormalNr(nr,bytcon); |  | ||||||
| 	for (int i=0;i<bytcon;i++) |  | ||||||
| 		stream << char(temp[i]); |  | ||||||
| 	free(temp); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalette * palette) | SDL_Surface * CDefHandler::getSprite (int SIndex, const unsigned char * FDef, const BMPPalette * palette) const | ||||||
| { | { | ||||||
| 	SDL_Surface * ret=NULL; | 	SDL_Surface * ret=NULL; | ||||||
|  |  | ||||||
| @@ -216,7 +188,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
| 	unsigned char SegmentType;//, BL, BR; //TODO use me | 	unsigned char SegmentType;//, BL, BR; //TODO use me | ||||||
|  |  | ||||||
| 	BaseOffset = SEntries[SIndex].offset; | 	BaseOffset = SEntries[SIndex].offset; | ||||||
| 	SSpriteDef sd = * reinterpret_cast<SSpriteDef *>(FDef + BaseOffset); | 	SSpriteDef sd = * reinterpret_cast<const SSpriteDef *>(FDef + BaseOffset); | ||||||
|  |  | ||||||
| 	prSize = SDL_SwapLE32(sd.prSize); //TODO use me | 	prSize = SDL_SwapLE32(sd.prSize); //TODO use me | ||||||
| 	defType2 = SDL_SwapLE32(sd.defType2); | 	defType2 = SDL_SwapLE32(sd.defType2); | ||||||
| @@ -261,7 +233,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
|  |  | ||||||
| 	// If there's a margin anywhere, just blank out the whole surface. | 	// If there's a margin anywhere, just blank out the whole surface. | ||||||
| 	if (TopMargin > 0 || BottomMargin > 0 || LeftMargin > 0 || RightMargin > 0) { | 	if (TopMargin > 0 || BottomMargin > 0 || LeftMargin > 0 || RightMargin > 0) { | ||||||
| 		memset(((char *)ret->pixels), 0, FullHeight*FullWidth); | 		memset( reinterpret_cast<char*>(ret->pixels), 0, FullHeight*FullWidth); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Skip top margin | 	// Skip top margin | ||||||
| @@ -277,7 +249,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
| 			if (LeftMargin>0) | 			if (LeftMargin>0) | ||||||
| 				ftcp += LeftMargin; | 				ftcp += LeftMargin; | ||||||
|  |  | ||||||
| 			memcpy((char*)(ret->pixels)+ftcp, &FDef[BaseOffset], SpriteWidth); | 			memcpy(reinterpret_cast<char*>(ret->pixels)+ftcp, &FDef[BaseOffset], SpriteWidth); | ||||||
| 			ftcp += SpriteWidth; | 			ftcp += SpriteWidth; | ||||||
| 			BaseOffset += SpriteWidth; | 			BaseOffset += SpriteWidth; | ||||||
| 			 | 			 | ||||||
| @@ -289,7 +261,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
|  |  | ||||||
| 	case 1: | 	case 1: | ||||||
| 	{ | 	{ | ||||||
| 		unsigned int * RWEntriesLoc = reinterpret_cast<unsigned int *>(FDef+BaseOffset); | 		const unsigned int * RWEntriesLoc = reinterpret_cast<const unsigned int *>(FDef+BaseOffset); | ||||||
| 		BaseOffset += sizeof(int) * SpriteHeight; | 		BaseOffset += sizeof(int) * SpriteHeight; | ||||||
| 		for (unsigned int i=0;i<SpriteHeight;i++) | 		for (unsigned int i=0;i<SpriteHeight;i++) | ||||||
| 		{ | 		{ | ||||||
| @@ -309,7 +281,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
| 				{ | 				{ | ||||||
| 					for (unsigned int k=0; k<SegmentLength;k++) | 					for (unsigned int k=0; k<SegmentLength;k++) | ||||||
| 					{ | 					{ | ||||||
| 						((char*)(ret->pixels))[ftcp++]=FDef[BaseOffset+k]; | 						(reinterpret_cast<char*>(ret->pixels))[ftcp++]=FDef[BaseOffset+k]; | ||||||
| 						if ((TotalRowLength+k)>=SpriteWidth) | 						if ((TotalRowLength+k)>=SpriteWidth) | ||||||
| 							break; | 							break; | ||||||
| 					} | 					} | ||||||
| @@ -318,7 +290,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
| 				} | 				} | ||||||
| 				else | 				else | ||||||
| 				{ | 				{ | ||||||
| 					memset((char*)(ret->pixels)+ftcp, SegmentType, SegmentLength); | 					memset(reinterpret_cast<char*>(ret->pixels)+ftcp, SegmentType, SegmentLength); | ||||||
| 					ftcp += SegmentLength; | 					ftcp += SegmentLength; | ||||||
| 					TotalRowLength += SegmentLength; | 					TotalRowLength += SegmentLength; | ||||||
| 				} | 				} | ||||||
| @@ -337,11 +309,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
|  |  | ||||||
| 	case 2: | 	case 2: | ||||||
| 	{ | 	{ | ||||||
| 		/*for (int i=0;i<SpriteHeight;i++) | 		BaseOffset = BaseOffsetor + *reinterpret_cast<const unsigned short*>( FDef + BaseOffsetor ); //was + RWEntries[0]; | ||||||
| 		{ |  | ||||||
| 			RWEntries[i] = readNormalNr(BaseOffsetor+i*2*(SpriteWidth/32), 2, FDef); |  | ||||||
| 		}*/ |  | ||||||
| 		BaseOffset = BaseOffsetor + *(unsigned short*)( FDef + BaseOffsetor ); //was + RWEntries[0]; |  | ||||||
| 		for (unsigned int i=0;i<SpriteHeight;i++) | 		for (unsigned int i=0;i<SpriteHeight;i++) | ||||||
| 		{ | 		{ | ||||||
| 			//BaseOffset = BaseOffsetor+RWEntries[i]; | 			//BaseOffset = BaseOffsetor+RWEntries[i]; | ||||||
| @@ -357,13 +325,13 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
| 				unsigned char value = (SegmentType & 31) + 1; | 				unsigned char value = (SegmentType & 31) + 1; | ||||||
| 				if(code==7) | 				if(code==7) | ||||||
| 				{ | 				{ | ||||||
| 					memcpy((char*)(ret->pixels)+ftcp, &FDef[BaseOffset], value); | 					memcpy(reinterpret_cast<char*>(ret->pixels)+ftcp, &FDef[BaseOffset], value); | ||||||
| 					ftcp += value; | 					ftcp += value; | ||||||
| 					BaseOffset += value; | 					BaseOffset += value; | ||||||
| 				} | 				} | ||||||
| 				else | 				else | ||||||
| 				{ | 				{ | ||||||
| 					memset((char*)(ret->pixels)+ftcp, code, value); | 					memset(reinterpret_cast<char*>(ret->pixels)+ftcp, code, value); | ||||||
| 					ftcp += value; | 					ftcp += value; | ||||||
| 				} | 				} | ||||||
| 				TotalRowLength+=value; | 				TotalRowLength+=value; | ||||||
| @@ -382,10 +350,6 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet | |||||||
|  |  | ||||||
| 	case 3: | 	case 3: | ||||||
| 	{ | 	{ | ||||||
| 		/*for (int i=0;i<SpriteHeight;i++) |  | ||||||
| 		{ |  | ||||||
| 			RWEntries[i] = readNormalNr(BaseOffsetor+i*2*(SpriteWidth/32), 2, FDef); |  | ||||||
| 		}*/ |  | ||||||
| 		for (unsigned int i=0;i<SpriteHeight;i++) | 		for (unsigned int i=0;i<SpriteHeight;i++) | ||||||
| 		{ | 		{ | ||||||
| 			BaseOffset = BaseOffsetor + *(unsigned short*)( FDef + BaseOffsetor+i*2*(SpriteWidth/32) ); //was + RWEntries[i] before speedup | 			BaseOffset = BaseOffsetor + *(unsigned short*)( FDef + BaseOffsetor+i*2*(SpriteWidth/32) ); //was + RWEntries[i] before speedup | ||||||
|   | |||||||
| @@ -68,8 +68,7 @@ struct SSpriteDef { | |||||||
| class CDefHandler | class CDefHandler | ||||||
| { | { | ||||||
| private: | private: | ||||||
| 	unsigned int totalEntries, DEFType, totalBlocks; | 	unsigned int DEFType; | ||||||
| 	bool allowRepaint; |  | ||||||
| 	int length; | 	int length; | ||||||
| 	//unsigned int * RWEntries; | 	//unsigned int * RWEntries; | ||||||
| 	struct SEntry | 	struct SEntry | ||||||
| @@ -82,19 +81,17 @@ private: | |||||||
|  |  | ||||||
| public: | public: | ||||||
| 	int width, height; //width and height | 	int width, height; //width and height | ||||||
| 	std::string defName, curDir; | 	std::string defName; | ||||||
| 	std::vector<Cimage> ourImages; | 	std::vector<Cimage> ourImages; | ||||||
| 	bool alphaTransformed; | 	bool alphaTransformed; | ||||||
| 	bool notFreeImgs; | 	bool notFreeImgs; | ||||||
|  |  | ||||||
| 	CDefHandler(); //c-tor | 	CDefHandler(); //c-tor | ||||||
| 	~CDefHandler(); //d-tor | 	~CDefHandler(); //d-tor | ||||||
| 	static void print (std::ostream & stream, int nr, int bytcon); |  | ||||||
| 	static int readNormalNr (int pos, int bytCon, const unsigned char * str=NULL, bool cyclic=false); | 	static int readNormalNr (int pos, int bytCon, const unsigned char * str=NULL, bool cyclic=false); | ||||||
| 	static unsigned char *writeNormalNr (int nr, int bytCon); | 	SDL_Surface * getSprite (int SIndex, const unsigned char * FDef, const BMPPalette * palette) const; //zapisuje klatke o zadanym numerze do "testtt.bmp" | ||||||
| 	SDL_Surface * getSprite (int SIndex, unsigned char * FDef, BMPPalette * palette); //zapisuje klatke o zadanym numerze do "testtt.bmp" |  | ||||||
| 	void openDef(std::string name); | 	void openDef(std::string name); | ||||||
| 	void expand(unsigned char N,unsigned char & BL, unsigned char & BR); | 	static void expand(unsigned char N,unsigned char & BL, unsigned char & BR); | ||||||
| 	void openFromMemory(unsigned char * table, std::string name); | 	void openFromMemory(unsigned char * table, std::string name); | ||||||
| 	CDefEssential * essentialize(); | 	CDefEssential * essentialize(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -98,82 +98,6 @@ unsigned char * CLodHandler::giveFile(std::string defName, int * length) | |||||||
| 	return NULL; | 	return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| int CLodHandler::infs(unsigned char * in, int size, int realSize, std::ofstream & out, int wBits) |  | ||||||
| { |  | ||||||
| 	int ret; |  | ||||||
| 	unsigned have; |  | ||||||
| 	z_stream strm; |  | ||||||
| 	unsigned char inx[NLoadHandlerHelp::fCHUNK]; |  | ||||||
| 	unsigned char outx[NLoadHandlerHelp::fCHUNK]; |  | ||||||
|  |  | ||||||
| 	/* allocate inflate state */ |  | ||||||
| 	strm.zalloc = Z_NULL; |  | ||||||
| 	strm.zfree = Z_NULL; |  | ||||||
| 	strm.opaque = Z_NULL; |  | ||||||
| 	strm.avail_in = 0; |  | ||||||
| 	strm.next_in = Z_NULL; |  | ||||||
| 	ret = inflateInit2(&strm, wBits); |  | ||||||
| 	if (ret != Z_OK) |  | ||||||
| 		return ret; |  | ||||||
| 	int chunkNumber = 0; |  | ||||||
| 	do |  | ||||||
| 	{ |  | ||||||
| 		int readBytes = 0; |  | ||||||
| 		for(int i=0; i<NLoadHandlerHelp::fCHUNK && (chunkNumber * NLoadHandlerHelp::fCHUNK + i)<size; ++i) |  | ||||||
| 		{ |  | ||||||
| 			inx[i] = in[chunkNumber * NLoadHandlerHelp::fCHUNK + i]; |  | ||||||
| 			++readBytes; |  | ||||||
| 		} |  | ||||||
| 		++chunkNumber; |  | ||||||
| 		strm.avail_in = readBytes; |  | ||||||
| 		//strm.avail_in = fread(inx, 1, NLoadHandlerHelp::fCHUNK, source); |  | ||||||
| 		/*if (in.bad()) |  | ||||||
| 		{ |  | ||||||
| 			(void)inflateEnd(&strm); |  | ||||||
| 			return Z_ERRNO; |  | ||||||
| 		}*/ |  | ||||||
| 		if (strm.avail_in == 0) |  | ||||||
| 			break; |  | ||||||
| 		strm.next_in = inx; |  | ||||||
|  |  | ||||||
| 		/* run inflate() on input until output buffer not full */ |  | ||||||
| 		do |  | ||||||
| 		{ |  | ||||||
| 			strm.avail_out = NLoadHandlerHelp::fCHUNK; |  | ||||||
| 			strm.next_out = outx; |  | ||||||
| 			ret = inflate(&strm, Z_NO_FLUSH); |  | ||||||
| 			//assert(ret != Z_STREAM_ERROR);  /* state not clobbered */ |  | ||||||
| 			switch (ret) |  | ||||||
| 			{ |  | ||||||
| 				case Z_NEED_DICT: |  | ||||||
| 					ret = Z_DATA_ERROR;	 /* and fall through */ |  | ||||||
| 				case Z_DATA_ERROR: |  | ||||||
| 				case Z_MEM_ERROR: |  | ||||||
| 					(void)inflateEnd(&strm); |  | ||||||
| 					return ret; |  | ||||||
| 			} |  | ||||||
| 			have = NLoadHandlerHelp::fCHUNK - strm.avail_out; |  | ||||||
| 			/*if (fwrite(out, 1, have, dest) != have || ferror(dest)) |  | ||||||
| 			{ |  | ||||||
| 				(void)inflateEnd(&strm); |  | ||||||
| 				return Z_ERRNO; |  | ||||||
| 			}*/ |  | ||||||
| 			out.write((char*)outx, have); |  | ||||||
| 			if(out.bad()) |  | ||||||
| 			{ |  | ||||||
| 				(void)inflateEnd(&strm); |  | ||||||
| 				return Z_ERRNO; |  | ||||||
| 			} |  | ||||||
| 		} while (strm.avail_out == 0); |  | ||||||
|  |  | ||||||
| 		/* done when inflate() says it's done */ |  | ||||||
| 	} while (ret != Z_STREAM_END); |  | ||||||
|  |  | ||||||
| 	/* clean up and return */ |  | ||||||
| 	(void)inflateEnd(&strm); |  | ||||||
| 	return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| DLL_EXPORT int CLodHandler::infs2(unsigned char * in, int size, int realSize, unsigned char *& out, int wBits) | DLL_EXPORT int CLodHandler::infs2(unsigned char * in, int size, int realSize, unsigned char *& out, int wBits) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| @@ -240,50 +164,18 @@ DLL_EXPORT int CLodHandler::infs2(unsigned char * in, int size, int realSize, un | |||||||
|  |  | ||||||
| void CLodHandler::extractFile(std::string FName, std::string name) | void CLodHandler::extractFile(std::string FName, std::string name) | ||||||
| { | { | ||||||
| 	std::transform(name.begin(), name.end(), name.begin(), (int(*)(int))toupper); | 	int len; //length of file to write | ||||||
| 	for (int i=0;i<totalFiles;i++) | 	unsigned char * outp = giveFile(name, &len); | ||||||
|  | 	std::ofstream out; | ||||||
|  | 	out.open(FName.c_str(), std::ios::binary); | ||||||
|  | 	if(!out.is_open()) | ||||||
| 	{ | 	{ | ||||||
| 		std::string buf1 = entries[i].nameStr; | 		tlog1<<"Unable to create "<<FName<<std::endl; | ||||||
| 		std::transform(buf1.begin(), buf1.end(), buf1.begin(), (int(*)(int))toupper); | 	} | ||||||
| 		if(buf1!=name) | 	else | ||||||
| 			continue; | 	{ | ||||||
| 		LOD.seekg(entries[i].offset, std::ios::beg); | 		out.write(reinterpret_cast<char*>(outp), len); | ||||||
| 		std::string bufff = (FName); | 		out.close(); | ||||||
| 		unsigned char * outp; |  | ||||||
| 		if (entries[i].size==0) //file is not compressed |  | ||||||
| 		{ |  | ||||||
| 			outp = new unsigned char[entries[i].realSize]; |  | ||||||
| 			LOD.read((char*)outp, entries[i].realSize); |  | ||||||
| 			std::ofstream out; |  | ||||||
| 			out.open(bufff.c_str(), std::ios::binary); |  | ||||||
| 			if(!out.is_open()) |  | ||||||
| 			{ |  | ||||||
| 				tlog1<<"Unable to create "<<bufff; |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				for(int hh=0; hh<entries[i].realSize; ++hh) |  | ||||||
| 				{ |  | ||||||
| 					out<<*(outp+hh); |  | ||||||
| 				} |  | ||||||
| 				out.close(); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		else //we will decompressing file |  | ||||||
| 		{ |  | ||||||
| 			outp = new unsigned char[entries[i].size]; |  | ||||||
| 			LOD.read((char*)outp, entries[i].size); |  | ||||||
| 			std::ofstream destin; |  | ||||||
| 			destin.open(bufff.c_str(), std::ios::binary); |  | ||||||
| 			//int decRes = decompress(outp, entries[i].size, entries[i].realSize, bufff); |  | ||||||
| 			int decRes = infs(outp, entries[i].size, entries[i].realSize, destin); |  | ||||||
| 			destin.close(); |  | ||||||
| 			if(decRes!=0) |  | ||||||
| 			{ |  | ||||||
| 				tlog1<<"LOD Extraction error"<<"  "<<decRes<<" while extracting to "<<bufff<<std::endl; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		delete[] outp; |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -368,10 +260,7 @@ std::string CLodHandler::getTextFile(std::string name) | |||||||
| 		exit(1); | 		exit(1); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	std::string ret; | 	std::string ret(data, data+length); | ||||||
| 	ret.reserve(length); |  | ||||||
| 	for(int i=0;i<length;i++) |  | ||||||
| 		ret+=data[i]; |  | ||||||
| 	delete [] data; | 	delete [] data; | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -70,7 +70,6 @@ public: | |||||||
|  |  | ||||||
| 	CLodHandler(); | 	CLodHandler(); | ||||||
| 	~CLodHandler(); | 	~CLodHandler(); | ||||||
| 	int infs(unsigned char * in, int size, int realSize, std::ofstream & out, int wBits=15); //zlib fast handler |  | ||||||
| 	int infs2(unsigned char * in, int size, int realSize, unsigned char*& out, int wBits=15); //zlib fast handler | 	int infs2(unsigned char * in, int size, int realSize, unsigned char*& out, int wBits=15); //zlib fast handler | ||||||
| 	unsigned char * giveFile(std::string defName, int * length=NULL); //returns pointer to the decompressed data - it must be deleted when no longer needed! | 	unsigned char * giveFile(std::string defName, int * length=NULL); //returns pointer to the decompressed data - it must be deleted when no longer needed! | ||||||
| 	std::string getTextFile(std::string name); //extracts one file | 	std::string getTextFile(std::string name); //extracts one file | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user