18e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
28e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Copyright 2006 Adobe Systems Incorporated
38e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// All Rights Reserved.
48e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener//
58e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
68e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
78e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
88e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
98e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_orientation.cpp#1 $ */
108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */
118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Change: 832332 $ */
128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Author: tknoll $ */
138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_orientation.h"
158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
188e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_orientation::SetTIFF (uint32 tiff)
198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	switch (tiff)
228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 1:
258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kNormal;
278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 2:
318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kMirror;
338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 3:
378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kRotate180;
398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 4:
438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kMirror180;
458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 5:
498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kMirror90CCW;
518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 6:
558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kRotate90CW;
578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 7:
618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kMirror90CW;
638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 8:
678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kRotate90CCW;
698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case 9:
738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kUnknown;
758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		default:
798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fAdobeOrientation = kNormal;
818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
898e8939fc10ad63576a2785ba1333a23726b7e164Florian Krieneruint32 dng_orientation::GetTIFF () const
908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	switch (fAdobeOrientation)
938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kNormal:
968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 1;
988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kMirror:
1018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 2;
1038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kRotate180:
1068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 3;
1088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kMirror180:
1118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 4;
1138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kMirror90CCW:
1168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 5;
1188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kRotate90CW:
1218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 6;
1238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kMirror90CW:
1268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 7;
1288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kRotate90CCW:
1318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 8;
1338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		case kUnknown:
1368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return 9;
1388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		default:
1418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			break;
1428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
1448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	return 1;
1468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
1508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1518e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerbool dng_orientation::FlipD () const
1528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	return (fAdobeOrientation & 1) != 0;
1558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
1598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1608e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerbool dng_orientation::FlipH () const
1618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (fAdobeOrientation & 4)
1648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		return (fAdobeOrientation & 2) == 0;
1658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	else
1678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		return (fAdobeOrientation & 2) != 0;
1688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
1728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1738e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerbool dng_orientation::FlipV () const
1748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (fAdobeOrientation & 4)
1778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		return FlipD () == FlipH ();
1788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	else
1808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		return FlipD () != FlipH ();
1818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
1858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1868e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_orientation dng_orientation::operator- () const
1878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	uint32 x = GetAdobe ();
1908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if ((x & 5) == 5)
1928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
1938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		x ^= 2;
1958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
1978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	dng_orientation result;
1998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	result.SetAdobe (((4 - x) & 3) | (x & 4));
2018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	return result;
2038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
2058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
2078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2088e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_orientation dng_orientation::operator+ (const dng_orientation &b) const
2098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
2108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	uint32 x = GetAdobe ();
2128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	uint32 y = b.GetAdobe ();
2148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (y & 4)
2168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
2178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		if (x & 1)
2198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			x ^= 6;
2208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		else
2218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			x ^= 4;
2228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
2248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	dng_orientation result;
2268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	result.SetAdobe (((x + y) & 3) | (x & 4));
2288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	return result;
2308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
2328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
234