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

#ifndef __dng_parse_utils__
#define __dng_parse_utils__

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

#include "dng_classes.h"
#include "dng_flags.h"
#include "dng_types.h"
#include "dng_stream.h"
#include "dng_string.h"
#include "dng_matrix.h"

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

#if qDNGValidate || qDNGDebug

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

const char * LookupParentCode (uint32 parentCode);

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

const char * LookupTagCode (uint32 parentCode,
							uint32 tagCode);

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

const char * LookupTagType (uint32 tagType);

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

const char * LookupNewSubFileType (uint32 key);

const char * LookupCompression (uint32 key);

const char * LookupPredictor (uint32 key);

const char * LookupSampleFormat (uint32 key);

const char * LookupPhotometricInterpretation (uint32 key);

const char * LookupOrientation (uint32 key);

const char * LookupResolutionUnit (uint32 key);

const char * LookupCFAColor (uint32 key);

const char * LookupSensingMethod (uint32 key);

const char * LookupExposureProgram (uint32 key);

const char * LookupMeteringMode (uint32 key);

const char * LookupLightSource (uint32 key);

const char * LookupColorSpace (uint32 key);

const char * LookupFileSource (uint32 key);

const char * LookupSceneType (uint32 key);

const char * LookupCustomRendered (uint32 key);

const char * LookupExposureMode (uint32 key);

const char * LookupWhiteBalance (uint32 key);

const char * LookupSceneCaptureType (uint32 key);

const char * LookupGainControl (uint32 key);

const char * LookupContrast (uint32 key);

const char * LookupSaturation (uint32 key);

const char * LookupSharpness (uint32 key);

const char * LookupSubjectDistanceRange (uint32 key);

const char * LookupComponent (uint32 key);

const char * LookupCFALayout (uint32 key);

const char * LookupMakerNoteSafety (uint32 key);

const char * LookupColorimetricReference (uint32 key);

const char * LookupPreviewColorSpace (uint32 key);

const char * LookupJPEGMarker (uint32 key);

const char * LookupSensitivityType (uint32 key);

const char * LookupDepthFormat (uint32 key);

const char * LookupDepthUnits (uint32 key);

const char * LookupDepthMeasureType (uint32 key);

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

void DumpHexAscii (dng_stream &stream,
				   uint32 count);
				   
void DumpHexAscii (const uint8 *buf,
				   uint32 count);

void DumpXMP (dng_stream &stream,
			  uint32 count);

void DumpString (const dng_string &s);

void DumpTagValues (dng_stream &stream,
					const char *entry_name,
					uint32 parentCode,
					uint32 tagCode,
					uint32 tagType,
					uint32 tagCount,
					const char *tag_name = NULL);
					
void DumpMatrix (const dng_matrix &m);

void DumpVector (const dng_vector &v);

void DumpDateTime (const dng_date_time &dt);

void DumpExposureTime (real64 x);

void DumpFingerprint (const dng_fingerprint &p);

void DumpHueSatMap (dng_stream &stream,
					uint32 hues,
					uint32 sats,
					uint32 vals,
					bool skipSat0);

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

#endif

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

bool CheckTagType (uint32 parentCode,
				   uint32 tagCode,
				   uint32 tagType,
				   uint16 validType0,
				   uint16 validType1 = 0,
				   uint16 validType2 = 0,
				   uint16 validType3 = 0);

bool CheckTagCount (uint32 parentCode,
					uint32 tagCode,
					uint32 tagCount,
					uint32 minCount,
					uint32 maxCount = 0);
							
bool CheckColorImage (uint32 parentCode,
					  uint32 tagCode,
					  uint32 colorPlanes);
					  
bool CheckMainIFD (uint32 parentCode,
				   uint32 tagCode,
				   uint32 newSubFileType);

bool CheckMainOrEnhancedIFD (uint32 parentCode,
							 uint32 tagCode,
							 uint32 newSubFileType);

bool CheckRawIFD (uint32 parentCode,
				  uint32 tagCode,
				  uint32 photometricInterpretation);

bool CheckCFA (uint32 parentCode,
			   uint32 tagCode,
			   uint32 photometricInterpretation);

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

void ParseStringTag (dng_stream &stream,
					 uint32 parentCode,
					 uint32 tagCode,
					 uint32 tagCount,
					 dng_string &s,
					 bool trimBlanks = true);
						  
void ParseDualStringTag (dng_stream &stream,
						 uint32 parentCode,
						 uint32 tagCode,
						 uint32 tagCount,
						 dng_string &s1,
						 dng_string &s2);

void ParseEncodedStringTag (dng_stream &stream,
							uint32 parentCode,
							uint32 tagCode,
							uint32 tagCount,
							dng_string &s);
							
bool ParseMatrixTag (dng_stream &stream,
					 uint32 parentCode,
					 uint32 tagCode,
					 uint32 tagType,
					 uint32 tagCount,
					 uint32 rows,
					 uint32 cols,
					 dng_matrix &m);
							
bool ParseVectorTag (dng_stream &stream,
					 uint32 parentCode,
					 uint32 tagCode,
					 uint32 tagType,
					 uint32 tagCount,
					 uint32 count,
					 dng_vector &v);
					 
bool ParseDateTimeTag (dng_stream &stream,
					   uint32 parentCode,
					   uint32 tagCode,
					   uint32 tagType,
					   uint32 tagCount,
					   dng_date_time &dt);
							
/*****************************************************************************/

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