diff options
Diffstat (limited to 'indra/integration_tests/llimage_libtest/llimage_libtest.cpp')
-rw-r--r-- | indra/integration_tests/llimage_libtest/llimage_libtest.cpp | 123 |
1 files changed, 78 insertions, 45 deletions
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index e8fe4864fb..6549aa0207 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -41,15 +41,19 @@ // system libraries #include <iostream> +// doc string provided when invoking the program with --help static const char USAGE[] = "\n" "usage:\tllimage_libtest [options]\n" "\n" " --help print this help\n" +" --in <file1> <file2>... list of image files to load and convert\n" +" --out <file1> <file2>... list of image files to create (assumes same order as --in files)\n" "\n"; -LLPointer<LLImageRaw> load_image(const std::string &src_filename) +// Create an empty formatted image instance of the correct type from the filename +LLPointer<LLImageFormatted> create_image(const std::string &filename) { - std::string exten = gDirUtilp->getExtension(src_filename); + std::string exten = gDirUtilp->getExtension(filename); U32 codec = LLImageBase::getCodecFromExtension(exten); LLPointer<LLImageFormatted> image; @@ -73,6 +77,14 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename) default: return NULL; } + + return image; +} + +// Load an image from file and return a raw (decompressed) instance of its data +LLPointer<LLImageRaw> load_image(const std::string &src_filename) +{ + LLPointer<LLImageFormatted> image = create_image(src_filename); if (!image->load(src_filename)) { @@ -94,79 +106,100 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename) return raw_image; } -bool save_image(const std::string &filepath, LLPointer<LLImageRaw> raw_image) +// Save a raw image instance into a file +bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image) { - std::string exten = gDirUtilp->getExtension(filepath); - U32 codec = LLImageBase::getCodecFromExtension(exten); - - LLPointer<LLImageFormatted> image; - switch (codec) - { - case IMG_CODEC_BMP: - image = new LLImageBMP(); - break; - case IMG_CODEC_TGA: - image = new LLImageTGA(); - break; - case IMG_CODEC_JPEG: - image = new LLImageJPEG(); - break; - case IMG_CODEC_J2C: - image = new LLImageJ2C(); - break; - case IMG_CODEC_PNG: - image = new LLImagePNG(); - break; - default: - return NULL; - } + LLPointer<LLImageFormatted> image = create_image(dest_filename); if (!image->encode(raw_image, 0.0f)) { return false; } - return image->save(filepath); + return image->save(dest_filename); } int main(int argc, char** argv) { + // List of input and output files + std::list<std::string> input_filenames; + std::list<std::string> output_filenames; + // Init whatever is necessary ll_init_apr(); LLImage::initClass(); // Analyze command line arguments - for (int arg=1; arg<argc; ++arg) + for (int arg = 1; arg < argc; ++arg) { if (!strcmp(argv[arg], "--help")) { - // always send the usage to standard out + // Send the usage to standard out std::cout << USAGE << std::endl; return 0; } - + else if (!strcmp(argv[arg], "--in") && arg < argc-1) + { + std::string file_name = argv[arg+1]; + while (file_name[0] != '-') // if arg starts with '-', we consider it's not a file name but some other argument + { + input_filenames.push_back(file_name); // Add file name to the list + arg += 1; // Skip that arg now we know it's a file name + if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list + break; + file_name = argv[arg+1]; // Next argument and loop over + } + } + else if (!strcmp(argv[arg], "--out") && arg < argc-1) + { + std::string file_name = argv[arg+1]; + while (file_name[0] != '-') // if arg starts with '-', we consider it's not a file name but some other argument + { + output_filenames.push_back(file_name); // Add file name to the list + arg += 1; // Skip that arg now we know it's a file name + if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list + break; + file_name = argv[arg+1]; // Next argument and loop over + } + } } - // List of (input,output) files - - // Load file - LLPointer<LLImageRaw> raw_image = load_image("lolcat-monorail.jpg"); - if (raw_image) + // Analyze the list of (input,output) files + if (input_filenames.size() == 0) { - std::cout << "Image loaded\n" << std::endl; + std::cout << "No input file, nothing to do -> exit" << std::endl; + return 0; } - else + // TODO: For the moment, we simply convert each input file to something. This needs to evolve... + if (input_filenames.size() != output_filenames.size()) { - std::cout << "Image not found\n" << std::endl; + std::cout << "Number of output and input files different -> exit" << std::endl; + return 0; } - - // Save file - if (raw_image) + + std::list<std::string>::iterator in_file = input_filenames.begin(); + std::list<std::string>::iterator out_file = output_filenames.begin(); + std::list<std::string>::iterator end = input_filenames.end(); + for (; in_file != end; ++in_file, ++out_file) { - save_image("monorail.png",raw_image); + // Load file + LLPointer<LLImageRaw> raw_image = load_image(*in_file); + if (!raw_image) + { + std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl; + continue; + } + + // Save file + if (!save_image(*out_file, raw_image)) + { + std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; + continue; + } + std::cout << *in_file << " -> " << *out_file << std::endl; + + // Output stats on each file } - - // Output stats on each file // Cleanup and exit LLImage::cleanupClass(); |