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
41class 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
59class tiff_tag
60 {
61
62 protected:
63
64 uint16 fCode;
65
66 uint16 fType;
67
68 uint32 fCount;
69
70 protected:
71
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
85 virtual ~tiff_tag ()
86 {
87 }
88
89 uint16 Code () const
90 {
91 return fCode;
92 }
93
94 uint16 Type () const
95 {
96 return fType;
97 }
98
99 uint32 Count () const
100 {
101 return fCount;
102 }
103
104 void SetCount (uint32 count)
105 {
106 fCount = count;
107 }
108
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
128class tag_data_ptr: public tiff_tag
129 {
130
131 protected:
132
133 const void *fData;
134
135 public:
136
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
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
168class 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
187class 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
207class 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
226 void Set (uint8 value)
227 {
228 fValue = value;
229 }
230
231 };
232
233/******************************************************************************/
234
235class 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
244 : tag_data_ptr (code, ttByte, count, data)
245
246 {
247 }
248
249 };
250
251/******************************************************************************/
252
253class 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
272 void Set (uint16 value)
273 {
274 fValue = value;
275 }
276
277 };
278
279/******************************************************************************/
280
281class 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
290 : tag_data_ptr (code, ttSShort, count, data)
291
292 {
293 }
294
295 };
296
297/******************************************************************************/
298
299class 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
308 : tag_data_ptr (code, ttShort, count, data)
309
310 {
311 }
312
313 };
314
315/******************************************************************************/
316
317class 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
336 void Set (uint32 value)
337 {
338 fValue = value;
339 }
340
341 };
342
343/******************************************************************************/
344
345class 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
354 : tag_data_ptr (code, ttLong, count, data)
355
356 {
357 }
358
359 };
360
361/******************************************************************************/
362
363class tag_urational: public tag_data_ptr
364 {
365
366 private:
367
368 const dng_urational fValue;
369
370 public:
371
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
386class 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
395 : tag_data_ptr (code, ttRational, count, data)
396
397 {
398 }
399
400 };
401
402/******************************************************************************/
403
404class tag_srational: public tag_data_ptr
405 {
406
407 private:
408
409 const dng_srational fValue;
410
411 public:
412
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
427class 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
436 : tag_data_ptr (code, ttSRational, count, data)
437
438 {
439 }
440
441 };
442
443/******************************************************************************/
444
445class 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
464 void Set (real64 value)
465 {
466 fValue = value;
467 }
468
469 };
470
471/******************************************************************************/
472
473class 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
490class 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
501class 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
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
541class 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
557class 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
585class 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
608class 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
626 dng_tiff_directory ()
627
628 : fEntries (0)
629 , fChained (0)
630
631 {
632 }
633
634 virtual ~dng_tiff_directory ()
635 {
636 }
637
638 void Add (const tiff_tag *tag);
639
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
670class 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
730 virtual ~dng_basic_tag_set ()
731 {
732 }
733
734 void SetTileOffset (uint32 index,
735 uint32 offset)
736 {
737 fTileOffsetData [index] = offset;
738 }
739
740 void SetTileByteCount (uint32 index,
741 uint32 count)
742 {
743 fTileByteCountData [index] = count;
744 }
745
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
763class 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
960 void Locate (uint32 offset)
961 {
962 fExifLink.Set (offset);
963 fGPSLink .Set (offset + fExifIFD.Size ());
964 }
965
966 uint32 Size () const
967 {
968 return fExifIFD.Size () +
969 fGPSIFD .Size ();
970 }
971
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
994class 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
1012class 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
1029enum 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
1048class 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