10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2006-2012 Adobe Systems Incorporated
30b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// All Rights Reserved.
40b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener//
50b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
60b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
70b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
80b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
90b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_image_writer.h#3 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/07/31 22:04:34 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 840853 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * Support for writing DNG images to files.
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_image_writer__
210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_image_writer__
220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_auto_ptr.h"
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_classes.h"
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_fingerprint.h"
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_memory.h"
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_point.h"
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_rational.h"
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_sdk_limits.h"
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_string.h"
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_tag_types.h"
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_tag_values.h"
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_types.h"
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Image resolution.
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_resolution
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fXResolution;
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fYResolution;
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fResolutionUnit;
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_resolution ();
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tiff_tag
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fCode;
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fType;
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fCount;
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tiff_tag (uint16 code,
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  uint16 type,
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  uint32 count)
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	fCode  (code)
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fType  (type)
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fCount (count)
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~tiff_tag ()
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 Code () const
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fCode;
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 Type () const
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fType;
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Count () const
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fCount;
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetCount (uint32 count)
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fCount = count;
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Size () const
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return TagTypeSize (Type ()) * Count ();
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Put (dng_stream &stream) const = 0;
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tiff_tag (const tiff_tag &tag);
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tiff_tag & operator= (const tiff_tag &tag);
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_data_ptr: public tiff_tag
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const void *fData;
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr (uint16 code,
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				      uint16 type,
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				      uint32 count,
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				      const void *data)
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tiff_tag (code, type, count)
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fData (data)
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetData (const void *data)
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fData = data;
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Put (dng_stream &stream) const;
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr (const tag_data_ptr &tag);
1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr & operator= (const tag_data_ptr &tag);
1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_string: public tiff_tag
1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fString;
1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string (uint16 code,
1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				    const dng_string &s,
1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				    bool forceASCII = true);
1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Put (dng_stream &stream) const;
1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_encoded_text: public tiff_tag
1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fText;
1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_memory_data fUTF16;
1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_encoded_text (uint16 code,
1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						  const dng_string &text);
2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Put (dng_stream &stream) const;
2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_uint8: public tag_data_ptr
2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint8 fValue;
2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint8 (uint16 code,
2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				   uint8 value = 0)
2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttByte, 1, &fValue)
2200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fValue (value)
2220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Set (uint8 value)
2270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fValue = value;
2290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
2340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_uint8_ptr: public tag_data_ptr
2360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint8_ptr (uint16 code,
2410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			    	   const uint8 *data,
2420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			    	   uint32 count = 1)
2430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttByte, count, data)
2450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
2520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_uint16: public tag_data_ptr
2540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
2570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fValue;
2590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 (uint16 code,
2630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					uint16 value = 0)
2640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttShort, 1, &fValue)
2660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fValue (value)
2680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Set (uint16 value)
2730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fValue = value;
2750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
2800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_int16_ptr: public tag_data_ptr
2820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_int16_ptr (uint16 code,
2870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				       const int16 *data,
2880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				       uint32 count = 1)
2890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttSShort, count, data)
2910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
2980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_uint16_ptr: public tag_data_ptr
3000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16_ptr (uint16 code,
3050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				        const uint16 *data,
3060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				        uint32 count = 1)
3070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttShort, count, data)
3090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
3140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
3160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_uint32: public tag_data_ptr
3180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
3210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fValue;
3230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 (uint16 code,
3270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				    uint32 value = 0)
3280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttLong, 1, &fValue)
3300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fValue (value)
3320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Set (uint32 value)
3370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fValue = value;
3390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
3420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
3440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_uint32_ptr: public tag_data_ptr
3460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32_ptr (uint16 code,
3510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				 		const uint32 *data,
3520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				 		uint32 count = 1)
3530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttLong, count, data)
3550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
3600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
3620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_urational: public tag_data_ptr
3640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
3670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const dng_urational fValue;
3690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational (uint16 code,
3730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				       const dng_urational &value)
3740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttRational, 1, &fValue)
3760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fValue (value)
3780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
3830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
3850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_urational_ptr: public tag_data_ptr
3870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr (uint16 code,
3920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				           const dng_urational *data = NULL,
3930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				           uint32 count = 1)
3940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttRational, count, data)
3960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
4030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_srational: public tag_data_ptr
4050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
4080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const dng_srational fValue;
4100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
4120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_srational (uint16 code,
4140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				       const dng_srational &value)
4150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttSRational, 1, &fValue)
4170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fValue (value)
4190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
4210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
4220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
4260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_srational_ptr: public tag_data_ptr
4280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
4310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_srational_ptr (uint16 code,
4330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				           const dng_srational *data = NULL,
4340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				           uint32 count = 1)
4350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttSRational, count, data)
4370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
4390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
4400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
4440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_real64: public tag_data_ptr
4460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
4490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real64 fValue;
4510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
4530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_real64 (uint16 code,
4550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				    real64 value = 0.0)
4560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tag_data_ptr (code, ttDouble, 1, &fValue)
4580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fValue (value)
4600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
4620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
4630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Set (real64 value)
4650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
4660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fValue = value;
4670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
4680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
4720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_matrix: public tag_srational_ptr
4740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
4770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_srational fEntry [kMaxColorPlanes *
4790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							  kMaxColorPlanes];
4800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
4820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_matrix (uint16 code,
4840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				    const dng_matrix &m);
4850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
4890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_icc_profile: public tag_data_ptr
4910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
4940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_icc_profile (const void *profileData, uint32 profileSize);
4960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
5000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_cfa_pattern: public tiff_tag
5020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
5050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRows;
5070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fCols;
5080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const uint8 *fPattern;
5100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
5120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_cfa_pattern (uint16 code,
5140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   	 uint32 rows,
5150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					     uint32 cols,
5160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   	 const uint8 *pattern)
5170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	tiff_tag (code, ttUndefined, 4 + rows * cols)
5190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fRows    (rows   )
5210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fCols    (cols   )
5220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fPattern (pattern)
5230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
5250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
5260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Put (dng_stream &stream) const;
5280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
5300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
5320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_cfa_pattern (const tag_cfa_pattern &tag);
5340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_cfa_pattern & operator= (const tag_cfa_pattern &tag);
5360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
5380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
5400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_exif_date_time: public tag_data_ptr
5420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
5450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		char fData [20];
5470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
5490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_exif_date_time (uint16 code,
5510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				            const dng_date_time &dt);
5520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
5540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
5560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_iptc: public tiff_tag
5580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
5610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const void *fData;
5630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fLength;
5650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
5670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_iptc (const void *data,
5690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  uint32 length);
5700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Put (dng_stream &stream) const;
5720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
5740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
5760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_iptc (const tag_iptc &tag);
5780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_iptc & operator= (const tag_iptc &tag);
5800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
5820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
5840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_xmp: public tag_uint8_ptr
5860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
5890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fBuffer;
5910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
5930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_xmp (const dng_xmp *xmp);
5950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
5970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
5990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_xmp (const tag_xmp &tag);
6010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_xmp & operator= (const tag_xmp &tag);
6030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
6050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
6070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_tiff_directory
6090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
6120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		enum
6140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
6150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			kMaxEntries = 100
6160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			};
6170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fEntries;
6190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const tiff_tag *fTag [kMaxEntries];
6210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fChained;
6230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
6250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tiff_directory ()
6270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	fEntries (0)
6290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fChained (0)
6300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
6320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
6330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_tiff_directory ()
6350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
6360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
6370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Add (const tiff_tag *tag);
6390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetChained (uint32 offset)
6410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
6420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fChained = offset;
6430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
6440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Size () const;
6460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		enum OffsetsBase
6480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
6490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			offsetsRelativeToStream			= 0,
6500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			offsetsRelativeToExplicitBase	= 1,
6510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			offsetsRelativeToIFD			= 2
6520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			};
6530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Put (dng_stream &stream,
6550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  OffsetsBase offsetsBase = offsetsRelativeToStream,
6560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  uint32 explicitBase = 0) const;
6570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
6590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
6610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tiff_directory (const dng_tiff_directory &dir);
6630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tiff_directory & operator= (const dng_tiff_directory &dir);
6650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
6670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
6690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_basic_tag_set
6710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
6740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fNewSubFileType;
6760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fImageWidth;
6780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fImageLength;
6790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fPhotoInterpretation;
6810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fFillOrder;
6830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSamplesPerPixel;
6850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fBitsPerSampleData [kMaxSamplesPerPixel];
6870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16_ptr fBitsPerSample;
6890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool fStrips;
6910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fTileWidth;
6930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fTileLength;
6940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_memory_data fTileInfoBuffer;
6960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 *fTileOffsetData;
6980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32_ptr fTileOffsets;
7000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 *fTileByteCountData;
7020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32_ptr fTileByteCounts;
7040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fPlanarConfiguration;
7060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fCompression;
7080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fPredictor;
7100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fExtraSamplesData [kMaxSamplesPerPixel];
7120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16_ptr fExtraSamples;
7140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fSampleFormatData [kMaxSamplesPerPixel];
7160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16_ptr fSampleFormat;
7180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fRowInterleaveFactor;
7200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fSubTileBlockSizeData [2];
7220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16_ptr fSubTileBlockSize;
7240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
7260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_basic_tag_set (dng_tiff_directory &directory,
7280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					       const dng_ifd &info);
7290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_basic_tag_set ()
7310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
7320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
7330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetTileOffset (uint32 index,
7350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							uint32 offset)
7360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
7370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fTileOffsetData [index] = offset;
7380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
7390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetTileByteCount (uint32 index,
7410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   uint32 count)
7420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
7430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fTileByteCountData [index] = count;
7440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
7450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool WritingStrips () const
7470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
7480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fStrips;
7490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
7500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
7520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
7540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_basic_tag_set (const dng_basic_tag_set &set);
7560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_basic_tag_set & operator= (const dng_basic_tag_set &set);
7580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
7600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
7620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass exif_tag_set
7640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
7650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
7670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tiff_directory fExifIFD;
7690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tiff_directory fGPSIFD;
7700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
7720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fExifLink;
7740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fGPSLink;
7750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool fAddedExifLink;
7770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool fAddedGPSLink;
7780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint8 fExifVersionData [4];
7800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr fExifVersion;
7820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fExposureTime;
7840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_srational fShutterSpeedValue;
7850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fFNumber;
7870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fApertureValue;
7880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_srational fBrightnessValue;
7900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_srational fExposureBiasValue;
7920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fMaxApertureValue;
7940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fSubjectDistance;
7960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fFocalLength;
7980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fISOSpeedRatings;
8000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSensitivityType;
8020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fStandardOutputSensitivity;
8030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fRecommendedExposureIndex;
8040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fISOSpeed;
8050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fISOSpeedLatitudeyyy;
8060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fISOSpeedLatitudezzz;
8070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fFlash;
8090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fExposureProgram;
8110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fMeteringMode;
8130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fLightSource;
8150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSensingMethod;
8170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fFocalLength35mm;
8190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint8 fFileSourceData;
8210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr fFileSource;
8220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint8 fSceneTypeData;
8240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr fSceneType;
8250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_cfa_pattern fCFAPattern;
8270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fCustomRendered;
8290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fExposureMode;
8300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fWhiteBalance;
8310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSceneCaptureType;
8320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fGainControl;
8330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fContrast;
8340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSaturation;
8350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSharpness;
8360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSubjectDistanceRange;
8370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fDigitalZoomRatio;
8390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fExposureIndex;
8410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fImageNumber;
8430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fSelfTimerMode;
8450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string    fBatteryLevelA;
8470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fBatteryLevelR;
8480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fFocalPlaneXResolution;
8500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fFocalPlaneYResolution;
8510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fFocalPlaneResolutionUnit;
8530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fSubjectAreaData [4];
8550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16_ptr fSubjectArea;
8570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fLensInfoData [4];
8590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fLensInfo;
8610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_exif_date_time fDateTime;
8630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_exif_date_time fDateTimeOriginal;
8640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_exif_date_time fDateTimeDigitized;
8650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fSubsecTime;
8670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fSubsecTimeOriginal;
8680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fSubsecTimeDigitized;
8690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fMake;
8710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fModel;
8720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fArtist;
8730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fSoftware;
8740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fCopyright;
8750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fImageDescription;
8760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fSerialNumber;
8780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fMakerNoteSafety;
8800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr fMakerNote;
8820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_encoded_text fUserComment;
8840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		char fImageUniqueIDData [33];
8860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr fImageUniqueID;
8880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// EXIF 2.3 tags.
8900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fCameraOwnerName;
8920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fBodySerialNumber;
8930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fLensSpecification;
8940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fLensMake;
8950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fLensModel;
8960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fLensSerialNumber;
8970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
8980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint8 fGPSVersionData [4];
8990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint8_ptr fGPSVersionID;
9010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string        fGPSLatitudeRef;
9030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fGPSLatitude;
9040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string        fGPSLongitudeRef;
9060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fGPSLongitude;
9070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint8     fGPSAltitudeRef;
9090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSAltitude;
9100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fGPSTimeStamp;
9120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fGPSSatellites;
9140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fGPSStatus;
9150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fGPSMeasureMode;
9160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSDOP;
9180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string    fGPSSpeedRef;
9200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSSpeed;
9210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string    fGPSTrackRef;
9230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSTrack;
9240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string    fGPSImgDirectionRef;
9260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSImgDirection;
9270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fGPSMapDatum;
9290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string        fGPSDestLatitudeRef;
9310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fGPSDestLatitude;
9320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string         fGPSDestLongitudeRef;
9340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fGPSDestLongitude;
9350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string    fGPSDestBearingRef;
9370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSDestBearing;
9380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string    fGPSDestDistanceRef;
9400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSDestDistance;
9410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_encoded_text fGPSProcessingMethod;
9430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_encoded_text fGPSAreaInformation;
9440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fGPSDateStamp;
9460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fGPSDifferential;
9480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational fGPSHPositioningError;
9500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
9520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		exif_tag_set (dng_tiff_directory &directory,
9540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  const dng_exif &exif,
9550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  bool makerNoteSafe = false,
9560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  const void *makerNoteData = NULL,
9570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  uint32 makerNoteLength = 0,
9580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  bool insideDNG = false);
9590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Locate (uint32 offset)
9610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
9620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fExifLink.Set (offset);
9630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fGPSLink .Set (offset + fExifIFD.Size ());
9640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
9650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Size () const
9670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
9680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fExifIFD.Size () +
9690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				   fGPSIFD .Size ();
9700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
9710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Put (dng_stream &stream) const
9730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
9740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fExifIFD.Put (stream);
9750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fGPSIFD .Put (stream);
9760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
9770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
9790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void AddLinks (dng_tiff_directory &directory);
9810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
9830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
9850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		exif_tag_set (const exif_tag_set &set);
9870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		exif_tag_set & operator= (const exif_tag_set &set);
9890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
9910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
9930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tiff_dng_extended_color_profile: private dng_tiff_directory
9950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
9960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
9980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
9990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const dng_camera_profile &fProfile;
10000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
10020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tiff_dng_extended_color_profile (const dng_camera_profile &profile);
10040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Put (dng_stream &stream,
10060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  bool includeModelRestriction = true);
10070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
10090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
10110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass tag_dng_noise_profile: public tag_data_ptr
10130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
10140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
10160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real64 fValues [2 * kMaxColorPlanes];
10180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
10200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		explicit tag_dng_noise_profile (const dng_noise_profile &profile);
10220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
10240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
10260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Enum to control the subset of metadata to save to a file.
10280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerenum dng_metadata_subset
10300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
10310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	kMetadataSubset_CopyrightOnly = 0,
10330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	kMetadataSubset_CopyrightAndContact,
10340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	kMetadataSubset_AllExceptCameraInfo,
10350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	kMetadataSubset_All,
10360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	kMetadataSubset_AllExceptLocationInfo,
10370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	kMetadataSubset_AllExceptCameraAndLocation,
10380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	kMetadataSubset_Last = kMetadataSubset_AllExceptCameraAndLocation
10400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
10420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
10440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Support for writing dng_image or dng_negative instances to a
10460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// dng_stream in TIFF or DNG format.
10470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_image_writer
10490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
10500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	friend class dng_jpeg_image;
10520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	friend class dng_jpeg_image_encode_task;
10530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	friend class dng_write_tiles_task;
10540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
10560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		enum
10580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
10590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			// Target size for buffer used to copy data to the image.
10610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			kImageBufferSize = 128 * 1024
10630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			};
10650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
10670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_image_writer ();
10690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_image_writer ();
10710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void EncodeJPEGPreview (dng_host &host,
10730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							            const dng_image &image,
10740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							            dng_jpeg_preview &preview,
10750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							            int32 quality = -1);
10760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void WriteImage (dng_host &host,
10780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						         const dng_ifd &ifd,
10790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						         dng_basic_tag_set &basic,
10800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						         dng_stream &stream,
10810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						         const dng_image &image,
10820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						         uint32 fakeChannels = 1);
10830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Write a dng_image to a dng_stream in TIFF format.
10850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
10860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param stream The dng_stream on which to write the TIFF.
10870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param image The actual image data to be written.
10880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images.
10890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param compression Must be ccUncompressed.
10900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF.
10910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param space If non-null and color space has an ICC profile, TIFF will be tagged with this
10920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// profile. No color space conversion of image data occurs.
10930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param resolution If non-NULL, TIFF will be tagged with this resolution.
10940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param thumbnail If non-NULL, will be stored in TIFF as preview image.
10950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param imageResources If non-NULL, will image resources be stored in TIFF as well.
10960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF.
10970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
10980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void WriteTIFF (dng_host &host,
10990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						dng_stream &stream,
11000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_image &image,
11010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						uint32 photometricInterpretation,
11020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						uint32 compression,
11030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						dng_negative *negative,
11040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_color_space *space = NULL,
11050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_resolution *resolution = NULL,
11060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_jpeg_preview *thumbnail = NULL,
11070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_memory_block *imageResources = NULL,
11080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						dng_metadata_subset metadataSubset = kMetadataSubset_All);
11090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void WriteTIFF (dng_host &host,
11110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						dng_stream &stream,
11120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_image &image,
11130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						uint32 photometricInterpretation = piBlackIsZero,
11140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						uint32 compression = ccUncompressed,
11150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_metadata *metadata = NULL,
11160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_color_space *space = NULL,
11170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_resolution *resolution = NULL,
11180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_jpeg_preview *thumbnail = NULL,
11190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_memory_block *imageResources = NULL,
11200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						dng_metadata_subset metadataSubset = kMetadataSubset_All);
11210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Write a dng_image to a dng_stream in TIFF format.
11230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
11240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param stream The dng_stream on which to write the TIFF.
11250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param image The actual image data to be written.
11260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images.
11270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param compression Must be ccUncompressed.
11280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF.
11290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param profileData If non-null, TIFF will be tagged with this profile. No color space conversion
11300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// of image data occurs.
11310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param profileSize The size for the profile data.
11320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param resolution If non-NULL, TIFF will be tagged with this resolution.
11330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param thumbnail If non-NULL, will be stored in TIFF as preview image.
11340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param imageResources If non-NULL, will image resources be stored in TIFF as well.
11350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF.
11360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void WriteTIFFWithProfile (dng_host &host,
11380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_stream &stream,
11390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   const dng_image &image,
11400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   uint32 photometricInterpretation,
11410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   uint32 compression,
11420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_negative *negative,
11430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   const void *profileData = NULL,
11440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   uint32 profileSize = 0,
11450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   const dng_resolution *resolution = NULL,
11460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   const dng_jpeg_preview *thumbnail = NULL,
11470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   const dng_memory_block *imageResources = NULL,
11480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_metadata_subset metadataSubset = kMetadataSubset_All);
11490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void WriteTIFFWithProfile (dng_host &host,
11510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   dng_stream &stream,
11520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   const dng_image &image,
11530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   uint32 photometricInterpretation = piBlackIsZero,
11540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   uint32 compression = ccUncompressed,
11550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   const dng_metadata *metadata = NULL,
11560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   const void *profileData = NULL,
11570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   uint32 profileSize = 0,
11580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   const dng_resolution *resolution = NULL,
11590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   const dng_jpeg_preview *thumbnail = NULL,
11600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   const dng_memory_block *imageResources = NULL,
11610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   dng_metadata_subset metadataSubset = kMetadataSubset_All);
11620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Write a dng_image to a dng_stream in DNG format.
11640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
11650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param stream The dng_stream on which to write the TIFF.
11660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param negative The image data and metadata (EXIF, IPTC, XMP) to be written.
11670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty.
11680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version.
11690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param uncompressed True to force uncompressed images. Otherwise use normal compression.
11700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void WriteDNG (dng_host &host,
11720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   dng_stream &stream,
11730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   dng_negative &negative,
11740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   const dng_preview_list *previewList = NULL,
11750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 maxBackwardVersion = dngVersion_SaveDefault,
11760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   bool uncompressed = false);
11770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Write a dng_image to a dng_stream in DNG format.
11790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
11800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param stream The dng_stream on which to write the TIFF.
11810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param negative The image data to be written.
11820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param metadata The metadata (EXIF, IPTC, XMP) to be written.
11830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty.
11840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version.
11850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param uncompressed True to force uncompressed images. Otherwise use normal compression.
11860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void WriteDNG (dng_host &host,
11880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   dng_stream &stream,
11890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   const dng_negative &negative,
11900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   const dng_metadata &metadata,
11910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   const dng_preview_list *previewList = NULL,
11920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   uint32 maxBackwardVersion = dngVersion_SaveDefault,
11930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   bool uncompressed = false);
11940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Resolve metadata conflicts and apply metadata policies in keeping
11960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// with Metadata Working Group (MWG) guidelines.
11970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
11980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void CleanUpMetadata (dng_host &host,
11990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener									  dng_metadata &metadata,
12000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener									  dng_metadata_subset metadataSubset,
12010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener									  const char *dstMIMI,
12020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener									  const char *software = NULL);
12030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
12050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual uint32 CompressedBufferSize (const dng_ifd &ifd,
12070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener											 uint32 uncompressedSize);
12080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void EncodePredictor (dng_host &host,
12100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener									  const dng_ifd &ifd,
12110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        	  dng_pixel_buffer &buffer,
12120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener									  AutoPtr<dng_memory_block> &tempBuffer);
12130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ByteSwapBuffer (dng_host &host,
12150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener									 dng_pixel_buffer &buffer);
12160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void ReorderSubTileBlocks (const dng_ifd &ifd,
12180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_pixel_buffer &buffer,
12190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   AutoPtr<dng_memory_block> &uncompressedBuffer,
12200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   AutoPtr<dng_memory_block> &subTileBlockBuffer);
12210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void WriteData (dng_host &host,
12230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								const dng_ifd &ifd,
12240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        dng_stream &stream,
12250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        dng_pixel_buffer &buffer,
12260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								AutoPtr<dng_memory_block> &compressedBuffer);
12270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void WriteTile (dng_host &host,
12290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        const dng_ifd &ifd,
12300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        dng_stream &stream,
12310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        const dng_image &image,
12320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        const dng_rect &tileArea,
12330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						        uint32 fakeChannels,
12340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								AutoPtr<dng_memory_block> &compressedBuffer,
12350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								AutoPtr<dng_memory_block> &uncompressedBuffer,
12360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								AutoPtr<dng_memory_block> &subTileBlockBuffer,
12370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								AutoPtr<dng_memory_block> &tempBuffer);
12380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
12400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
12420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif
12440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
12450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1246