ACME-1236 : WIP : Add filter file loading and execution to llimage_libtest, suppress the a la Instagram tests as a result

meow-7.2.2
Merov Linden 2014-01-07 16:17:25 -08:00
parent 3cbd0dfd84
commit 5187e709c9
1 changed files with 107 additions and 49 deletions

View File

@ -40,6 +40,7 @@
#include "lldir.h"
#include "lldiriterator.h"
#include "v4coloru.h"
#include "llsdserialize.h"
// system libraries
#include <iostream>
@ -97,6 +98,7 @@ static const char USAGE[] = "\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"
@ -114,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;
}
@ -716,55 +818,11 @@ int main(int argc, char** argv)
{
raw_image->filterEqualize((S32)(filter_param),LLColor3::white);
}
// Test for some "a la Instagram" filters
else if (filter_name == "Lomofi")
else if (filter_name != "")
{
raw_image->setVignette(VIGNETTE_MODE_BLEND,4.0,0.0);
raw_image->filterLinearize(0.2,LLColor3::white);
raw_image->filterBrightness(20,LLColor3::white);
}
else if (filter_name == "Poprocket")
{
LLColor3 color(1.0,0.0,0.0);
LLColor3 alpha(0.5,0.0,0.0);
raw_image->filterLinearize(0.0,LLColor3::white);
raw_image->filterContrast(0.5,LLColor3::white);
raw_image->setVignette(VIGNETTE_MODE_FADE,4.0,0.5);
raw_image->filterColorize(color,alpha);
}
else if (filter_name == "Sutro")
{
raw_image->filterLinearize(0.2,LLColor3::white);
raw_image->setVignette(VIGNETTE_MODE_FADE,4.0,0.5);
raw_image->filterSepia();
}
else if (filter_name == "Toaster")
{
raw_image->filterContrast(0.8,LLColor3::white);
raw_image->setVignette(VIGNETTE_MODE_FADE,4.0,0.5);
raw_image->filterBrightness(10,LLColor3::white);
//raw_image->filterColorBalance(0.5,1.0,1.0);
}
else if (filter_name == "Inkwell")
{
raw_image->filterLinearize(0.0,LLColor3::white);
raw_image->filterGrayScale();
}
else if (filter_name == "Hefe")
{
raw_image->filterLinearize(0.0,LLColor3::white);
raw_image->setVignette(VIGNETTE_MODE_FADE,4.0,0.5);
raw_image->filterContrast(1.5,LLColor3::white);
}
else if (filter_name == "Gotham")
{
raw_image->filterLinearize(0.0,LLColor3::white);
// Blow out the Blue
LLColor3 color(0.0,0.0,0.0);
LLColor3 alpha(0.0,0.0,1.0);
raw_image->filterColorize(color,alpha);
// Convert to Grayscale
raw_image->filterGrayScale();
// 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