You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
392 lines
5.9 KiB
C++
392 lines
5.9 KiB
C++
/*****************************************************************************/
|
|
// 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 ();
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|