aboutsummaryrefslogtreecommitdiff
path: root/devtools/create_supernova/create_image/create_image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/create_supernova/create_image/create_image.cpp')
-rw-r--r--devtools/create_supernova/create_image/create_image.cpp202
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;
+}