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