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 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 128 class 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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