summaryrefslogtreecommitdiff
path: root/indra/llimage
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2014-01-03 17:31:04 -0800
committerMerov Linden <merov@lindenlab.com>2014-01-03 17:31:04 -0800
commit90cbda6db0d075dccc2369a68b02919b40f53cca (patch)
tree5aba103dfb23727ac8f5a101864f752789fe12fd /indra/llimage
parent35e30759c82e0fa425e2ee5ba235868a25b44169 (diff)
ACME-1236 : WIP : Add 2 new color correction filters. Add a la Instagram composite filters for testing in llimage_libtest
Diffstat (limited to 'indra/llimage')
-rwxr-xr-xindra/llimage/llimage.cpp33
-rwxr-xr-xindra/llimage/llimage.h4
2 files changed, 36 insertions, 1 deletions
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index d84989f9c8..3d86abb26d 100755
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -1045,6 +1045,22 @@ void LLImageRaw::filterGamma(F32 gamma)
colorCorrect(gamma_lut,gamma_lut,gamma_lut);
}
+void LLImageRaw::filterColorBalance(F32 gamma_red, F32 gamma_green, F32 gamma_blue)
+{
+ U8 gamma_red_lut[256];
+ U8 gamma_green_lut[256];
+ U8 gamma_blue_lut[256];
+
+ for (S32 i = 0; i < 256; i++)
+ {
+ gamma_red_lut[i] = (U8)(255.0 * (llclampf((float)(pow((float)(i)/255.0,gamma_red)))));
+ gamma_green_lut[i] = (U8)(255.0 * (llclampf((float)(pow((float)(i)/255.0,gamma_green)))));
+ gamma_blue_lut[i] = (U8)(255.0 * (llclampf((float)(pow((float)(i)/255.0,gamma_blue)))));
+ }
+
+ colorCorrect(gamma_red_lut,gamma_green_lut,gamma_blue_lut);
+}
+
void LLImageRaw::filterLinearize(F32 tail)
{
// Get the histogram
@@ -1191,6 +1207,23 @@ void LLImageRaw::filterBrightness(S32 add)
colorCorrect(brightness_lut,brightness_lut,brightness_lut);
}
+void LLImageRaw::filterMinMax(S32 min, S32 max)
+{
+ U8 contrast_lut[256];
+ min = llclampb(min);
+ max = llclampb(max);
+
+ F32 slope = 255.0/(F32)(max - min);
+ F32 translate = -slope*min;
+
+ for (S32 i = 0; i < 256; i++)
+ {
+ contrast_lut[i] = (U8)(llclampb((S32)(slope*i + translate)));
+ }
+
+ colorCorrect(contrast_lut,contrast_lut,contrast_lut);
+}
+
// Filter Primitives
void LLImageRaw::colorTransform(const LLMatrix3 &transform)
{
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 404f1c0769..6e58453da5 100755
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -289,7 +289,9 @@ public:
void filterColorize(const LLColor4U& color); // Colorize with color. Alpha will be taken into account for colorization intensity.
void filterContrast(F32 slope); // Change contrast according to slope: > 1.0 more contrast, < 1.0 less contrast
void filterBrightness(S32 add); // Change brightness according to add: > 0 brighter, < 0 darker
-
+ void filterColorBalance(F32 gamma_red, F32 gamma_green, F32 gamma_blue); // Change the color balance applying gammas to each channel
+ void filterMinMax(S32 min, S32 max); // Redistribute contrast / brightness between min and max in a linear way
+
// Filter Primitives
void colorTransform(const LLMatrix3 &transform);
void colorCorrect(const U8* lut_red, const U8* lut_green, const U8* lut_blue);