summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindra/integration_tests/llimage_libtest/llimage_libtest.cpp23
-rwxr-xr-xindra/llimage/llimage.cpp12
-rwxr-xr-xindra/llimage/llimage.h3
3 files changed, 26 insertions, 12 deletions
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
index 45e60f64e6..6c23a6a866 100755
--- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -97,8 +97,8 @@ 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"
-" -v, --vignette <name> [<feather>]\n"
-" Apply a circular central vignette <name> to the filter using the optional <feather> value. Admissible names:\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"
@@ -371,7 +371,8 @@ int main(int argc, char** argv)
std::string filter_name = "";
double filter_param = 0.0;
std::string vignette_name = "";
- double vignette_param = 1.0;
+ double vignette_param_1 = 1.0;
+ double vignette_param_2 = 0.0;
// Init whatever is necessary
ll_init_apr();
@@ -591,15 +592,23 @@ int main(int argc, char** argv)
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 an optional parameter
+ // --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 = atof(value_str.c_str());
+ 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;
+ }
}
}
}
@@ -652,11 +661,11 @@ int main(int argc, char** argv)
// Set the vignette if any
if (vignette_name == "blend")
{
- raw_image->setVignette(VIGNETTE_MODE_BLEND,(float)(vignette_param));
+ 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));
+ raw_image->setVignette(VIGNETTE_MODE_FADE,(float)(vignette_param_1),(float)(vignette_param_2));
}
// Apply filter if any
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index da22ed5e5b..d84989f9c8 100755
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -103,7 +103,8 @@ LLImageBase::LLImageBase()
mHistoBlue(NULL),
mHistoBrightness(NULL),
mVignetteMode(VIGNETTE_MODE_NONE),
- mVignetteGamma(1.0)
+ mVignetteGamma(1.0),
+ mVignetteMin(0.0)
{
}
@@ -1280,10 +1281,11 @@ void LLImageRaw::colorCorrect(const U8* lut_red, const U8* lut_green, const U8*
}
}
-void LLImageRaw::setVignette(EVignetteMode mode, F32 gamma)
+void LLImageRaw::setVignette(EVignetteMode mode, F32 gamma, F32 min)
{
mVignetteMode = mode;
mVignetteGamma = gamma;
+ mVignetteMin = llclampf(min);
// We always center the vignette on the image and fits it in the image smallest dimension
mVignetteCenterX = getWidth()/2;
mVignetteCenterY = getHeight()/2;
@@ -1293,9 +1295,11 @@ void LLImageRaw::setVignette(EVignetteMode mode, F32 gamma)
F32 LLImageRaw::getVignetteAlpha(S32 i, S32 j)
{
// alpha is a modified gaussian value, with a center and fading in a circular pattern toward the edges
- // the gamma parameter controls the intensity of the drop down from alpha 1.0 to 0.0
+ // The gamma parameter controls the intensity of the drop down from alpha 1.0 (center) to 0.0
F32 d_center_square = (i - mVignetteCenterX)*(i - mVignetteCenterX) + (j - mVignetteCenterY)*(j - mVignetteCenterY);
- return powf(F_E, -(powf((d_center_square/(mVignetteWidth*mVignetteWidth)),mVignetteGamma)/2.0f));
+ F32 alpha = powf(F_E, -(powf((d_center_square/(mVignetteWidth*mVignetteWidth)),mVignetteGamma)/2.0f));
+ // We rescale alpha between min and 1.0 so to avoid complete fading if so desired.
+ return (mVignetteMin + alpha * (1.0 - mVignetteMin));
}
U32* LLImageRaw::getBrightnessHistogram()
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index b9f6a12bdd..404f1c0769 100755
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -170,6 +170,7 @@ protected:
S32 mVignetteCenterY;
S32 mVignetteWidth;
F32 mVignetteGamma;
+ F32 mVignetteMin;
public:
static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);
@@ -292,7 +293,7 @@ public:
// Filter Primitives
void colorTransform(const LLMatrix3 &transform);
void colorCorrect(const U8* lut_red, const U8* lut_green, const U8* lut_blue);
- void setVignette(EVignetteMode mode, F32 gamma);
+ void setVignette(EVignetteMode mode, F32 gamma, F32 min);
U32* getBrightnessHistogram();
protected: