summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2011-02-15 22:43:54 -0800
committerMerov Linden <merov@lindenlab.com>2011-02-15 22:43:54 -0800
commit0ca7011b3154fd5db0a125f7d90de1c1e460105f (patch)
tree5dddf8aaec6049ee2b523c826de2061fcb6e6967 /indra
parentb430cf7524d91e27aadcf8a37b03af9b6b4d3e42 (diff)
STORM-987 : Add in and out command line arguments, builds and runs on Windows and Mac
Diffstat (limited to 'indra')
-rw-r--r--indra/integration_tests/llimage_libtest/llimage_libtest.cpp123
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();