1/*****************************************************************************/
2// Copyright 2006-2012 Adobe Systems Incorporated
3// All Rights Reserved.
4//
5// NOTICE:  Adobe permits you to use, modify, and distribute this file in
6// accordance with the terms of the Adobe license agreement accompanying it.
7/*****************************************************************************/
8
9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_ifd.h#3 $ */
10/* $DateTime: 2012/06/05 11:05:39 $ */
11/* $Change: 833352 $ */
12/* $Author: tknoll $ */
13
14/** \file
15 *  DNG image file directory support.
16 */
17
18/*****************************************************************************/
19
20#ifndef __dng_ifd__
21#define __dng_ifd__
22
23/*****************************************************************************/
24
25#include "dng_fingerprint.h"
26#include "dng_rect.h"
27#include "dng_shared.h"
28#include "dng_stream.h"
29#include "dng_string.h"
30#include "dng_sdk_limits.h"
31#include "dng_tag_values.h"
32
33/*****************************************************************************/
34
35class dng_preview_info
36	{
37
38	public:
39
40		bool fIsPrimary;
41
42		dng_string fApplicationName;
43
44		dng_string fApplicationVersion;
45
46		dng_string fSettingsName;
47
48		dng_fingerprint fSettingsDigest;
49
50		PreviewColorSpaceEnum fColorSpace;
51
52		dng_string fDateTime;
53
54		real64 fRawToPreviewGain;
55
56		uint32 fCacheVersion;
57
58	public:
59
60		dng_preview_info ();
61
62		~dng_preview_info ();
63
64	};
65
66/*****************************************************************************/
67
68/// \brief Container for a single image file directory of a digital negative.
69///
70/// See \ref spec_dng "DNG 1.1.0 specification" for documentation of specific tags.
71
72class dng_ifd
73	{
74
75	public:
76
77		bool fUsesNewSubFileType;
78
79		uint32 fNewSubFileType;
80
81		uint32 fImageWidth;
82		uint32 fImageLength;
83
84		uint32 fBitsPerSample [kMaxSamplesPerPixel];
85
86		uint32 fCompression;
87
88		uint32 fPredictor;
89
90		uint32 fPhotometricInterpretation;
91
92		uint32 fFillOrder;
93
94		uint32 fOrientation;
95		uint32 fOrientationType;
96		uint64 fOrientationOffset;
97		bool   fOrientationBigEndian;
98
99		uint32 fSamplesPerPixel;
100
101		uint32 fPlanarConfiguration;
102
103		real64 fXResolution;
104		real64 fYResolution;
105
106		uint32 fResolutionUnit;
107
108		bool fUsesStrips;
109		bool fUsesTiles;
110
111		uint32 fTileWidth;
112		uint32 fTileLength;
113
114		enum
115			{
116			kMaxTileInfo = 32
117			};
118
119		uint32 fTileOffsetsType;
120		uint32 fTileOffsetsCount;
121		uint64 fTileOffsetsOffset;
122		uint64 fTileOffset [kMaxTileInfo];
123
124		uint32 fTileByteCountsType;
125		uint32 fTileByteCountsCount;
126		uint64 fTileByteCountsOffset;
127		uint32 fTileByteCount [kMaxTileInfo];
128
129		uint32 fSubIFDsCount;
130		uint64 fSubIFDsOffset;
131
132		uint32 fExtraSamplesCount;
133		uint32 fExtraSamples [kMaxSamplesPerPixel];
134
135		uint32 fSampleFormat [kMaxSamplesPerPixel];
136
137		uint32 fJPEGTablesCount;
138		uint64 fJPEGTablesOffset;
139
140		uint64 fJPEGInterchangeFormat;
141		uint32 fJPEGInterchangeFormatLength;
142
143		real64 fYCbCrCoefficientR;
144		real64 fYCbCrCoefficientG;
145		real64 fYCbCrCoefficientB;
146
147		uint32 fYCbCrSubSampleH;
148		uint32 fYCbCrSubSampleV;
149
150		uint32 fYCbCrPositioning;
151
152		real64 fReferenceBlackWhite [6];
153
154		uint32 fCFARepeatPatternRows;
155		uint32 fCFARepeatPatternCols;
156
157		uint8 fCFAPattern [kMaxCFAPattern] [kMaxCFAPattern];
158
159		uint8 fCFAPlaneColor [kMaxColorPlanes];
160
161		uint32 fCFALayout;
162
163		uint32 fLinearizationTableType;
164		uint32 fLinearizationTableCount;
165		uint64 fLinearizationTableOffset;
166
167		uint32 fBlackLevelRepeatRows;
168		uint32 fBlackLevelRepeatCols;
169
170		real64 fBlackLevel [kMaxBlackPattern] [kMaxBlackPattern] [kMaxSamplesPerPixel];
171
172		uint32 fBlackLevelDeltaHType;
173		uint32 fBlackLevelDeltaHCount;
174		uint64 fBlackLevelDeltaHOffset;
175
176		uint32 fBlackLevelDeltaVType;
177		uint32 fBlackLevelDeltaVCount;
178		uint64 fBlackLevelDeltaVOffset;
179
180		real64 fWhiteLevel [kMaxSamplesPerPixel];
181
182		dng_urational fDefaultScaleH;
183		dng_urational fDefaultScaleV;
184
185		dng_urational fBestQualityScale;
186
187		dng_urational fDefaultCropOriginH;
188		dng_urational fDefaultCropOriginV;
189
190		dng_urational fDefaultCropSizeH;
191		dng_urational fDefaultCropSizeV;
192
193		dng_urational fDefaultUserCropT;
194		dng_urational fDefaultUserCropL;
195		dng_urational fDefaultUserCropB;
196		dng_urational fDefaultUserCropR;
197
198		uint32 fBayerGreenSplit;
199
200		dng_urational fChromaBlurRadius;
201
202		dng_urational fAntiAliasStrength;
203
204		dng_rect fActiveArea;
205
206		uint32   fMaskedAreaCount;
207		dng_rect fMaskedArea [kMaxMaskedAreas];
208
209		uint32 fRowInterleaveFactor;
210
211		uint32 fSubTileBlockRows;
212		uint32 fSubTileBlockCols;
213
214		dng_preview_info fPreviewInfo;
215
216		uint32 fOpcodeList1Count;
217		uint64 fOpcodeList1Offset;
218
219		uint32 fOpcodeList2Count;
220		uint64 fOpcodeList2Offset;
221
222		uint32 fOpcodeList3Count;
223		uint64 fOpcodeList3Offset;
224
225		bool fLosslessJPEGBug16;
226
227		uint32 fSampleBitShift;
228
229		uint64 fThisIFD;
230		uint64 fNextIFD;
231
232		int32 fCompressionQuality;
233
234		bool fPatchFirstJPEGByte;
235
236	public:
237
238		dng_ifd ();
239
240		virtual ~dng_ifd ();
241
242		virtual bool ParseTag (dng_stream &stream,
243							   uint32 parentCode,
244							   uint32 tagCode,
245							   uint32 tagType,
246							   uint32 tagCount,
247							   uint64 tagOffset);
248
249		virtual void PostParse ();
250
251		virtual bool IsValidDNG (dng_shared &shared,
252								 uint32 parentCode);
253
254		dng_rect Bounds () const
255			{
256			return dng_rect (0,
257							 0,
258							 fImageLength,
259							 fImageWidth);
260			}
261
262		uint32 TilesAcross () const;
263
264		uint32 TilesDown () const;
265
266		uint32 TilesPerImage () const;
267
268		dng_rect TileArea (uint32 rowIndex,
269						   uint32 colIndex) const;
270
271		virtual uint32 TileByteCount (const dng_rect &tile) const;
272
273		void SetSingleStrip ();
274
275		void FindTileSize (uint32 bytesPerTile = 128 * 1024,
276						   uint32 cellH = 16,
277						   uint32 cellV = 16);
278
279		void FindStripSize (uint32 bytesPerStrip = 128 * 1024,
280						    uint32 cellV = 16);
281
282		virtual uint32 PixelType () const;
283
284		virtual bool IsBaselineJPEG () const;
285
286		virtual bool CanRead () const;
287
288		virtual void ReadImage (dng_host &host,
289								dng_stream &stream,
290								dng_image &image,
291								dng_jpeg_image *jpegImage = NULL,
292								dng_fingerprint *jpegDigest = NULL) const;
293
294	protected:
295
296		virtual bool IsValidCFA (dng_shared &shared,
297					      		 uint32 parentCode);
298
299	};
300
301/*****************************************************************************/
302
303#endif
304
305/*****************************************************************************/
306