10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2007-2011 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_preview.cpp#1 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 832332 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_preview.h"
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_assertions.h"
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_image.h"
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_image_writer.h"
210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_memory.h"
220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_stream.h"
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_tag_codes.h"
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_tag_values.h"
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_preview_tag_set: public dng_basic_tag_set
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fApplicationNameTag;
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fApplicationVersionTag;
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fSettingsNameTag;
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_fingerprint fSettingsDigest;
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint8_ptr fSettingsDigestTag;
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fColorSpaceTag;
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_string fDateTimeTag;
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_real64 fRawToPreviewGainTag;
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32 fCacheVersionTag;
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_preview_tag_set (dng_tiff_directory &directory,
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 const dng_preview &preview,
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 const dng_ifd &ifd);
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_preview_tag_set ();
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_preview_tag_set::dng_preview_tag_set (dng_tiff_directory &directory,
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										  const dng_preview &preview,
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										  const dng_ifd &ifd)
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	dng_basic_tag_set (directory, ifd)
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fApplicationNameTag (tcPreviewApplicationName,
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 preview.fInfo.fApplicationName,
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 false)
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fApplicationVersionTag (tcPreviewApplicationVersion,
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							    preview.fInfo.fApplicationVersion,
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								false)
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fSettingsNameTag (tcPreviewSettingsName,
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						  preview.fInfo.fSettingsName,
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						  false)
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fSettingsDigest (preview.fInfo.fSettingsDigest)
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fSettingsDigestTag (tcPreviewSettingsDigest,
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							fSettingsDigest.data,
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							16)
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fColorSpaceTag (tcPreviewColorSpace,
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						preview.fInfo.fColorSpace)
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fDateTimeTag (tcPreviewDateTime,
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  preview.fInfo.fDateTime,
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  true)
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fRawToPreviewGainTag (tcRawToPreviewGain,
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							  preview.fInfo.fRawToPreviewGain)
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fCacheVersionTag (tcCacheVersion,
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					      preview.fInfo.fCacheVersion)
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fApplicationName.NotEmpty ())
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fApplicationNameTag);
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fApplicationVersion.NotEmpty ())
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fApplicationVersionTag);
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fSettingsName.NotEmpty ())
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fSettingsNameTag);
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fSettingsDigest.IsValid ())
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fSettingsDigestTag);
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fColorSpace != previewColorSpace_MaxEnum)
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fColorSpaceTag);
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fDateTime.NotEmpty ())
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fDateTimeTag);
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fRawToPreviewGain != 1.0)
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fRawToPreviewGainTag);
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fInfo.fCacheVersion != 0)
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fCacheVersionTag);
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_preview_tag_set::~dng_preview_tag_set ()
1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_preview::dng_preview ()
1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	fInfo ()
1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_preview::~dng_preview ()
1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_image_preview::dng_image_preview ()
1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	fImage ()
1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fIFD   ()
1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_image_preview::~dng_image_preview ()
1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_basic_tag_set * dng_image_preview::AddTagSet (dng_tiff_directory &directory) const
2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fNewSubFileType = fInfo.fIsPrimary ? sfPreviewImage
2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener											: sfAltPreviewImage;
2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fImageWidth  = fImage->Width  ();
2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fImageLength = fImage->Height ();
2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fSamplesPerPixel = fImage->Planes ();
2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fPhotometricInterpretation = fIFD.fSamplesPerPixel == 1 ? piBlackIsZero
2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener																 : piRGB;
2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fBitsPerSample [0] = TagTypeSize (fImage->PixelType ()) * 8;
2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	for (uint32 j = 1; j < fIFD.fSamplesPerPixel; j++)
2210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
2220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.fBitsPerSample [j] = fIFD.fBitsPerSample [0];
2230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
2240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.SetSingleStrip ();
2260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return new dng_preview_tag_set (directory, *this, fIFD);
2280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
2300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
2320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienervoid dng_image_preview::WriteData (dng_host &host,
2340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_image_writer &writer,
2350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_basic_tag_set &basic,
2360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_stream &stream) const
2370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	writer.WriteImage (host,
2400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   fIFD,
2410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   basic,
2420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   stream,
2430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				       *fImage.Get ());
2440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
2460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
2480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_jpeg_preview_tag_set: public dng_preview_tag_set
2500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
2530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fCoefficientsData [3];
2550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fCoefficientsTag;
2570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint16 fSubSamplingData [2];
2590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16_ptr fSubSamplingTag;
2610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint16 fPositioningTag;
2630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fReferenceData [6];
2650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_urational_ptr fReferenceTag;
2670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_jpeg_preview_tag_set (dng_tiff_directory &directory,
2710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_jpeg_preview &preview,
2720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_ifd &ifd);
2730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_jpeg_preview_tag_set ();
2750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
2790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_jpeg_preview_tag_set::dng_jpeg_preview_tag_set (dng_tiff_directory &directory,
2810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener													const dng_jpeg_preview &preview,
2820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener													const dng_ifd &ifd)
2830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	dng_preview_tag_set (directory, preview, ifd)
2850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fCoefficientsTag (tcYCbCrCoefficients, fCoefficientsData, 3)
2870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fSubSamplingTag (tcYCbCrSubSampling, fSubSamplingData, 2)
2890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fPositioningTag (tcYCbCrPositioning, preview.fYCbCrPositioning)
2910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fReferenceTag (tcReferenceBlackWhite, fReferenceData, 6)
2930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fPhotometricInterpretation == piYCbCr)
2970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
2980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fCoefficientsData [0] = dng_urational (299, 1000);
3000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fCoefficientsData [1] = dng_urational (587, 1000);
3010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fCoefficientsData [2] = dng_urational (114, 1000);
3020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fCoefficientsTag);
3040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fSubSamplingData [0] = (uint16) preview.fYCbCrSubSampling.h;
3060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fSubSamplingData [1] = (uint16) preview.fYCbCrSubSampling.v;
3070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fSubSamplingTag);
3090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fPositioningTag);
3110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fReferenceData [0] = dng_urational (  0, 1);
3130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fReferenceData [1] = dng_urational (255, 1);
3140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fReferenceData [2] = dng_urational (128, 1);
3150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fReferenceData [3] = dng_urational (255, 1);
3160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fReferenceData [4] = dng_urational (128, 1);
3170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fReferenceData [5] = dng_urational (255, 1);
3180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fReferenceTag);
3200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
3220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
3240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_jpeg_preview_tag_set::~dng_jpeg_preview_tag_set ()
3280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
3310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_jpeg_preview::dng_jpeg_preview ()
3350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	fPreviewSize 			   ()
3370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fPhotometricInterpretation (piYCbCr)
3380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fYCbCrSubSampling 		   (1, 1)
3390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fYCbCrPositioning		   (2)
3400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fCompressedData			   ()
3410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
3450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_jpeg_preview::~dng_jpeg_preview ()
3490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
3520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_basic_tag_set * dng_jpeg_preview::AddTagSet (dng_tiff_directory &directory) const
3560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	dng_ifd ifd;
3590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fNewSubFileType = fInfo.fIsPrimary ? sfPreviewImage
3610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										   : sfAltPreviewImage;
3620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fImageWidth  = fPreviewSize.h;
3640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fImageLength = fPreviewSize.v;
3650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fPhotometricInterpretation = fPhotometricInterpretation;
3670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fBitsPerSample [0] = 8;
3690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fBitsPerSample [1] = 8;
3700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fBitsPerSample [2] = 8;
3710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fSamplesPerPixel = (fPhotometricInterpretation == piBlackIsZero ? 1 : 3);
3730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fCompression = ccJPEG;
3750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.fPredictor   = cpNullPredictor;
3760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	ifd.SetSingleStrip ();
3780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return new dng_jpeg_preview_tag_set (directory, *this, ifd);
3800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
3820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienervoid dng_jpeg_preview::WriteData (dng_host & /* host */,
3860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_image_writer & /* writer */,
3870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_basic_tag_set &basic,
3880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_stream &stream) const
3890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	basic.SetTileOffset (0, (uint32) stream.Position ());
3920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	basic.SetTileByteCount (0, fCompressedData->LogicalSize ());
3940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put (fCompressedData->Buffer      (),
3960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				fCompressedData->LogicalSize ());
3970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (fCompressedData->LogicalSize () & 1)
3990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
4000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		stream.Put_uint8 (0);
4010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
4020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
4040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
4060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienervoid dng_jpeg_preview::SpoolAdobeThumbnail (dng_stream &stream) const
4080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	DNG_ASSERT (fCompressedData.Get (),
4110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				"SpoolAdobeThumbnail: no data");
4120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	DNG_ASSERT (fPhotometricInterpretation == piYCbCr,
4140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				"SpoolAdobeThumbnail: Non-YCbCr");
4150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	uint32 compressedSize = fCompressedData->LogicalSize ();
4170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (DNG_CHAR4 ('8','B','I','M'));
4190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint16 (1036);
4200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint16 (0);
4210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (compressedSize + 28);
4230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	uint32 widthBytes = (fPreviewSize.h * 24 + 31) / 32 * 4;
4250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (1);
4270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (fPreviewSize.h);
4280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (fPreviewSize.v);
4290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (widthBytes);
4300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (widthBytes * fPreviewSize.v);
4310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint32 (compressedSize);
4320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint16 (24);
4330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put_uint16 (1);
4340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	stream.Put (fCompressedData->Buffer (),
4360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			    compressedSize);
4370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (compressedSize & 1)
4390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
4400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		stream.Put_uint8 (0);
4410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
4420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
4440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
4460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_raw_preview_tag_set: public dng_preview_tag_set
4480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
4510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_data_ptr fOpcodeList2Tag;
4530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		tag_uint32_ptr fWhiteLevelTag;
4550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fWhiteLevelData [kMaxColorPlanes];
4570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
4590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_raw_preview_tag_set (dng_tiff_directory &directory,
4610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 const dng_raw_preview &preview,
4620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 const dng_ifd &ifd);
4630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_raw_preview_tag_set ();
4650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
4690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_raw_preview_tag_set::dng_raw_preview_tag_set (dng_tiff_directory &directory,
4710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener												  const dng_raw_preview &preview,
4720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener												  const dng_ifd &ifd)
4730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	dng_preview_tag_set (directory, preview, ifd)
4750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fOpcodeList2Tag (tcOpcodeList2,
4770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 ttUndefined,
4780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 0,
4790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 NULL)
4800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fWhiteLevelTag (tcWhiteLevel,
4820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						fWhiteLevelData,
4830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						preview.fImage->Planes ())
4840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
4860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fOpcodeList2Data.Get ())
4880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
4890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fOpcodeList2Tag.SetData  (preview.fOpcodeList2Data->Buffer      ());
4910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fOpcodeList2Tag.SetCount (preview.fOpcodeList2Data->LogicalSize ());
4920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fOpcodeList2Tag);
4940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
4960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.fImage->PixelType () == ttFloat)
4980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
4990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		for (uint32 j = 0; j < kMaxColorPlanes; j++)
5010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
5020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fWhiteLevelData [j] = 32768;
5030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
5040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		directory.Add (&fWhiteLevelTag);
5060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
5080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
5100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
5120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_raw_preview_tag_set::~dng_raw_preview_tag_set ()
5140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
5170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
5190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_raw_preview::dng_raw_preview ()
5210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	fImage				()
5230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fOpcodeList2Data	()
5240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fCompressionQuality (-1)
5250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fIFD				()
5260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
5300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
5320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_raw_preview::~dng_raw_preview ()
5340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
5370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
5390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_basic_tag_set * dng_raw_preview::AddTagSet (dng_tiff_directory &directory) const
5410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
5420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fNewSubFileType = sfPreviewImage;
5440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fImageWidth  = fImage->Width  ();
5460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fImageLength = fImage->Height ();
5470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fSamplesPerPixel = fImage->Planes ();
5490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fPhotometricInterpretation = piLinearRaw;
5510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (fImage->PixelType () == ttFloat)
5530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
5540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.fCompression = ccDeflate;
5560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.fCompressionQuality = fCompressionQuality;
5580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.fPredictor = cpFloatingPoint;
5600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		for (uint32 j = 0; j < fIFD.fSamplesPerPixel; j++)
5620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
5630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fIFD.fBitsPerSample [j] = 16;
5640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fIFD.fSampleFormat  [j] = sfFloatingPoint;
5650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
5660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.FindTileSize (512 * 1024);
5680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
5700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	else
5720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
5730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.fCompression = ccLossyJPEG;
5750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.fCompressionQuality = fCompressionQuality;
5770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.fBitsPerSample [0] = TagTypeSize (fImage->PixelType ()) * 8;
5790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		for (uint32 j = 1; j < fIFD.fSamplesPerPixel; j++)
5810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
5820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fIFD.fBitsPerSample [j] = fIFD.fBitsPerSample [0];
5830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
5840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		fIFD.FindTileSize (512 * 512 * fIFD.fSamplesPerPixel);
5860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
5880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return new dng_raw_preview_tag_set (directory, *this, fIFD);
5900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
5920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
5940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
5950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienervoid dng_raw_preview::WriteData (dng_host &host,
5960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 dng_image_writer &writer,
5970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 dng_basic_tag_set &basic,
5980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 dng_stream &stream) const
5990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	writer.WriteImage (host,
6020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   fIFD,
6030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   basic,
6040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   stream,
6050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				       *fImage.Get ());
6060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
6080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
6100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_mask_preview::dng_mask_preview ()
6120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	fImage				()
6140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fCompressionQuality (-1)
6150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	,	fIFD				()
6160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
6200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
6220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_mask_preview::~dng_mask_preview ()
6240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
6270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
6290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_basic_tag_set * dng_mask_preview::AddTagSet (dng_tiff_directory &directory) const
6310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fNewSubFileType = sfPreviewMask;
6340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fImageWidth  = fImage->Width  ();
6360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fImageLength = fImage->Height ();
6370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fSamplesPerPixel = 1;
6390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fPhotometricInterpretation = piTransparencyMask;
6410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fCompression = ccDeflate;
6430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fPredictor   = cpHorizontalDifference;
6440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fCompressionQuality = fCompressionQuality;
6460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.fBitsPerSample [0] = TagTypeSize (fImage->PixelType ()) * 8;
6480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	fIFD.FindTileSize (512 * 512 * fIFD.fSamplesPerPixel);
6500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	return new dng_basic_tag_set (directory, fIFD);
6520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
6540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
6560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienervoid dng_mask_preview::WriteData (dng_host &host,
6580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_image_writer &writer,
6590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_basic_tag_set &basic,
6600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_stream &stream) const
6610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	writer.WriteImage (host,
6640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   fIFD,
6650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   basic,
6660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   stream,
6670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				       *fImage.Get ());
6680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
6700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
6720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_preview_list::dng_preview_list ()
6740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	:	fCount (0)
6760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
6800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
6820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerdng_preview_list::~dng_preview_list ()
6840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
6870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
6890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienervoid dng_preview_list::Append (AutoPtr<dng_preview> &preview)
6910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
6920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	if (preview.Get ())
6940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		{
6950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		DNG_ASSERT (fCount < kMaxDNGPreviews, "DNG preview list overflow");
6970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
6980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		if (fCount < kMaxDNGPreviews)
6990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
7000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fPreview [fCount++] . Reset (preview.Release ());
7020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
7040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		}
7060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	}
7080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
7090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
710