• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_image_writer.h#3 $ */
10 /* $DateTime: 2012/07/31 22:04:34 $ */
11 /* $Change: 840853 $ */
12 /* $Author: tknoll $ */
13 
14 /** \file
15  * Support for writing DNG images to files.
16  */
17 
18 /*****************************************************************************/
19 
20 #ifndef __dng_image_writer__
21 #define __dng_image_writer__
22 
23 /*****************************************************************************/
24 
25 #include "dng_auto_ptr.h"
26 #include "dng_classes.h"
27 #include "dng_fingerprint.h"
28 #include "dng_memory.h"
29 #include "dng_point.h"
30 #include "dng_rational.h"
31 #include "dng_sdk_limits.h"
32 #include "dng_string.h"
33 #include "dng_tag_types.h"
34 #include "dng_tag_values.h"
35 #include "dng_types.h"
36 
37 /*****************************************************************************/
38 
39 /// \brief Image resolution.
40 
41 class dng_resolution
42 	{
43 
44 	public:
45 
46 		dng_urational fXResolution;
47 		dng_urational fYResolution;
48 
49 		uint16 fResolutionUnit;
50 
51 	public:
52 
53 		dng_resolution ();
54 
55 	};
56 
57 /*****************************************************************************/
58 
59 class tiff_tag
60 	{
61 
62 	protected:
63 
64 		uint16 fCode;
65 
66 		uint16 fType;
67 
68 		uint32 fCount;
69 
70 	protected:
71 
tiff_tag(uint16 code,uint16 type,uint32 count)72 		tiff_tag (uint16 code,
73 				  uint16 type,
74 				  uint32 count)
75 
76 			:	fCode  (code)
77 			,	fType  (type)
78 			,	fCount (count)
79 
80 			{
81 			}
82 
83 	public:
84 
~tiff_tag()85 		virtual ~tiff_tag ()
86 			{
87 			}
88 
Code()89 		uint16 Code () const
90 			{
91 			return fCode;
92 			}
93 
Type()94 		uint16 Type () const
95 			{
96 			return fType;
97 			}
98 
Count()99 		uint32 Count () const
100 			{
101 			return fCount;
102 			}
103 
SetCount(uint32 count)104 		void SetCount (uint32 count)
105 			{
106 			fCount = count;
107 			}
108 
Size()109 		uint32 Size () const
110 			{
111 			return TagTypeSize (Type ()) * Count ();
112 			}
113 
114 		virtual void Put (dng_stream &stream) const = 0;
115 
116 	private:
117 
118 		// Hidden copy constructor and assignment operator.
119 
120 		tiff_tag (const tiff_tag &tag);
121 
122 		tiff_tag & operator= (const tiff_tag &tag);
123 
124 	};
125 
126 /******************************************************************************/
127 
128 class tag_data_ptr: public tiff_tag
129 	{
130 
131 	protected:
132 
133 		const void *fData;
134 
135 	public:
136 
tag_data_ptr(uint16 code,uint16 type,uint32 count,const void * data)137 		tag_data_ptr (uint16 code,
138 				      uint16 type,
139 				      uint32 count,
140 				      const void *data)
141 
142 			:	tiff_tag (code, type, count)
143 
144 			,	fData (data)
145 
146 			{
147 			}
148 
SetData(const void * data)149 		void SetData (const void *data)
150 			{
151 			fData = data;
152 			}
153 
154 		virtual void Put (dng_stream &stream) const;
155 
156 	private:
157 
158 		// Hidden copy constructor and assignment operator.
159 
160 		tag_data_ptr (const tag_data_ptr &tag);
161 
162 		tag_data_ptr & operator= (const tag_data_ptr &tag);
163 
164 	};
165 
166 /******************************************************************************/
167 
168 class tag_string: public tiff_tag
169 	{
170 
171 	protected:
172 
173 		dng_string fString;
174 
175 	public:
176 
177 		tag_string (uint16 code,
178 				    const dng_string &s,
179 				    bool forceASCII = true);
180 
181 		virtual void Put (dng_stream &stream) const;
182 
183 	};
184 
185 /******************************************************************************/
186 
187 class tag_encoded_text: public tiff_tag
188 	{
189 
190 	private:
191 
192 		dng_string fText;
193 
194 		dng_memory_data fUTF16;
195 
196 	public:
197 
198 		tag_encoded_text (uint16 code,
199 						  const dng_string &text);
200 
201 		virtual void Put (dng_stream &stream) const;
202 
203 	};
204 
205 /******************************************************************************/
206 
207 class tag_uint8: public tag_data_ptr
208 	{
209 
210 	private:
211 
212 		uint8 fValue;
213 
214 	public:
215 
216 		tag_uint8 (uint16 code,
217 				   uint8 value = 0)
218 
219 			:	tag_data_ptr (code, ttByte, 1, &fValue)
220 
221 			,	fValue (value)
222 
223 			{
224 			}
225 
Set(uint8 value)226 		void Set (uint8 value)
227 			{
228 			fValue = value;
229 			}
230 
231 	};
232 
233 /******************************************************************************/
234 
235 class tag_uint8_ptr: public tag_data_ptr
236 	{
237 
238 	public:
239 
240 		tag_uint8_ptr (uint16 code,
241 			    	   const uint8 *data,
242 			    	   uint32 count = 1)
243 
tag_data_ptr(code,ttByte,count,data)244 			:	tag_data_ptr (code, ttByte, count, data)
245 
246 			{
247 			}
248 
249 	};
250 
251 /******************************************************************************/
252 
253 class tag_uint16: public tag_data_ptr
254 	{
255 
256 	private:
257 
258 		uint16 fValue;
259 
260 	public:
261 
262 		tag_uint16 (uint16 code,
263 					uint16 value = 0)
264 
265 			:	tag_data_ptr (code, ttShort, 1, &fValue)
266 
267 			,	fValue (value)
268 
269 			{
270 			}
271 
Set(uint16 value)272 		void Set (uint16 value)
273 			{
274 			fValue = value;
275 			}
276 
277 	};
278 
279 /******************************************************************************/
280 
281 class tag_int16_ptr: public tag_data_ptr
282 	{
283 
284 	public:
285 
286 		tag_int16_ptr (uint16 code,
287 				       const int16 *data,
288 				       uint32 count = 1)
289 
tag_data_ptr(code,ttSShort,count,data)290 			:	tag_data_ptr (code, ttSShort, count, data)
291 
292 			{
293 			}
294 
295 	};
296 
297 /******************************************************************************/
298 
299 class tag_uint16_ptr: public tag_data_ptr
300 	{
301 
302 	public:
303 
304 		tag_uint16_ptr (uint16 code,
305 				        const uint16 *data,
306 				        uint32 count = 1)
307 
tag_data_ptr(code,ttShort,count,data)308 			:	tag_data_ptr (code, ttShort, count, data)
309 
310 			{
311 			}
312 
313 	};
314 
315 /******************************************************************************/
316 
317 class tag_uint32: public tag_data_ptr
318 	{
319 
320 	private:
321 
322 		uint32 fValue;
323 
324 	public:
325 
326 		tag_uint32 (uint16 code,
327 				    uint32 value = 0)
328 
329 			:	tag_data_ptr (code, ttLong, 1, &fValue)
330 
331 			,	fValue (value)
332 
333 			{
334 			}
335 
Set(uint32 value)336 		void Set (uint32 value)
337 			{
338 			fValue = value;
339 			}
340 
341 	};
342 
343 /******************************************************************************/
344 
345 class tag_uint32_ptr: public tag_data_ptr
346 	{
347 
348 	public:
349 
350 		tag_uint32_ptr (uint16 code,
351 				 		const uint32 *data,
352 				 		uint32 count = 1)
353 
tag_data_ptr(code,ttLong,count,data)354 			:	tag_data_ptr (code, ttLong, count, data)
355 
356 			{
357 			}
358 
359 	};
360 
361 /******************************************************************************/
362 
363 class tag_urational: public tag_data_ptr
364 	{
365 
366 	private:
367 
368 		const dng_urational fValue;
369 
370 	public:
371 
tag_urational(uint16 code,const dng_urational & value)372 		tag_urational (uint16 code,
373 				       const dng_urational &value)
374 
375 			:	tag_data_ptr (code, ttRational, 1, &fValue)
376 
377 			,	fValue (value)
378 
379 			{
380 			}
381 
382 	};
383 
384 /******************************************************************************/
385 
386 class tag_urational_ptr: public tag_data_ptr
387 	{
388 
389 	public:
390 
391 		tag_urational_ptr (uint16 code,
392 				           const dng_urational *data = NULL,
393 				           uint32 count = 1)
394 
tag_data_ptr(code,ttRational,count,data)395 			:	tag_data_ptr (code, ttRational, count, data)
396 
397 			{
398 			}
399 
400 	};
401 
402 /******************************************************************************/
403 
404 class tag_srational: public tag_data_ptr
405 	{
406 
407 	private:
408 
409 		const dng_srational fValue;
410 
411 	public:
412 
tag_srational(uint16 code,const dng_srational & value)413 		tag_srational (uint16 code,
414 				       const dng_srational &value)
415 
416 			:	tag_data_ptr (code, ttSRational, 1, &fValue)
417 
418 			,	fValue (value)
419 
420 			{
421 			}
422 
423 	};
424 
425 /******************************************************************************/
426 
427 class tag_srational_ptr: public tag_data_ptr
428 	{
429 
430 	public:
431 
432 		tag_srational_ptr (uint16 code,
433 				           const dng_srational *data = NULL,
434 				           uint32 count = 1)
435 
tag_data_ptr(code,ttSRational,count,data)436 			:	tag_data_ptr (code, ttSRational, count, data)
437 
438 			{
439 			}
440 
441 	};
442 
443 /******************************************************************************/
444 
445 class tag_real64: public tag_data_ptr
446 	{
447 
448 	private:
449 
450 		real64 fValue;
451 
452 	public:
453 
454 		tag_real64 (uint16 code,
455 				    real64 value = 0.0)
456 
457 			:	tag_data_ptr (code, ttDouble, 1, &fValue)
458 
459 			,	fValue (value)
460 
461 			{
462 			}
463 
Set(real64 value)464 		void Set (real64 value)
465 			{
466 			fValue = value;
467 			}
468 
469 	};
470 
471 /******************************************************************************/
472 
473 class tag_matrix: public tag_srational_ptr
474 	{
475 
476 	private:
477 
478 		dng_srational fEntry [kMaxColorPlanes *
479 							  kMaxColorPlanes];
480 
481 	public:
482 
483 		tag_matrix (uint16 code,
484 				    const dng_matrix &m);
485 
486 	};
487 
488 /******************************************************************************/
489 
490 class tag_icc_profile: public tag_data_ptr
491 	{
492 
493 	public:
494 
495 		tag_icc_profile (const void *profileData, uint32 profileSize);
496 
497 	};
498 
499 /******************************************************************************/
500 
501 class tag_cfa_pattern: public tiff_tag
502 	{
503 
504 	private:
505 
506 		uint32 fRows;
507 		uint32 fCols;
508 
509 		const uint8 *fPattern;
510 
511 	public:
512 
tag_cfa_pattern(uint16 code,uint32 rows,uint32 cols,const uint8 * pattern)513 		tag_cfa_pattern (uint16 code,
514 					   	 uint32 rows,
515 					     uint32 cols,
516 					   	 const uint8 *pattern)
517 
518 			:	tiff_tag (code, ttUndefined, 4 + rows * cols)
519 
520 			,	fRows    (rows   )
521 			,	fCols    (cols   )
522 			,	fPattern (pattern)
523 
524 			{
525 			}
526 
527 		virtual void Put (dng_stream &stream) const;
528 
529 	private:
530 
531 		// Hidden copy constructor and assignment operator.
532 
533 		tag_cfa_pattern (const tag_cfa_pattern &tag);
534 
535 		tag_cfa_pattern & operator= (const tag_cfa_pattern &tag);
536 
537 	};
538 
539 /******************************************************************************/
540 
541 class tag_exif_date_time: public tag_data_ptr
542 	{
543 
544 	private:
545 
546 		char fData [20];
547 
548 	public:
549 
550 		tag_exif_date_time (uint16 code,
551 				            const dng_date_time &dt);
552 
553 	};
554 
555 /******************************************************************************/
556 
557 class tag_iptc: public tiff_tag
558 	{
559 
560 	private:
561 
562 		const void *fData;
563 
564 		uint32 fLength;
565 
566 	public:
567 
568 		tag_iptc (const void *data,
569 				  uint32 length);
570 
571 		virtual void Put (dng_stream &stream) const;
572 
573 	private:
574 
575 		// Hidden copy constructor and assignment operator.
576 
577 		tag_iptc (const tag_iptc &tag);
578 
579 		tag_iptc & operator= (const tag_iptc &tag);
580 
581 	};
582 
583 /******************************************************************************/
584 
585 class tag_xmp: public tag_uint8_ptr
586 	{
587 
588 	private:
589 
590 		AutoPtr<dng_memory_block> fBuffer;
591 
592 	public:
593 
594 		tag_xmp (const dng_xmp *xmp);
595 
596 	private:
597 
598 		// Hidden copy constructor and assignment operator.
599 
600 		tag_xmp (const tag_xmp &tag);
601 
602 		tag_xmp & operator= (const tag_xmp &tag);
603 
604 	};
605 
606 /******************************************************************************/
607 
608 class dng_tiff_directory
609 	{
610 
611 	private:
612 
613 		enum
614 			{
615 			kMaxEntries = 100
616 			};
617 
618 		uint32 fEntries;
619 
620 		const tiff_tag *fTag [kMaxEntries];
621 
622 		uint32 fChained;
623 
624 	public:
625 
dng_tiff_directory()626 		dng_tiff_directory ()
627 
628 			:	fEntries (0)
629 			,	fChained (0)
630 
631 			{
632 			}
633 
~dng_tiff_directory()634 		virtual ~dng_tiff_directory ()
635 			{
636 			}
637 
638 		void Add (const tiff_tag *tag);
639 
SetChained(uint32 offset)640 		void SetChained (uint32 offset)
641 			{
642 			fChained = offset;
643 			}
644 
645 		uint32 Size () const;
646 
647 		enum OffsetsBase
648 			{
649 			offsetsRelativeToStream			= 0,
650 			offsetsRelativeToExplicitBase	= 1,
651 			offsetsRelativeToIFD			= 2
652 			};
653 
654 		void Put (dng_stream &stream,
655 				  OffsetsBase offsetsBase = offsetsRelativeToStream,
656 				  uint32 explicitBase = 0) const;
657 
658 	private:
659 
660 		// Hidden copy constructor and assignment operator.
661 
662 		dng_tiff_directory (const dng_tiff_directory &dir);
663 
664 		dng_tiff_directory & operator= (const dng_tiff_directory &dir);
665 
666 	};
667 
668 /******************************************************************************/
669 
670 class dng_basic_tag_set
671 	{
672 
673 	private:
674 
675 		tag_uint32 fNewSubFileType;
676 
677 		tag_uint32 fImageWidth;
678 		tag_uint32 fImageLength;
679 
680 		tag_uint16 fPhotoInterpretation;
681 
682 		tag_uint16 fFillOrder;
683 
684 		tag_uint16 fSamplesPerPixel;
685 
686 		uint16 fBitsPerSampleData [kMaxSamplesPerPixel];
687 
688 		tag_uint16_ptr fBitsPerSample;
689 
690 		bool fStrips;
691 
692 		tag_uint32 fTileWidth;
693 		tag_uint32 fTileLength;
694 
695 		dng_memory_data fTileInfoBuffer;
696 
697 		uint32 *fTileOffsetData;
698 
699 		tag_uint32_ptr fTileOffsets;
700 
701 		uint32 *fTileByteCountData;
702 
703 		tag_uint32_ptr fTileByteCounts;
704 
705 		tag_uint16 fPlanarConfiguration;
706 
707 		tag_uint16 fCompression;
708 
709 		tag_uint16 fPredictor;
710 
711 		uint16 fExtraSamplesData [kMaxSamplesPerPixel];
712 
713 		tag_uint16_ptr fExtraSamples;
714 
715 		uint16 fSampleFormatData [kMaxSamplesPerPixel];
716 
717 		tag_uint16_ptr fSampleFormat;
718 
719 		tag_uint16 fRowInterleaveFactor;
720 
721 		uint16 fSubTileBlockSizeData [2];
722 
723 		tag_uint16_ptr fSubTileBlockSize;
724 
725 	public:
726 
727 		dng_basic_tag_set (dng_tiff_directory &directory,
728 					       const dng_ifd &info);
729 
~dng_basic_tag_set()730 		virtual ~dng_basic_tag_set ()
731 			{
732 			}
733 
SetTileOffset(uint32 index,uint32 offset)734 		void SetTileOffset (uint32 index,
735 							uint32 offset)
736 			{
737 			fTileOffsetData [index] = offset;
738 			}
739 
SetTileByteCount(uint32 index,uint32 count)740 		void SetTileByteCount (uint32 index,
741 							   uint32 count)
742 			{
743 			fTileByteCountData [index] = count;
744 			}
745 
WritingStrips()746 		bool WritingStrips () const
747 			{
748 			return fStrips;
749 			}
750 
751 	private:
752 
753 		// Hidden copy constructor and assignment operator.
754 
755 		dng_basic_tag_set (const dng_basic_tag_set &set);
756 
757 		dng_basic_tag_set & operator= (const dng_basic_tag_set &set);
758 
759 	};
760 
761 /******************************************************************************/
762 
763 class exif_tag_set
764 	{
765 
766 	protected:
767 
768 		dng_tiff_directory fExifIFD;
769 		dng_tiff_directory fGPSIFD;
770 
771 	private:
772 
773 		tag_uint32 fExifLink;
774 		tag_uint32 fGPSLink;
775 
776 		bool fAddedExifLink;
777 		bool fAddedGPSLink;
778 
779 		uint8 fExifVersionData [4];
780 
781 		tag_data_ptr fExifVersion;
782 
783 		tag_urational fExposureTime;
784 		tag_srational fShutterSpeedValue;
785 
786 		tag_urational fFNumber;
787 		tag_urational fApertureValue;
788 
789 		tag_srational fBrightnessValue;
790 
791 		tag_srational fExposureBiasValue;
792 
793 		tag_urational fMaxApertureValue;
794 
795 		tag_urational fSubjectDistance;
796 
797 		tag_urational fFocalLength;
798 
799 		tag_uint16 fISOSpeedRatings;
800 
801 		tag_uint16 fSensitivityType;
802 		tag_uint32 fStandardOutputSensitivity;
803 		tag_uint32 fRecommendedExposureIndex;
804 		tag_uint32 fISOSpeed;
805 		tag_uint32 fISOSpeedLatitudeyyy;
806 		tag_uint32 fISOSpeedLatitudezzz;
807 
808 		tag_uint16 fFlash;
809 
810 		tag_uint16 fExposureProgram;
811 
812 		tag_uint16 fMeteringMode;
813 
814 		tag_uint16 fLightSource;
815 
816 		tag_uint16 fSensingMethod;
817 
818 		tag_uint16 fFocalLength35mm;
819 
820 		uint8 fFileSourceData;
821 		tag_data_ptr fFileSource;
822 
823 		uint8 fSceneTypeData;
824 		tag_data_ptr fSceneType;
825 
826 		tag_cfa_pattern fCFAPattern;
827 
828 		tag_uint16 fCustomRendered;
829 		tag_uint16 fExposureMode;
830 		tag_uint16 fWhiteBalance;
831 		tag_uint16 fSceneCaptureType;
832 		tag_uint16 fGainControl;
833 		tag_uint16 fContrast;
834 		tag_uint16 fSaturation;
835 		tag_uint16 fSharpness;
836 		tag_uint16 fSubjectDistanceRange;
837 
838 		tag_urational fDigitalZoomRatio;
839 
840 		tag_urational fExposureIndex;
841 
842 		tag_uint32 fImageNumber;
843 
844 		tag_uint16 fSelfTimerMode;
845 
846 		tag_string    fBatteryLevelA;
847 		tag_urational fBatteryLevelR;
848 
849 		tag_urational fFocalPlaneXResolution;
850 		tag_urational fFocalPlaneYResolution;
851 
852 		tag_uint16 fFocalPlaneResolutionUnit;
853 
854 		uint16 fSubjectAreaData [4];
855 
856 		tag_uint16_ptr fSubjectArea;
857 
858 		dng_urational fLensInfoData [4];
859 
860 		tag_urational_ptr fLensInfo;
861 
862 		tag_exif_date_time fDateTime;
863 		tag_exif_date_time fDateTimeOriginal;
864 		tag_exif_date_time fDateTimeDigitized;
865 
866 		tag_string fSubsecTime;
867 		tag_string fSubsecTimeOriginal;
868 		tag_string fSubsecTimeDigitized;
869 
870 		tag_string fMake;
871 		tag_string fModel;
872 		tag_string fArtist;
873 		tag_string fSoftware;
874 		tag_string fCopyright;
875 		tag_string fImageDescription;
876 
877 		tag_string fSerialNumber;
878 
879 		tag_uint16 fMakerNoteSafety;
880 
881 		tag_data_ptr fMakerNote;
882 
883 		tag_encoded_text fUserComment;
884 
885 		char fImageUniqueIDData [33];
886 
887 		tag_data_ptr fImageUniqueID;
888 
889 		// EXIF 2.3 tags.
890 
891 		tag_string fCameraOwnerName;
892 		tag_string fBodySerialNumber;
893 		tag_urational_ptr fLensSpecification;
894 		tag_string fLensMake;
895 		tag_string fLensModel;
896 		tag_string fLensSerialNumber;
897 
898 		uint8 fGPSVersionData [4];
899 
900 		tag_uint8_ptr fGPSVersionID;
901 
902 		tag_string        fGPSLatitudeRef;
903 		tag_urational_ptr fGPSLatitude;
904 
905 		tag_string        fGPSLongitudeRef;
906 		tag_urational_ptr fGPSLongitude;
907 
908 		tag_uint8     fGPSAltitudeRef;
909 		tag_urational fGPSAltitude;
910 
911 		tag_urational_ptr fGPSTimeStamp;
912 
913 		tag_string fGPSSatellites;
914 		tag_string fGPSStatus;
915 		tag_string fGPSMeasureMode;
916 
917 		tag_urational fGPSDOP;
918 
919 		tag_string    fGPSSpeedRef;
920 		tag_urational fGPSSpeed;
921 
922 		tag_string    fGPSTrackRef;
923 		tag_urational fGPSTrack;
924 
925 		tag_string    fGPSImgDirectionRef;
926 		tag_urational fGPSImgDirection;
927 
928 		tag_string fGPSMapDatum;
929 
930 		tag_string        fGPSDestLatitudeRef;
931 		tag_urational_ptr fGPSDestLatitude;
932 
933 		tag_string         fGPSDestLongitudeRef;
934 		tag_urational_ptr fGPSDestLongitude;
935 
936 		tag_string    fGPSDestBearingRef;
937 		tag_urational fGPSDestBearing;
938 
939 		tag_string    fGPSDestDistanceRef;
940 		tag_urational fGPSDestDistance;
941 
942 		tag_encoded_text fGPSProcessingMethod;
943 		tag_encoded_text fGPSAreaInformation;
944 
945 		tag_string fGPSDateStamp;
946 
947 		tag_uint16 fGPSDifferential;
948 
949 		tag_urational fGPSHPositioningError;
950 
951 	public:
952 
953 		exif_tag_set (dng_tiff_directory &directory,
954 					  const dng_exif &exif,
955 					  bool makerNoteSafe = false,
956 					  const void *makerNoteData = NULL,
957 					  uint32 makerNoteLength = 0,
958 					  bool insideDNG = false);
959 
Locate(uint32 offset)960 		void Locate (uint32 offset)
961 			{
962 			fExifLink.Set (offset);
963 			fGPSLink .Set (offset + fExifIFD.Size ());
964 			}
965 
Size()966 		uint32 Size () const
967 			{
968 			return fExifIFD.Size () +
969 				   fGPSIFD .Size ();
970 			}
971 
Put(dng_stream & stream)972 		void Put (dng_stream &stream) const
973 			{
974 			fExifIFD.Put (stream);
975 			fGPSIFD .Put (stream);
976 			}
977 
978 	protected:
979 
980 		void AddLinks (dng_tiff_directory &directory);
981 
982 	private:
983 
984 		// Hidden copy constructor and assignment operator.
985 
986 		exif_tag_set (const exif_tag_set &set);
987 
988 		exif_tag_set & operator= (const exif_tag_set &set);
989 
990 	};
991 
992 /******************************************************************************/
993 
994 class tiff_dng_extended_color_profile: private dng_tiff_directory
995 	{
996 
997 	protected:
998 
999 		const dng_camera_profile &fProfile;
1000 
1001 	public:
1002 
1003 		tiff_dng_extended_color_profile (const dng_camera_profile &profile);
1004 
1005 		void Put (dng_stream &stream,
1006 				  bool includeModelRestriction = true);
1007 
1008 	};
1009 
1010 /*****************************************************************************/
1011 
1012 class tag_dng_noise_profile: public tag_data_ptr
1013 	{
1014 
1015 	protected:
1016 
1017 		real64 fValues [2 * kMaxColorPlanes];
1018 
1019 	public:
1020 
1021 		explicit tag_dng_noise_profile (const dng_noise_profile &profile);
1022 
1023 	};
1024 
1025 /*****************************************************************************/
1026 
1027 // Enum to control the subset of metadata to save to a file.
1028 
1029 enum dng_metadata_subset
1030 	{
1031 
1032 	kMetadataSubset_CopyrightOnly = 0,
1033 	kMetadataSubset_CopyrightAndContact,
1034 	kMetadataSubset_AllExceptCameraInfo,
1035 	kMetadataSubset_All,
1036 	kMetadataSubset_AllExceptLocationInfo,
1037 	kMetadataSubset_AllExceptCameraAndLocation,
1038 
1039 	kMetadataSubset_Last = kMetadataSubset_AllExceptCameraAndLocation
1040 
1041 	};
1042 
1043 /*****************************************************************************/
1044 
1045 /// \brief Support for writing dng_image or dng_negative instances to a
1046 /// dng_stream in TIFF or DNG format.
1047 
1048 class dng_image_writer
1049 	{
1050 
1051 	friend class dng_jpeg_image;
1052 	friend class dng_jpeg_image_encode_task;
1053 	friend class dng_write_tiles_task;
1054 
1055 	protected:
1056 
1057 		enum
1058 			{
1059 
1060 			// Target size for buffer used to copy data to the image.
1061 
1062 			kImageBufferSize = 128 * 1024
1063 
1064 			};
1065 
1066 	public:
1067 
1068 		dng_image_writer ();
1069 
1070 		virtual ~dng_image_writer ();
1071 
1072 		virtual void EncodeJPEGPreview (dng_host &host,
1073 							            const dng_image &image,
1074 							            dng_jpeg_preview &preview,
1075 							            int32 quality = -1);
1076 
1077 		virtual void WriteImage (dng_host &host,
1078 						         const dng_ifd &ifd,
1079 						         dng_basic_tag_set &basic,
1080 						         dng_stream &stream,
1081 						         const dng_image &image,
1082 						         uint32 fakeChannels = 1);
1083 
1084 		/// Write a dng_image to a dng_stream in TIFF format.
1085 		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
1086 		/// \param stream The dng_stream on which to write the TIFF.
1087 		/// \param image The actual image data to be written.
1088 		/// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images.
1089 		/// \param compression Must be ccUncompressed.
1090 		/// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF.
1091 		/// \param space If non-null and color space has an ICC profile, TIFF will be tagged with this
1092 		/// profile. No color space conversion of image data occurs.
1093 		/// \param resolution If non-NULL, TIFF will be tagged with this resolution.
1094 		/// \param thumbnail If non-NULL, will be stored in TIFF as preview image.
1095 		/// \param imageResources If non-NULL, will image resources be stored in TIFF as well.
1096 		/// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF.
1097 
1098 		void WriteTIFF (dng_host &host,
1099 						dng_stream &stream,
1100 						const dng_image &image,
1101 						uint32 photometricInterpretation,
1102 						uint32 compression,
1103 						dng_negative *negative,
1104 						const dng_color_space *space = NULL,
1105 						const dng_resolution *resolution = NULL,
1106 						const dng_jpeg_preview *thumbnail = NULL,
1107 						const dng_memory_block *imageResources = NULL,
1108 						dng_metadata_subset metadataSubset = kMetadataSubset_All);
1109 
1110 		void WriteTIFF (dng_host &host,
1111 						dng_stream &stream,
1112 						const dng_image &image,
1113 						uint32 photometricInterpretation = piBlackIsZero,
1114 						uint32 compression = ccUncompressed,
1115 						const dng_metadata *metadata = NULL,
1116 						const dng_color_space *space = NULL,
1117 						const dng_resolution *resolution = NULL,
1118 						const dng_jpeg_preview *thumbnail = NULL,
1119 						const dng_memory_block *imageResources = NULL,
1120 						dng_metadata_subset metadataSubset = kMetadataSubset_All);
1121 
1122 		/// Write a dng_image to a dng_stream in TIFF format.
1123 		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
1124 		/// \param stream The dng_stream on which to write the TIFF.
1125 		/// \param image The actual image data to be written.
1126 		/// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images.
1127 		/// \param compression Must be ccUncompressed.
1128 		/// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF.
1129 		/// \param profileData If non-null, TIFF will be tagged with this profile. No color space conversion
1130 		/// of image data occurs.
1131 		/// \param profileSize The size for the profile data.
1132 		/// \param resolution If non-NULL, TIFF will be tagged with this resolution.
1133 		/// \param thumbnail If non-NULL, will be stored in TIFF as preview image.
1134 		/// \param imageResources If non-NULL, will image resources be stored in TIFF as well.
1135 		/// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF.
1136 
1137 		void WriteTIFFWithProfile (dng_host &host,
1138 								   dng_stream &stream,
1139 								   const dng_image &image,
1140 								   uint32 photometricInterpretation,
1141 								   uint32 compression,
1142 								   dng_negative *negative,
1143 								   const void *profileData = NULL,
1144 								   uint32 profileSize = 0,
1145 								   const dng_resolution *resolution = NULL,
1146 								   const dng_jpeg_preview *thumbnail = NULL,
1147 								   const dng_memory_block *imageResources = NULL,
1148 								   dng_metadata_subset metadataSubset = kMetadataSubset_All);
1149 
1150 		virtual void WriteTIFFWithProfile (dng_host &host,
1151 										   dng_stream &stream,
1152 										   const dng_image &image,
1153 										   uint32 photometricInterpretation = piBlackIsZero,
1154 										   uint32 compression = ccUncompressed,
1155 										   const dng_metadata *metadata = NULL,
1156 										   const void *profileData = NULL,
1157 										   uint32 profileSize = 0,
1158 										   const dng_resolution *resolution = NULL,
1159 										   const dng_jpeg_preview *thumbnail = NULL,
1160 										   const dng_memory_block *imageResources = NULL,
1161 										   dng_metadata_subset metadataSubset = kMetadataSubset_All);
1162 
1163 		/// Write a dng_image to a dng_stream in DNG format.
1164 		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
1165 		/// \param stream The dng_stream on which to write the TIFF.
1166 		/// \param negative The image data and metadata (EXIF, IPTC, XMP) to be written.
1167 		/// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty.
1168 		/// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version.
1169 		/// \param uncompressed True to force uncompressed images. Otherwise use normal compression.
1170 
1171 		void WriteDNG (dng_host &host,
1172 					   dng_stream &stream,
1173 					   dng_negative &negative,
1174 					   const dng_preview_list *previewList = NULL,
1175 					   uint32 maxBackwardVersion = dngVersion_SaveDefault,
1176 					   bool uncompressed = false);
1177 
1178 		/// Write a dng_image to a dng_stream in DNG format.
1179 		/// \param host Host interface used for progress updates, abort testing, buffer allocation, etc.
1180 		/// \param stream The dng_stream on which to write the TIFF.
1181 		/// \param negative The image data to be written.
1182 		/// \param metadata The metadata (EXIF, IPTC, XMP) to be written.
1183 		/// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty.
1184 		/// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version.
1185 		/// \param uncompressed True to force uncompressed images. Otherwise use normal compression.
1186 
1187 		virtual void WriteDNG (dng_host &host,
1188 							   dng_stream &stream,
1189 							   const dng_negative &negative,
1190 							   const dng_metadata &metadata,
1191 							   const dng_preview_list *previewList = NULL,
1192 							   uint32 maxBackwardVersion = dngVersion_SaveDefault,
1193 							   bool uncompressed = false);
1194 
1195 		/// Resolve metadata conflicts and apply metadata policies in keeping
1196 		/// with Metadata Working Group (MWG) guidelines.
1197 
1198 		virtual void CleanUpMetadata (dng_host &host,
1199 									  dng_metadata &metadata,
1200 									  dng_metadata_subset metadataSubset,
1201 									  const char *dstMIMI,
1202 									  const char *software = NULL);
1203 
1204 	protected:
1205 
1206 		virtual uint32 CompressedBufferSize (const dng_ifd &ifd,
1207 											 uint32 uncompressedSize);
1208 
1209 		virtual void EncodePredictor (dng_host &host,
1210 									  const dng_ifd &ifd,
1211 						        	  dng_pixel_buffer &buffer,
1212 									  AutoPtr<dng_memory_block> &tempBuffer);
1213 
1214 		virtual void ByteSwapBuffer (dng_host &host,
1215 									 dng_pixel_buffer &buffer);
1216 
1217 		void ReorderSubTileBlocks (const dng_ifd &ifd,
1218 								   dng_pixel_buffer &buffer,
1219 								   AutoPtr<dng_memory_block> &uncompressedBuffer,
1220 								   AutoPtr<dng_memory_block> &subTileBlockBuffer);
1221 
1222 		virtual void WriteData (dng_host &host,
1223 								const dng_ifd &ifd,
1224 						        dng_stream &stream,
1225 						        dng_pixel_buffer &buffer,
1226 								AutoPtr<dng_memory_block> &compressedBuffer);
1227 
1228 		virtual void WriteTile (dng_host &host,
1229 						        const dng_ifd &ifd,
1230 						        dng_stream &stream,
1231 						        const dng_image &image,
1232 						        const dng_rect &tileArea,
1233 						        uint32 fakeChannels,
1234 								AutoPtr<dng_memory_block> &compressedBuffer,
1235 								AutoPtr<dng_memory_block> &uncompressedBuffer,
1236 								AutoPtr<dng_memory_block> &subTileBlockBuffer,
1237 								AutoPtr<dng_memory_block> &tempBuffer);
1238 
1239 	};
1240 
1241 /*****************************************************************************/
1242 
1243 #endif
1244 
1245 /*****************************************************************************/
1246