/*****************************************************************************/
// 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.h#1 $ */ 
/* $DateTime: 2012/05/30 13:28:51 $ */
/* $Change: 832332 $ */
/* $Author: tknoll $ */

/******************************************************************************/

#ifndef __dng_orientation__
#define __dng_orientation__

/******************************************************************************/

#include "dng_types.h"

/******************************************************************************/

class dng_orientation
	{
	
	private:
	
		// We internally use an orientation encoding ("Adobe") that is
		// different than the TIFF orientation encoding ("TIFF").
		
		uint32 fAdobeOrientation;

	public:
		enum
			{
			kNormal      = 0,
			kRotate90CW  = 1,
			kRotate180   = 2,
			kRotate90CCW = 3,
			kMirror		 = 4,
			kMirror90CW  = 5,
			kMirror180	 = 6,
			kMirror90CCW = 7,
			kUnknown     = 8
			};
	
	
		dng_orientation ()
		
			:	fAdobeOrientation (kNormal)
			
			{
			}
			
		void SetAdobe (uint32 adobe)
			{
			fAdobeOrientation = adobe;
			}
			
		uint32 GetAdobe () const
			{
			return fAdobeOrientation;
			}
			
		void SetTIFF (uint32 tiff);
		
		uint32 GetTIFF () const;
		
		static dng_orientation AdobeToDNG (uint32 adobe)
			{
			
			dng_orientation result;
			
			result.SetAdobe (adobe);
			
			return result;
			
			}
		
		static dng_orientation TIFFtoDNG (uint32 tiff)
			{
			
			dng_orientation result;
			
			result.SetTIFF (tiff);
			
			return result;
			
			}
		
		static dng_orientation Normal ()
			{
			return AdobeToDNG (kNormal);
			}
			
		static dng_orientation Rotate90CW ()
			{
			return AdobeToDNG (kRotate90CW);
			}
			
		static dng_orientation Rotate180 ()
			{
			return AdobeToDNG (kRotate180);
			}
			
		static dng_orientation Rotate90CCW ()
			{
			return AdobeToDNG (kRotate90CCW);
			}
			
		static dng_orientation Mirror ()
			{
			return AdobeToDNG (kMirror);
			}
			
		static dng_orientation Mirror90CW ()
			{
			return AdobeToDNG (kMirror90CW);
			}
			
		static dng_orientation Mirror180 ()
			{
			return AdobeToDNG (kMirror180);
			}
			
		static dng_orientation Mirror90CCW ()
			{
			return AdobeToDNG (kMirror90CCW);
			}
			
		static dng_orientation Unknown ()
			{
			return AdobeToDNG (kUnknown);
			}
			
		bool IsValid () const
			{
			return fAdobeOrientation < kUnknown;
			}
			
		bool NotValid () const
			{
			return !IsValid ();
			}
			
		bool FlipD () const;
		
		bool FlipH () const;
		
		bool FlipV () const;
		
		bool operator== (const dng_orientation &b) const
			{
			return fAdobeOrientation == b.fAdobeOrientation;
			}
			
		bool operator!= (const dng_orientation &b) const
			{
			return !(*this == b);
			}
		
		dng_orientation operator- () const;
		
		dng_orientation operator+ (const dng_orientation &b) const;
		
		dng_orientation operator- (const dng_orientation &b) const
			{
			return (*this) + (-b);
			}
			
		void operator+= (const dng_orientation &b)
			{
			*this = *this + b;
			}
		
		void operator-= (const dng_orientation &b)
			{
			*this = *this - b;
			}
		
	};

/******************************************************************************/

#endif
	
/******************************************************************************/