diff options
-rwxr-xr-x | indra/integration_tests/llimage_libtest/llimage_libtest.cpp | 23 | ||||
-rwxr-xr-x | indra/llimage/llimage.cpp | 12 | ||||
-rwxr-xr-x | indra/llimage/llimage.h | 3 |
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: |