ACME-1236 : WIP : add filterRotate to rotate hue, add rotate as a valid argument to --filter in llimage_libtest
parent
218d305c44
commit
9dca514c0b
|
|
@ -84,9 +84,10 @@ static const char USAGE[] = "\n"
|
|||
" Set the compression to be lossless (reversible in j2c parlance).\n"
|
||||
" Only valid for output j2c images.\n"
|
||||
" -f, --filter <name> [<param>]\n"
|
||||
" Apply the filter <name> to the input images using the optional param (float) value.\n"
|
||||
" Notes: - 'grayscale' and 'sepia' are supported (no param).\n"
|
||||
" - 'saturate' uses the param: param < 1.0 will desaturate the colors, param > 1.0 will saturate them.\n"
|
||||
" Apply the filter <name> to the input images using the optional param (float) value:\n"
|
||||
" - 'grayscale' and 'sepia' just do that (no param).\n"
|
||||
" - 'saturate' changes color saturation according to param: param < 1.0 will desaturate, param > 1.0 will saturate.\n"
|
||||
" - 'rotate' rotates the color hue according to param (in degree, positive value only).\n"
|
||||
" -log, --logmetrics <metric>\n"
|
||||
" Log performance data for <metric>. Results in <metric>.slp\n"
|
||||
" Note: so far, only ImageCompressionTester has been tested.\n"
|
||||
|
|
@ -617,6 +618,10 @@ int main(int argc, char** argv)
|
|||
{
|
||||
raw_image->filterSaturate((float)(filter_param));
|
||||
}
|
||||
else if (filter_name == "rotate")
|
||||
{
|
||||
raw_image->filterRotate((float)(filter_param));
|
||||
}
|
||||
|
||||
// Save file
|
||||
if (out_file != out_end)
|
||||
|
|
|
|||
|
|
@ -962,13 +962,15 @@ void LLImageRaw::filterSaturate(F32 saturation)
|
|||
LLMatrix3 r_b;
|
||||
|
||||
// 45 degre rotation around z
|
||||
r_a.setRows(LLVector3(0.7071, 0.7071, 0.0),
|
||||
LLVector3(-0.7071, 0.7071, 0.0),
|
||||
LLVector3(0.0, 0.0, 1.0));
|
||||
r_a.setRows(LLVector3( OO_SQRT2, OO_SQRT2, 0.0),
|
||||
LLVector3(-OO_SQRT2, OO_SQRT2, 0.0),
|
||||
LLVector3( 0.0, 0.0, 1.0));
|
||||
// 54.73 degre rotation around y
|
||||
r_b.setRows(LLVector3(0.5773, 0.0, -0.8165),
|
||||
LLVector3(0.0, 1.0, 0.0),
|
||||
LLVector3(0.8165, 0.0, 0.5773));
|
||||
float oo_sqrt3 = 1.0f / F_SQRT3;
|
||||
float sin_54 = F_SQRT2 * oo_sqrt3;
|
||||
r_b.setRows(LLVector3(oo_sqrt3, 0.0, -sin_54),
|
||||
LLVector3(0.0, 1.0, 0.0),
|
||||
LLVector3(sin_54, 0.0, oo_sqrt3));
|
||||
|
||||
// Coordinate conversion
|
||||
LLMatrix3 Lij = r_b * r_a;
|
||||
|
|
@ -986,6 +988,40 @@ void LLImageRaw::filterSaturate(F32 saturation)
|
|||
colorTransform(transfo);
|
||||
}
|
||||
|
||||
void LLImageRaw::filterRotate(F32 alpha)
|
||||
{
|
||||
// Matrix to Lij
|
||||
LLMatrix3 r_a;
|
||||
LLMatrix3 r_b;
|
||||
|
||||
// 45 degre rotation around z
|
||||
r_a.setRows(LLVector3( OO_SQRT2, OO_SQRT2, 0.0),
|
||||
LLVector3(-OO_SQRT2, OO_SQRT2, 0.0),
|
||||
LLVector3( 0.0, 0.0, 1.0));
|
||||
// 54.73 degre rotation around y
|
||||
float oo_sqrt3 = 1.0f / F_SQRT3;
|
||||
float sin_54 = F_SQRT2 * oo_sqrt3;
|
||||
r_b.setRows(LLVector3(oo_sqrt3, 0.0, -sin_54),
|
||||
LLVector3(0.0, 1.0, 0.0),
|
||||
LLVector3(sin_54, 0.0, oo_sqrt3));
|
||||
|
||||
// Coordinate conversion
|
||||
LLMatrix3 Lij = r_b * r_a;
|
||||
LLMatrix3 Lij_inv = Lij;
|
||||
Lij_inv.transpose();
|
||||
|
||||
// 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),
|
||||
LLVector3( 0.0, 0.0, 1.0));
|
||||
|
||||
// Global color rotation transform
|
||||
LLMatrix3 transfo = Lij_inv * r * Lij;
|
||||
colorTransform(transfo);
|
||||
}
|
||||
|
||||
// Filter Primitives
|
||||
void LLImageRaw::colorTransform(const LLMatrix3 &transform)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -260,7 +260,8 @@ public:
|
|||
// Filter Operations
|
||||
void filterGrayScale();
|
||||
void filterSepia();
|
||||
void filterSaturate(F32 s);
|
||||
void filterSaturate(F32 saturation); // < 1.0 desaturates, > 1.0 saturates
|
||||
void filterRotate(F32 alpha); // rotates hue, alpha in degrees
|
||||
// Filter Primitives
|
||||
void colorTransform(const LLMatrix3 &transform);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue