diff options
Diffstat (limited to 'devtools/create_supernova/create_image/create_image.cpp')
| -rw-r--r-- | devtools/create_supernova/create_image/create_image.cpp | 202 | 
1 files changed, 202 insertions, 0 deletions
diff --git a/devtools/create_supernova/create_image/create_image.cpp b/devtools/create_supernova/create_image/create_image.cpp new file mode 100644 index 0000000000..1bf1e24f7c --- /dev/null +++ b/devtools/create_supernova/create_image/create_image.cpp @@ -0,0 +1,202 @@ +#include <fstream> +#include <iostream> +#include <sstream> +#include <cstring> +#include <iomanip> +#include <cstdlib> + +std::string filenumber; + +int writePalette(std::ofstream &output) { +	std::string filename = filenumber + "/palette"; +	std::ifstream palette(filename.c_str()); +	if (!palette.is_open()) { +		std::cerr << "Couldn't open palette file" << std::endl; +		return 1; +	} +	int input; +	do { +		palette >> input; +		if (palette.eof()) +			break; +		output << (char) input; +	} while(true); +	palette.close(); +	return 0; +} + +int writeSections(std::ofstream &output) { +	std::string filename = filenumber + "/section_info"; +	std::ifstream sectionInfo(filename.c_str()); +	if (!sectionInfo.is_open()) { +		std::cerr << "Couldn't open section_info file" << std::endl; +		return 0; +	} +	int numSections; +	sectionInfo >> numSections; +	output << (char) numSections; + +	int input; +	char *input_byte = (char *) &input; +	for(int i = 0; i < numSections; i++) { +		//x1 +		sectionInfo >> input; +		output << (char)input_byte[0]; +		output << (char)input_byte[1]; +		//x2 +		sectionInfo >> input; +		output << (char)input_byte[0]; +		output << (char)input_byte[1]; +		//y1 +		sectionInfo >> input; +		output << (char)input; +		//y2 +		sectionInfo >> input; +		output << (char)input; +		//next +		sectionInfo >> input; +		output << (char)input; +		//addressLow +		sectionInfo >> input; +		output << (char)input_byte[0]; +		output << (char)input_byte[1]; +		//addressHigh +		sectionInfo >> input; +		output << (char)input; +	} +	sectionInfo.close(); +	return numSections; +} + +int writeClickFields(std::ofstream &output) { +	std::string filename = filenumber + "/clickfield_info"; +	std::ifstream clickFieldInfo(filename.c_str()); +	if (!clickFieldInfo.is_open()) { +		std::cerr << "Couldn't open clickfield_info file" << std::endl; +		return 1; +	} +	int numClickFields; +	clickFieldInfo >> numClickFields; +	output << (char) numClickFields; + +	int input; +	char *input_byte = (char *) &input; +	for(int i = 0; i < numClickFields; i++) { +		//x1 +		clickFieldInfo >> input; +		output << (char)input_byte[0]; +		output << (char)input_byte[1]; +		//x2 +		clickFieldInfo >> input; +		output << (char)input_byte[0]; +		output << (char)input_byte[1]; +		//y1 +		clickFieldInfo >> input; +		output << (char)input; +		//y2 +		clickFieldInfo >> input; +		output << (char)input; +		//next +		clickFieldInfo >> input; +		output << (char)input; +	} +	clickFieldInfo.close(); +	return 0; +} + +int writePixelData(std::ofstream &output, int imageNum, int skip) { +	std::ostringstream fileName; +	fileName << filenumber << "/image" << imageNum << ".bmp"; +	std::ifstream image(fileName.str().c_str(), std::ios::binary); +	if (!image.is_open()) { +		std::cerr << "Couldn't open " << fileName.str() << " file" << std::endl; +		return 0; +	} + +	image.seekg(0, image.end); +	int length = image.tellg(); +	length -= skip; +	image.seekg(skip, image.beg); +	char *buf = new char[length]; +	image.read(buf, length); +	output.write(buf, length); +	delete buf; +	return length; +} + +void printHelp() { +	std::cout << "create_image output-prefix file-number bytes-skip" << std::endl << std::endl; +	std::cout << "	output-prefix: String the created file should begin with" << std::endl; +	std::cout << "	file-number: Number of the created file and also name of source folder" << std::endl; +	std::cout << "	bytes-skip: How many bytes to to skip in each .bmp file" << std::endl; +	std::cout << std::endl << "EXAMPLE:" << std::endl +		<< "create_image ms2_data 15 1146" << std::endl +		<< "	creates ms2_data.015 assuming there are the right files inside 015 folder" << std::endl; +} + +int main(int argc, char *argv[]) { +	if (argc == 2 && !strcmp(argv[1], "--help")) { +		printHelp(); +		return 0; +	} +	if (argc != 4 ) { +		printHelp(); +		return 1; +	} +	std::ostringstream oss; +	oss << std::setfill('0') << std::setw(3) << argv[2]; +	filenumber = oss.str(); +	char *ptr; +	int bytesSkip = strtol(argv[3], &ptr, 10); +	std::string oFileName = argv[1]; +	oFileName += "." + filenumber; +	std::ofstream output(oFileName.c_str(), std::ios::binary); +	if (!output.is_open()) { +		std::cerr << "Couldn't open output file" << std::endl; +		return 1; +	} +	// size +	// just a place holder, will be filled later +	output << (char) 0x40; +	output << (char) 0x70; +	output << (char) 0x01; +	output << (char) 0x00; +	if (writePalette(output)) +		return 1; +	int numImages = writeSections(output); +	if (numImages == 0) +		return 1; +	if (writeClickFields(output)) +		return 1; +	// we don't compress the images, so set to 0 +	output << (char) 0; //numRepeat +	output << (char) 0; //numZw +	int totalLength = 0; +	int oldLength = 0; +	for (int i = 0; i < numImages; i++) { +		totalLength += writePixelData(output, i, bytesSkip); +		if (oldLength == totalLength) { +			std::cerr << "Error while reading the image number: " << i << std::endl;  +			return 1; +		} +		oldLength = totalLength; +	} + +	//reversing the size computation inside the engine +	totalLength += 15; +	totalLength /= 16; +	totalLength -= 0x70; +	int i = (totalLength & 0xf000) >> 12; +	int j = totalLength << 4; +	char *i_p = (char *) &i; +	char *j_p = (char *) &j; + +	//writing the size +	output.seekp(0); +	output << j_p[0]; +	output << j_p[1]; +	output << i_p[0]; +	output << i_p[1]; +	output.close(); +	return 0; +}  | 
