summaryrefslogtreecommitdiff
path: root/indra/llimage
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2014-01-08 15:41:42 -0800
committerMerov Linden <merov@lindenlab.com>2014-01-08 15:41:42 -0800
commit3161d822ab1336a347f1bb34574b5c4b8e747799 (patch)
tree5772b1577aa4589ef1ed8619b9fa8061d7f8f206 /indra/llimage
parentc2a974f1556906f6ca69afb5942378c8dbf85169 (diff)
ACME-1236 : WIP : Added mode and angle parameter to filterScreen (renamed for consistency)
Diffstat (limited to 'indra/llimage')
-rwxr-xr-xindra/llimage/llimage.cpp28
-rwxr-xr-xindra/llimage/llimage.h10
2 files changed, 29 insertions, 9 deletions
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index ae3de32788..a30646d846 100755
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -1000,7 +1000,7 @@ void LLImageRaw::filterSaturate(F32 saturation)
colorTransform(transfo);
}
-void LLImageRaw::filterRotate(F32 alpha)
+void LLImageRaw::filterRotate(F32 angle)
{
// Matrix to Lij
LLMatrix3 r_a;
@@ -1024,9 +1024,9 @@ void LLImageRaw::filterRotate(F32 alpha)
// Local color rotation transform
LLMatrix3 r;
- alpha *= DEG_TO_RAD;
- r.setRows(LLVector3( cosf(alpha), sinf(alpha), 0.0),
- LLVector3(-sinf(alpha), cosf(alpha), 0.0),
+ angle *= DEG_TO_RAD;
+ r.setRows(LLVector3( cosf(angle), sinf(angle), 0.0),
+ LLVector3(-sinf(angle), cosf(angle), 0.0),
LLVector3( 0.0, 0.0, 1.0));
// Global color rotation transform
@@ -1312,7 +1312,7 @@ void LLImageRaw::colorCorrect(const U8* lut_red, const U8* lut_green, const U8*
}
}
-void LLImageRaw::screenFilter(const S32 wave_length)
+void LLImageRaw::filterScreen(EScreenMode mode, const S32 wave_length, const F32 angle)
{
const S32 components = getComponents();
llassert( components >= 1 && components <= 4 );
@@ -1320,14 +1320,28 @@ void LLImageRaw::screenFilter(const S32 wave_length)
S32 width = getWidth();
S32 height = getHeight();
+ F32 sin = sinf(angle*DEG_TO_RAD);
+ F32 cos = cosf(angle*DEG_TO_RAD);
+
U8* dst_data = getData();
for (S32 j = 0; j < height; j++)
{
for (S32 i = 0; i < width; i++)
{
- F32 value = (sinf(2*F_PI*i/wave_length)*sinf(2*F_PI*j/wave_length)+1.0)*255.0/2.0;
- //F32 value = (sinf(2*F_PI*i/wave_length)+1.0)*255.0/2.0; // will do line
+ F32 value = 0.0;
+ F32 d = 0.0;
+ switch (mode)
+ {
+ case SCREEN_MODE_2DSINE:
+ value = (sinf(2*F_PI*i/wave_length)*sinf(2*F_PI*j/wave_length)+1.0)*255.0/2.0;
+ break;
+ case SCREEN_MODE_LINE:
+ d = sin*i - cos*j;
+ value = (sinf(2*F_PI*d/wave_length)+1.0)*255.0/2.0;
+ break;
+ }
U8 dst_value = (dst_data[VRED] >= (U8)(value) ? 255 : 0);
+
if (mVignetteMode == VIGNETTE_MODE_NONE)
{
dst_data[VRED] = dst_value;
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index ed17f1af21..f2bb91a329 100755
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -95,6 +95,12 @@ typedef enum e_vignette_mode
VIGNETTE_MODE_FADE = 2
} EVignetteMode;
+typedef enum e_screen_mode
+{
+ SCREEN_MODE_2DSINE = 0,
+ SCREEN_MODE_LINE = 1
+} EScreenMode;
+
//============================================================================
// library initialization class
@@ -283,7 +289,7 @@ public:
void filterGrayScale(); // Convert to grayscale
void filterSepia(); // Convert to sepia
void filterSaturate(F32 saturation); // < 1.0 desaturates, > 1.0 saturates
- void filterRotate(F32 alpha); // Rotates hue according to alpha, alpha is an angle in degrees
+ void filterRotate(F32 angle); // Rotates hue according to angle, angle in degrees
// Filter Operations : Color Corrections
// When specified, the LLColor3 alpha parameter indicates the intensity of the effect for each color channel
@@ -299,7 +305,7 @@ public:
// Filter Primitives
void colorTransform(const LLMatrix3 &transform);
void colorCorrect(const U8* lut_red, const U8* lut_green, const U8* lut_blue);
- void screenFilter(const S32 wave_length);
+ void filterScreen(EScreenMode mode, const S32 wave_length, const F32 angle);
void setVignette(EVignetteMode mode, F32 gamma, F32 min);
U32* getBrightnessHistogram();