/*****************************************************************************/
// Copyright 2006 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.
/*****************************************************************************/

/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_orientation.cpp#1 $ */ 
/* $DateTime: 2012/05/30 13:28:51 $ */
/* $Change: 832332 $ */
/* $Author: tknoll $ */

#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;
	
	}
		
/*****************************************************************************/
