blob: 8dce8f9aac07b5e1506e4379af2ee4cc8baa6874 [file] [log] [blame]
/*****************************************************************************/
// Copyright 2006-2019 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/
#include "dng_orientation.h"
/*****************************************************************************/
void dng_orientation::SetTIFF (uint32 tiff)
{
switch (tiff)
{
case 1:
{
fAdobeOrientation = kNormal;
break;
}
case 2:
{
fAdobeOrientation = kMirror;
break;
}
case 3:
{
fAdobeOrientation = kRotate180;
break;
}
case 4:
{
fAdobeOrientation = kMirror180;
break;
}
case 5:
{
fAdobeOrientation = kMirror90CCW;
break;
}
case 6:
{
fAdobeOrientation = kRotate90CW;
break;
}
case 7:
{
fAdobeOrientation = kMirror90CW;
break;
}
case 8:
{
fAdobeOrientation = kRotate90CCW;
break;
}
case 9:
{
fAdobeOrientation = kUnknown;
break;
}
default:
{
fAdobeOrientation = kNormal;
}
}
}
/*****************************************************************************/
uint32 dng_orientation::GetTIFF () const
{
switch (fAdobeOrientation)
{
case kNormal:
{
return 1;
}
case kMirror:
{
return 2;
}
case kRotate180:
{
return 3;
}
case kMirror180:
{
return 4;
}
case kMirror90CCW:
{
return 5;
}
case kRotate90CW:
{
return 6;
}
case kMirror90CW:
{
return 7;
}
case kRotate90CCW:
{
return 8;
}
case kUnknown:
{
return 9;
}
default:
break;
}
return 1;
}
/*****************************************************************************/
bool dng_orientation::FlipD () const
{
return (fAdobeOrientation & 1) != 0;
}
/*****************************************************************************/
bool dng_orientation::FlipH () const
{
if (fAdobeOrientation & 4)
return (fAdobeOrientation & 2) == 0;
else
return (fAdobeOrientation & 2) != 0;
}
/*****************************************************************************/
bool dng_orientation::FlipV () const
{
if (fAdobeOrientation & 4)
return FlipD () == FlipH ();
else
return FlipD () != FlipH ();
}
/*****************************************************************************/
bool dng_orientation::IsMirrored () const
{
return (fAdobeOrientation & 4) != 0;
}
/*****************************************************************************/
dng_orientation dng_orientation::operator- () const
{
uint32 x = GetAdobe ();
if ((x & 5) == 5)
{
x ^= 2;
}
dng_orientation result;
result.SetAdobe (((4 - x) & 3) | (x & 4));
return result;
}
/*****************************************************************************/
dng_orientation dng_orientation::operator+ (const dng_orientation &b) const
{
uint32 x = GetAdobe ();
uint32 y = b.GetAdobe ();
if (y & 4)
{
if (x & 1)
x ^= 6;
else
x ^= 4;
}
dng_orientation result;
result.SetAdobe (((x + y) & 3) | (x & 4));
return result;
}
/*****************************************************************************/
bool dng_orientation::CalcForwardMatrix3by3 (dng_matrix &orientationMatrix,
const bool horizontalFirstRow) const
{
bool hasOrient = false;
orientationMatrix.SetIdentity (3);
if (FlipH ())
{
hasOrient = true;
if (horizontalFirstRow)
{
orientationMatrix = dng_matrix_3by3 (-1.0, 0.0, 1.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0) *
orientationMatrix;
}
else
{
orientationMatrix = dng_matrix_3by3 (1.0, 0.0, 0.0,
0.0, -1.0, 1.0,
0.0, 0.0, 1.0) *
orientationMatrix;
}
}
if (FlipV ())
{
hasOrient = true;
if (horizontalFirstRow)
{
orientationMatrix = dng_matrix_3by3 (1.0, 0.0, 0.0,
0.0, -1.0, 1.0,
0.0, 0.0, 1.0) *
orientationMatrix;
}
else
{
orientationMatrix = dng_matrix_3by3 (-1.0, 0.0, 1.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0) *
orientationMatrix;
}
}
if (FlipD ())
{
hasOrient = true;
orientationMatrix = dng_matrix_3by3 (0.0, 1.0, 0.0,
1.0, 0.0, 0.0,
0.0, 0.0, 1.0) *
orientationMatrix;
}
return hasOrient;
}
/*****************************************************************************/
bool dng_orientation::CalcForwardMatrix4by4 (dng_matrix &orientationMatrix,
const bool horizontalFirstRow) const
{
bool hasOrient = false;
orientationMatrix.SetIdentity (4);
if (FlipH ())
{
hasOrient = true;
if (horizontalFirstRow)
{
orientationMatrix = dng_matrix_4by4 (-1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
}
else
{
orientationMatrix = dng_matrix_4by4 (1.0, 0.0, 0.0, 0.0,
0.0, -1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
}
}
if (FlipV ())
{
hasOrient = true;
if (horizontalFirstRow)
{
orientationMatrix = dng_matrix_4by4 (1.0, 0.0, 0.0, 0.0,
0.0, -1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0) *
orientationMatrix;
}
else
{
orientationMatrix = dng_matrix_4by4 (-1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0) *
orientationMatrix;
}
}
if (FlipD ())
{
hasOrient = true;
orientationMatrix = dng_matrix_4by4 (0.0, 1.0, 0.0, 0.0,
1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0) *
orientationMatrix;
}
return hasOrient;
}
/*****************************************************************************/