summaryrefslogtreecommitdiff
path: root/indra/integration_tests
diff options
context:
space:
mode:
Diffstat (limited to 'indra/integration_tests')
-rwxr-xr-xindra/integration_tests/llimage_libtest/CMakeLists.txt3
-rwxr-xr-xindra/integration_tests/llimage_libtest/llimage_libtest.cpp262
2 files changed, 262 insertions, 3 deletions
diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt
index 36a7d38bb7..8a83ac498f 100755
--- a/indra/integration_tests/llimage_libtest/CMakeLists.txt
+++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt
@@ -7,6 +7,7 @@ project (llimage_libtest)
include(00-Common)
include(LLCommon)
include(LLImage)
+include(LLMath)
include(LLImageJ2COJ)
include(LLKDU)
include(LLVFS)
@@ -15,6 +16,7 @@ include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${LLIMAGE_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
)
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
@@ -64,6 +66,7 @@ endif (DARWIN)
target_link_libraries(llimage_libtest
${LLCOMMON_LIBRARIES}
${LLVFS_LIBRARIES}
+ ${LLMATH_LIBRARIES}
${LLIMAGE_LIBRARIES}
${LLKDU_LIBRARIES}
${KDU_LIBRARY}
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
index 034c816742..009be0941e 100755
--- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -39,6 +39,8 @@
#include "llimagej2c.h"
#include "lldir.h"
#include "lldiriterator.h"
+#include "v4coloru.h"
+#include "llsdserialize.h"
// system libraries
#include <iostream>
@@ -83,6 +85,24 @@ static const char USAGE[] = "\n"
" -rev, --reversible\n"
" Set the compression to be lossless (reversible in j2c parlance).\n"
" Only valid for output j2c images.\n"
+" -f, --filter <name> [<param>]\n"
+" Apply the filter <name> to the input images using the optional <param> value. Admissible names:\n"
+" - 'grayscale' converts to grayscale (no param).\n"
+" - 'sepia' converts to sepia (no param).\n"
+" - 'saturate' changes color saturation according to <param>: < 1.0 will desaturate, > 1.0 will saturate.\n"
+" - 'rotate' rotates the color hue according to <param> (in degree, positive value only).\n"
+" - 'gamma' applies gamma curve <param> to all channels: > 1.0 will darken, < 1.0 will lighten.\n"
+" - 'colorize' applies a red tint to the image using <param> as an alpha (transparency between 0.0 and 1.0) value.\n"
+" - 'contrast' modifies the contrast according to <param> : > 1.0 will enhance the contrast, <1.0 will flatten it.\n"
+" - 'brighten' adds <param> light to the image (<param> between 0 and 255).\n"
+" - 'darken' substracts <param> light to the image (<param> between 0 and 255).\n"
+" - 'linearize' optimizes the contrast using the brightness histogram. <param> is the fraction (between 0.0 and 1.0) of discarded tail of the histogram.\n"
+" - 'posterize' redistributes the colors between <param> classes per channel (<param> between 2 and 255).\n"
+" - Any other value will be interpreted as a file name describing a sequence of filters and parameters to be applied to the input images\n"
+" -v, --vignette <name> [<feather> <min>]\n"
+" Apply a circular central vignette <name> to the filter using the optional <feather> and <min> values. Admissible names:\n"
+" - 'blend' : the filter is applied with full intensity in the center and blends with the image to the periphery.\n"
+" - 'fade' : the filter is applied with full intensity in the center and fades to black to the periphery.\n"
" -log, --logmetrics <metric>\n"
" Log performance data for <metric>. Results in <metric>.slp\n"
" Note: so far, only ImageCompressionTester has been tested.\n"
@@ -96,10 +116,110 @@ static const char USAGE[] = "\n"
// true when all image loading is done. Used by metric logging thread to know when to stop the thread.
static bool sAllDone = false;
+// Load filter from file
+LLSD load_filter_from_file(const std::string& file_path)
+{
+ std::cout << "Loading filter settings from : " << file_path << std::endl;
+
+ llifstream filter_xml(file_path);
+ if (filter_xml.is_open())
+ {
+ // load and parse it
+ LLSD filter_data(LLSD::emptyArray());
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(filter_xml, filter_data, LLSDSerialize::SIZE_UNLIMITED);
+ filter_xml.close();
+ return filter_data;
+ }
+ else
+ {
+ return LLSD();
+ }
+}
+
+// Apply the filter data to the image passed as parameter
+void execute_filter(const LLSD& filter_data, LLPointer<LLImageRaw> raw_image)
+{
+ //std::cout << "Filter : size = " << filter_data.size() << std::endl;
+ for (S32 i = 0; i < filter_data.size(); ++i)
+ {
+ std::string filter_name = filter_data[i][0].asString();
+ // Dump out the filter values (for debug)
+ //std::cout << "Filter : name = " << filter_data[i][0].asString() << ", params = ";
+ //for (S32 j = 1; j < filter_data[i].size(); ++j)
+ //{
+ // std::cout << filter_data[i][j].asString() << ", ";
+ //}
+ //std::cout << std::endl;
+
+ // Execute the filter described on this line
+ if (filter_name == "blend")
+ {
+ raw_image->setVignette(VIGNETTE_MODE_BLEND,(float)(filter_data[i][1].asReal()),(float)(filter_data[i][2].asReal()));
+ }
+ else if (filter_name == "fade")
+ {
+ raw_image->setVignette(VIGNETTE_MODE_FADE,(float)(filter_data[i][1].asReal()),(float)(filter_data[i][2].asReal()));
+ }
+ else if (filter_name == "sepia")
+ {
+ raw_image->filterSepia();
+ }
+ else if (filter_name == "grayscale")
+ {
+ raw_image->filterGrayScale();
+ }
+ else if (filter_name == "saturate")
+ {
+ raw_image->filterSaturate((float)(filter_data[i][1].asReal()));
+ }
+ else if (filter_name == "rotate")
+ {
+ raw_image->filterRotate((float)(filter_data[i][1].asReal()));
+ }
+ else if (filter_name == "gamma")
+ {
+ LLColor3 color((float)(filter_data[i][2].asReal()),(float)(filter_data[i][3].asReal()),(float)(filter_data[i][4].asReal()));
+ raw_image->filterGamma((float)(filter_data[i][1].asReal()),color);
+ }
+ else if (filter_name == "colorize")
+ {
+ LLColor3 color((float)(filter_data[i][1].asReal()),(float)(filter_data[i][2].asReal()),(float)(filter_data[i][3].asReal()));
+ LLColor3 alpha((F32)(filter_data[i][4].asReal()),(float)(filter_data[i][5].asReal()),(float)(filter_data[i][6].asReal()));
+ raw_image->filterColorize(color,alpha);
+ }
+ else if (filter_name == "contrast")
+ {
+ LLColor3 color((float)(filter_data[i][2].asReal()),(float)(filter_data[i][3].asReal()),(float)(filter_data[i][4].asReal()));
+ raw_image->filterContrast((float)(filter_data[i][1].asReal()),color);
+ }
+ else if (filter_name == "brighten")
+ {
+ LLColor3 color((float)(filter_data[i][2].asReal()),(float)(filter_data[i][3].asReal()),(float)(filter_data[i][4].asReal()));
+ raw_image->filterBrightness((S32)(filter_data[i][1].asReal()),color);
+ }
+ else if (filter_name == "darken")
+ {
+ LLColor3 color((float)(filter_data[i][2].asReal()),(float)(filter_data[i][3].asReal()),(float)(filter_data[i][4].asReal()));
+ raw_image->filterBrightness((S32)(-filter_data[i][1].asReal()),color);
+ }
+ else if (filter_name == "linearize")
+ {
+ LLColor3 color((float)(filter_data[i][2].asReal()),(float)(filter_data[i][3].asReal()),(float)(filter_data[i][4].asReal()));
+ raw_image->filterLinearize((float)(filter_data[i][1].asReal()),color);
+ }
+ else if (filter_name == "posterize")
+ {
+ LLColor3 color((float)(filter_data[i][2].asReal()),(float)(filter_data[i][3].asReal()),(float)(filter_data[i][4].asReal()));
+ raw_image->filterEqualize((S32)(filter_data[i][1].asReal()),color);
+ }
+ }
+}
+
// 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(filename);
+ std::string exten = gDirUtilp->getExtension(filename);
LLPointer<LLImageFormatted> image = LLImageFormatted::createFromExtension(exten);
return image;
}
@@ -350,6 +470,11 @@ int main(int argc, char** argv)
int blocks_size = -1;
int levels = 0;
bool reversible = false;
+ std::string filter_name = "";
+ double filter_param = 0.0;
+ std::string vignette_name = "";
+ double vignette_param_1 = 1.0;
+ double vignette_param_2 = 0.0;
// Init whatever is necessary
ll_init_apr();
@@ -523,7 +648,73 @@ int main(int argc, char** argv)
break;
}
}
- else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-a"))
+ else if (!strcmp(argv[arg], "--filter") || !strcmp(argv[arg], "-f"))
+ {
+ // '--filter' needs to be specified with a named filter argument
+ if ((arg + 1) < argc)
+ {
+ filter_name = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (filter_name[0] == '-'))
+ {
+ // We don't have an argument left in the arg list or the next argument is another option
+ std::cout << "No --filter argument given, no filter will be applied" << std::endl;
+ }
+ else
+ {
+ arg += 1; // Skip that arg now we know it's a valid test name
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ // --filter can also have an optional parameter
+ std::string value_str;
+ value_str = argv[arg+1]; // Check the next arg
+ if (value_str[0] != '-') // If it's not another argument, it's a filter parameter value
+ {
+ filter_param = atof(value_str.c_str());
+ arg += 1; // Skip that arg now we used it as a valid filter param
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ }
+ }
+ }
+ else if (!strcmp(argv[arg], "--vignette") || !strcmp(argv[arg], "-v"))
+ {
+ // '--vignette' needs to be specified with a named vignette argument
+ if ((arg + 1) < argc)
+ {
+ vignette_name = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (vignette_name[0] == '-'))
+ {
+ // We don't have an argument left in the arg list or the next argument is another option
+ std::cout << "No --vignette argument given, no vignette will be applied to filters" << std::endl;
+ }
+ else
+ {
+ arg += 1; // Skip that arg now we know it's a valid vignette name
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ // --vignette can also have optional parameters
+ std::string value_str;
+ value_str = argv[arg+1]; // Check the next arg
+ if (value_str[0] != '-') // If it's not another argument, it's a vignette parameter value
+ {
+ vignette_param_1 = atof(value_str.c_str());
+ arg += 1; // Skip that arg now we used it as a valid vignette param
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ value_str = argv[arg+1]; // Check the next arg
+ if (value_str[0] != '-') // If it's not another argument, it's a vignette parameter value
+ {
+ vignette_param_2 = atof(value_str.c_str());
+ arg += 1; // Skip that arg now we used it as a valid vignette param
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ }
+ }
+ }
+ }
+ else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-a"))
{
analyze_performance = true;
}
@@ -568,7 +759,72 @@ int main(int argc, char** argv)
std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl;
continue;
}
-
+
+ // Set the vignette if any
+ if (vignette_name == "blend")
+ {
+ raw_image->setVignette(VIGNETTE_MODE_BLEND,(float)(vignette_param_1),(float)(vignette_param_2));
+ }
+ else if (vignette_name == "fade")
+ {
+ raw_image->setVignette(VIGNETTE_MODE_FADE,(float)(vignette_param_1),(float)(vignette_param_2));
+ }
+
+ // Apply filter if any
+ if (filter_name == "sepia")
+ {
+ raw_image->filterSepia();
+ }
+ else if (filter_name == "grayscale")
+ {
+ raw_image->filterGrayScale();
+ }
+ else if (filter_name == "saturate")
+ {
+ raw_image->filterSaturate((float)(filter_param));
+ }
+ else if (filter_name == "rotate")
+ {
+ raw_image->filterRotate((float)(filter_param));
+ }
+ else if (filter_name == "gamma")
+ {
+ raw_image->filterGamma((float)(filter_param),LLColor3::white);
+ }
+ else if (filter_name == "colorize")
+ {
+ // For testing, we just colorize in the red channel, modulate by the alpha passed as a parameter
+ LLColor3 color(1.0,0.0,0.0);
+ LLColor3 alpha((F32)(filter_param),0.0,0.0);
+ raw_image->filterColorize(color,alpha);
+ }
+ else if (filter_name == "contrast")
+ {
+ raw_image->filterContrast((float)(filter_param),LLColor3::white);
+ }
+ else if (filter_name == "brighten")
+ {
+ raw_image->filterBrightness((S32)(filter_param),LLColor3::white);
+ }
+ else if (filter_name == "darken")
+ {
+ raw_image->filterBrightness((S32)(-filter_param),LLColor3::white);
+ }
+ else if (filter_name == "linearize")
+ {
+ raw_image->filterLinearize((float)(filter_param),LLColor3::white);
+ }
+ else if (filter_name == "posterize")
+ {
+ raw_image->filterEqualize((S32)(filter_param),LLColor3::white);
+ }
+ else if (filter_name != "")
+ {
+ // We're interpreting the filter as a filter file name
+ LLSD filter_data = load_filter_from_file(filter_name);
+ execute_filter(filter_data,raw_image);
+ }
+
// Save file
if (out_file != out_end)
{