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