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_negative.h#4 $ */ 10 /* $DateTime: 2012/08/02 06:09:06 $ */ 11 /* $Change: 841096 $ */ 12 /* $Author: erichan $ */ 13 14 /** \file 15 * Functions and classes for working with a digital negative (image data and 16 * corresponding metadata). 17 */ 18 19 /*****************************************************************************/ 20 21 #ifndef __dng_negative__ 22 #define __dng_negative__ 23 24 /*****************************************************************************/ 25 26 #include "dng_1d_function.h" 27 #include "dng_auto_ptr.h" 28 #include "dng_classes.h" 29 #include "dng_fingerprint.h" 30 #include "dng_image.h" 31 #include "dng_linearization_info.h" 32 #include "dng_matrix.h" 33 #include "dng_memory.h" 34 #include "dng_mosaic_info.h" 35 #include "dng_opcode_list.h" 36 #include "dng_orientation.h" 37 #include "dng_rational.h" 38 #include "dng_sdk_limits.h" 39 #include "dng_string.h" 40 #include "dng_tag_types.h" 41 #include "dng_tag_values.h" 42 #include "dng_types.h" 43 #include "dng_utils.h" 44 #include "dng_xy_coord.h" 45 46 #include <vector> 47 48 /*****************************************************************************/ 49 50 // To prevent using the internal metadata when we meant to use override 51 // metadata, the following definitions allow us to only allow access to 52 // the internal metadata on non-const negatives. This allows the old API 53 // to keep working essentially unchanged provided one does not use const 54 // negatives, but will prevent access to the embedded data on const 55 // negatives. 56 57 #if 1 58 59 #define qMetadataOnConst 0 60 #define METACONST 61 62 #else 63 64 #define qMetadataOnConst 1 65 #define METACONST const 66 67 #endif 68 69 /*****************************************************************************/ 70 71 /// \brief Noise model for photon and sensor read noise, assuming that they are 72 /// independent random variables and spatially invariant. 73 /// 74 /// The noise model is N (x) = sqrt (scale*x + offset), where x represents a linear 75 /// signal value in the range [0,1], and N (x) is the standard deviation (i.e., 76 /// noise). The parameters scale and offset are both sensor-dependent and 77 /// ISO-dependent. scale must be positive, and offset must be non-negative. 78 79 class dng_noise_function: public dng_1d_function 80 { 81 82 protected: 83 84 real64 fScale; 85 real64 fOffset; 86 87 public: 88 89 /// Create empty and invalid noise function. 90 91 dng_noise_function () 92 93 : fScale (0.0) 94 , fOffset (0.0) 95 96 { 97 98 } 99 100 /// Create noise function with the specified scale and offset. 101 102 dng_noise_function (real64 scale, 103 real64 offset) 104 105 : fScale (scale) 106 , fOffset (offset) 107 108 { 109 110 } 111 112 /// Compute noise (standard deviation) at the specified average signal level 113 /// x. 114 115 virtual real64 Evaluate (real64 x) const 116 { 117 return sqrt (fScale * x + fOffset); 118 } 119 120 /// The scale (slope, gain) of the noise function. 121 122 real64 Scale () const 123 { 124 return fScale; 125 } 126 127 /// The offset (square of the noise floor) of the noise function. 128 129 real64 Offset () const 130 { 131 return fOffset; 132 } 133 134 /// Set the scale (slope, gain) of the noise function. 135 136 void SetScale (real64 scale) 137 { 138 fScale = scale; 139 } 140 141 /// Set the offset (square of the noise floor) of the noise function. 142 143 void SetOffset (real64 offset) 144 { 145 fOffset = offset; 146 } 147 148 /// Is the noise function valid? 149 150 bool IsValid () const 151 { 152 return (fScale > 0.0 && fOffset >= 0.0); 153 } 154 155 }; 156 157 /*****************************************************************************/ 158 159 /// \brief Noise profile for a negative. 160 /// 161 /// For mosaiced negatives, the noise profile describes the approximate noise 162 /// characteristics of a mosaic negative after linearization, but prior to 163 /// demosaicing. For demosaiced negatives (i.e., linear DNGs), the noise profile 164 /// describes the approximate noise characteristics of the image data immediately 165 /// following the demosaic step, prior to the processing of opcode list 3. 166 /// 167 /// A noise profile may contain 1 or N noise functions, where N is the number of 168 /// color planes for the negative. Otherwise the noise profile is considered to be 169 /// invalid for that negative. If the noise profile contains 1 noise function, then 170 /// it is assumed that this single noise function applies to all color planes of the 171 /// negative. Otherwise, the N noise functions map to the N planes of the negative in 172 /// order specified in the CFAPlaneColor tag. 173 174 class dng_noise_profile 175 { 176 177 protected: 178 179 dng_std_vector<dng_noise_function> fNoiseFunctions; 180 181 public: 182 183 /// Create empty (invalid) noise profile. 184 185 dng_noise_profile (); 186 187 /// Create noise profile with the specified noise functions (1 per plane). 188 189 explicit dng_noise_profile (const dng_std_vector<dng_noise_function> &functions); 190 191 /// Is the noise profile valid? 192 193 bool IsValid () const; 194 195 /// Is the noise profile valid for the specified negative? 196 197 bool IsValidForNegative (const dng_negative &negative) const; 198 199 /// The noise function for the specified plane. 200 201 const dng_noise_function & NoiseFunction (uint32 plane) const; 202 203 /// The number of noise functions in this profile. 204 205 uint32 NumFunctions () const; 206 207 }; 208 209 /*****************************************************************************/ 210 211 /// \brief Main class for holding metadata. 212 213 class dng_metadata 214 { 215 216 private: 217 218 // Base orientation of both the thumbnail and raw data. This is 219 // generally based on the EXIF values. 220 221 bool fHasBaseOrientation; 222 223 dng_orientation fBaseOrientation; 224 225 // Is the maker note safe to copy from file to file? Defaults to false 226 // because many maker notes are not safe. 227 228 bool fIsMakerNoteSafe; 229 230 // MakerNote binary data block. 231 232 AutoPtr<dng_memory_block> fMakerNote; 233 234 // EXIF data. 235 236 AutoPtr<dng_exif> fExif; 237 238 // A copy of the EXIF data before is was synchronized with other metadata sources. 239 240 AutoPtr<dng_exif> fOriginalExif; 241 242 // IPTC binary data block and offset in original file. 243 244 AutoPtr<dng_memory_block> fIPTCBlock; 245 246 uint64 fIPTCOffset; 247 248 // XMP data. 249 250 #if qDNGUseXMP 251 252 AutoPtr<dng_xmp> fXMP; 253 254 #endif 255 256 // If there a valid embedded XMP block, has is its digest? NULL if no valid 257 // embedded XMP. 258 259 dng_fingerprint fEmbeddedXMPDigest; 260 261 // Is the XMP data from a sidecar file? 262 263 bool fXMPinSidecar; 264 265 // If the XMP data is from a sidecar file, is the sidecar file newer 266 // than the raw file? 267 268 bool fXMPisNewer; 269 270 // Source file mimi-type, if known. 271 272 dng_string fSourceMIMI; 273 274 public: 275 276 dng_metadata (dng_host &host); 277 278 dng_metadata (const dng_metadata &rhs, 279 dng_memory_allocator &allocator); 280 281 virtual ~dng_metadata (); 282 283 /// Copy this metadata. 284 285 virtual dng_metadata * Clone (dng_memory_allocator &allocator) const; 286 287 /// Setter for BaseOrientation. 288 289 void SetBaseOrientation (const dng_orientation &orientation); 290 291 /// Has BaseOrientation been set? 292 293 bool HasBaseOrientation () const 294 { 295 return fHasBaseOrientation; 296 } 297 298 /// Getter for BaseOrientation. 299 300 const dng_orientation & BaseOrientation () const 301 { 302 return fBaseOrientation; 303 } 304 305 /// Logically rotates the image by changing the orientation values. 306 /// This will also update the XMP data. 307 308 void ApplyOrientation (const dng_orientation &orientation); 309 310 // API for IPTC metadata: 311 312 void SetIPTC (AutoPtr<dng_memory_block> &block, 313 uint64 offset); 314 315 void SetIPTC (AutoPtr<dng_memory_block> &block); 316 317 void ClearIPTC (); 318 319 const void * IPTCData () const; 320 321 uint32 IPTCLength () const; 322 323 uint64 IPTCOffset () const; 324 325 dng_fingerprint IPTCDigest (bool includePadding = true) const; 326 327 void RebuildIPTC (dng_memory_allocator &allocator, 328 bool padForTIFF); 329 330 // API for MakerNote data: 331 332 void SetMakerNoteSafety (bool safe) 333 { 334 fIsMakerNoteSafe = safe; 335 } 336 337 bool IsMakerNoteSafe () const 338 { 339 return fIsMakerNoteSafe; 340 } 341 342 void SetMakerNote (AutoPtr<dng_memory_block> &block) 343 { 344 fMakerNote.Reset (block.Release ()); 345 } 346 347 void ClearMakerNote () 348 { 349 fIsMakerNoteSafe = false; 350 fMakerNote.Reset (); 351 } 352 353 const void * MakerNoteData () const 354 { 355 return fMakerNote.Get () ? fMakerNote->Buffer () 356 : NULL; 357 } 358 359 uint32 MakerNoteLength () const 360 { 361 return fMakerNote.Get () ? fMakerNote->LogicalSize () 362 : 0; 363 } 364 365 // API for EXIF metadata: 366 367 dng_exif * GetExif () 368 { 369 return fExif.Get (); 370 } 371 372 const dng_exif * GetExif () const 373 { 374 return fExif.Get (); 375 } 376 377 template< class E > 378 E & Exif (); 379 380 template< class E > 381 const E & Exif () const; 382 383 void ResetExif (dng_exif * newExif); 384 385 dng_memory_block * BuildExifBlock (dng_memory_allocator &allocator, 386 const dng_resolution *resolution = NULL, 387 bool includeIPTC = false, 388 const dng_jpeg_preview *thumbnail = NULL) const; 389 390 // API for original EXIF metadata. 391 392 dng_exif * GetOriginalExif () 393 { 394 return fOriginalExif.Get (); 395 } 396 397 const dng_exif * GetOriginalExif () const 398 { 399 return fOriginalExif.Get (); 400 } 401 402 // API for XMP metadata: 403 404 #if qDNGUseXMP 405 406 bool SetXMP (dng_host &host, 407 const void *buffer, 408 uint32 count, 409 bool xmpInSidecar = false, 410 bool xmpIsNewer = false); 411 412 void SetEmbeddedXMP (dng_host &host, 413 const void *buffer, 414 uint32 count); 415 416 dng_xmp * GetXMP () 417 { 418 return fXMP.Get (); 419 } 420 421 const dng_xmp * GetXMP () const 422 { 423 return fXMP.Get (); 424 } 425 426 template< class X > 427 X & XMP (); 428 429 template< class X > 430 const X & XMP () const; 431 432 bool XMPinSidecar () const 433 { 434 return fXMPinSidecar; 435 } 436 437 const dng_fingerprint & EmbeddedXMPDigest () const 438 { 439 return fEmbeddedXMPDigest; 440 } 441 442 bool HaveValidEmbeddedXMP () const 443 { 444 return fEmbeddedXMPDigest.IsValid (); 445 } 446 447 void ResetXMP (dng_xmp * newXMP); 448 449 void ResetXMPSidecarNewer (dng_xmp * newXMP, bool inSidecar, bool isNewer ); 450 451 #endif 452 453 // Synchronize metadata sources. 454 455 void SynchronizeMetadata (); 456 457 // Routines to update the date/time field in the EXIF and XMP 458 // metadata. 459 460 void UpdateDateTime (const dng_date_time_info &dt); 461 462 void UpdateDateTimeToNow (); 463 464 void UpdateMetadataDateTimeToNow (); 465 466 // Routines to set and get the source file MIMI type. 467 468 void SetSourceMIMI (const char *s) 469 { 470 fSourceMIMI.Set (s); 471 } 472 473 const dng_string & SourceMIMI () const 474 { 475 return fSourceMIMI; 476 } 477 478 }; 479 480 /*****************************************************************************/ 481 482 template< class E > 483 E & dng_metadata::Exif () 484 { 485 dng_exif * exif = GetExif (); 486 if (!exif) ThrowProgramError ("EXIF object is NULL."); 487 return dynamic_cast< E & > (*exif); 488 } 489 490 /*****************************************************************************/ 491 492 template< class E > 493 const E & dng_metadata::Exif () const 494 { 495 const dng_exif * exif = GetExif (); 496 if (!exif) ThrowProgramError ("EXIF object is NULL."); 497 return dynamic_cast< const E & > (*exif); 498 } 499 500 /*****************************************************************************/ 501 502 #if qDNGUseXMP 503 504 template< class X > 505 X & dng_metadata::XMP () 506 { 507 dng_xmp * xmp = GetXMP (); 508 if (!xmp) ThrowProgramError ("XMP object is NULL."); 509 return dynamic_cast< X & > (*xmp); 510 } 511 512 /*****************************************************************************/ 513 514 template< class X > 515 const X & dng_metadata::XMP () const 516 { 517 const dng_xmp * xmp = GetXMP (); 518 if (!xmp) ThrowProgramError ("XMP object is NULL."); 519 return dynamic_cast< const X & > (*xmp); 520 } 521 522 #endif 523 524 /*****************************************************************************/ 525 526 /// \brief Main class for holding DNG image data and associated metadata. 527 528 class dng_negative 529 { 530 531 public: 532 533 enum RawImageStageEnum 534 { 535 rawImageStagePreOpcode1, 536 rawImageStagePostOpcode1, 537 rawImageStagePostOpcode2, 538 rawImageStagePreOpcode3, 539 rawImageStagePostOpcode3, 540 rawImageStageNone 541 }; 542 543 protected: 544 545 // The negative stores an associated allocator. It does not do 546 // anything to keep it alive or to release it when the object destructs. 547 // Hence, clients will need to make sure that the allocator's lifespan 548 // encompasses that of the dng_factory object which is generally 549 // directly bound to the dng_negative object. 550 551 dng_memory_allocator &fAllocator; 552 553 // Non-localized ASCII model name. 554 555 dng_string fModelName; 556 557 // Localized UTF-8 model name. 558 559 dng_string fLocalName; 560 561 // The area of raw image that should be included in the final converted 562 // image. This stems from extra pixels around the edges of the sensor 563 // including both the black mask and some additional padding. 564 565 // The default crop can be smaller than the "active" area which includes 566 // the padding but not the black masked pixels. 567 568 dng_urational fDefaultCropSizeH; 569 dng_urational fDefaultCropSizeV; 570 571 dng_urational fDefaultCropOriginH; 572 dng_urational fDefaultCropOriginV; 573 574 // Default user crop, in relative coordinates. 575 576 dng_urational fDefaultUserCropT; 577 dng_urational fDefaultUserCropL; 578 dng_urational fDefaultUserCropB; 579 dng_urational fDefaultUserCropR; 580 581 // Default scale factors. Generally, 1.0 for square pixel cameras. They 582 // can compensate for non-square pixels. The choice of exact values will 583 // generally depend on what the camera does. These are particularly 584 // interesting for the Nikon D1X and the Fuji diamond mosaic. 585 586 dng_urational fDefaultScaleH; 587 dng_urational fDefaultScaleV; 588 589 // Best quality scale factor. Used for the Nikon D1X and Fuji cameras 590 // to force everything to be a scale up rather than scale down. So, 591 // generally this is 1.0 / min (fDefaultScaleH, fDefaultScaleV) but 592 // this isn't used if the scale factors are only slightly different 593 // from 1.0. 594 595 dng_urational fBestQualityScale; 596 597 // Proxy image support. Remember certain sizes for the original image 598 // this proxy was derived from. 599 600 dng_point fOriginalDefaultFinalSize; 601 dng_point fOriginalBestQualityFinalSize; 602 603 dng_urational fOriginalDefaultCropSizeH; 604 dng_urational fOriginalDefaultCropSizeV; 605 606 // Scale factors used in demosaic algorithm (calculated). 607 // Maps raw image coordinates to full image coordinates -- i.e., 608 // original image coordinates on raw sensor data to coordinates 609 // in fStage3Image which is the output of the interpolation step. 610 // So, if we downsample when interpolating, these numbers get 611 // smaller. 612 613 real64 fRawToFullScaleH; 614 real64 fRawToFullScaleV; 615 616 // Relative amount of noise at ISO 100. This is measured per camera model 617 // based on looking at flat areas of color. 618 619 dng_urational fBaselineNoise; 620 621 // How much noise reduction has already been applied (0.0 to 1.0) to the 622 // the raw image data? 0.0 = none, 1.0 = "ideal" amount--i.e. don't apply any 623 // more by default. 0/0 for unknown. 624 625 dng_urational fNoiseReductionApplied; 626 627 // Amount of noise for this negative (see dng_noise_profile for details). 628 629 dng_noise_profile fNoiseProfile; 630 631 // Zero point for the exposure compensation slider. This reflects how 632 // the manufacturer sets up the camera and its conversions. 633 634 dng_srational fBaselineExposure; 635 636 // Relative amount of sharpening required. This is chosen per camera 637 // model based on how strong the anti-alias filter is on the camera 638 // and the quality of the lenses. This scales the sharpness slider 639 // value. 640 641 dng_urational fBaselineSharpness; 642 643 // Chroma blur radius (or 0/0 for auto). Set to 0/1 to disable 644 // chroma blurring. 645 646 dng_urational fChromaBlurRadius; 647 648 // Anti-alias filter strength (0.0 to 1.0). Used as a hint 649 // to the demosaic algorithms. 650 651 dng_urational fAntiAliasStrength; 652 653 // Linear response limit. The point at which the sensor goes 654 // non-linear and color information becomes unreliable. Used in 655 // the highlight-recovery logic. 656 657 dng_urational fLinearResponseLimit; 658 659 // Scale factor for shadows slider. The Fuji HDR cameras, for example, 660 // need a more sensitive shadow slider. 661 662 dng_urational fShadowScale; 663 664 // Colormetric reference. 665 666 uint32 fColorimetricReference; 667 668 // Number of color channels for this image (e.g. 1, 3, or 4). 669 670 uint32 fColorChannels; 671 672 // Amount by which each channel has already been scaled. Some cameras 673 // have analog amplifiers on the color channels and these can result 674 // in different scalings per channel. This provides some level of 675 // analog white balancing. The Nikon D1 also did digital scaling but 676 // this caused problems with highlight recovery. 677 678 dng_vector fAnalogBalance; 679 680 // The "As Shot" neutral color coordinates in native camera space. 681 // This overrides fCameraWhiteXY if both are specified. This 682 // specifies the values per channel that would result in a neutral 683 // color for the "As Shot" case. This is generally supplied by 684 // the camera. 685 686 dng_vector fCameraNeutral; 687 688 // The "As Shot" white balance xy coordinates. Sometimes this is 689 // supplied by the camera. Sometimes the camera just supplies a name 690 // for the white balance. 691 692 dng_xy_coord fCameraWhiteXY; 693 694 // Individual camera calibrations. 695 696 // Camera data --> camera calibration --> "inverse" of color matrix 697 698 // This will be a 4x4 matrix for a 4-color camera. The defaults are 699 // almost always the identity matrix and for the cases where they 700 // aren't, they are diagonal matrices. 701 702 dng_matrix fCameraCalibration1; 703 dng_matrix fCameraCalibration2; 704 705 // Signature which allows a profile to announce that it is compatible 706 // with these calibration matrices. 707 708 dng_string fCameraCalibrationSignature; 709 710 // List of camera profiles. 711 712 dng_std_vector<dng_camera_profile *> fCameraProfile; 713 714 // "As shot" camera profile name. 715 716 dng_string fAsShotProfileName; 717 718 // Raw image data digests. These are MD5 fingerprints of the raw image data 719 // in the file, computed using a specific algorithms. They can be used 720 // verify the raw data has not been corrupted. The new version is faster 721 // to compute on MP machines, and is used starting with DNG version 1.4. 722 723 mutable dng_fingerprint fRawImageDigest; 724 725 mutable dng_fingerprint fNewRawImageDigest; 726 727 // Raw data unique ID. This is an unique identifer for the actual 728 // raw image data in the file. It can be used to index into caches 729 // for this data. 730 731 mutable dng_fingerprint fRawDataUniqueID; 732 733 // Original raw file name. Just the file name, not the full path. 734 735 dng_string fOriginalRawFileName; 736 737 // Is the original raw file data availaible? 738 739 bool fHasOriginalRawFileData; 740 741 // The compressed original raw file data. 742 743 AutoPtr<dng_memory_block> fOriginalRawFileData; 744 745 // MD5 digest of original raw file data block. 746 747 mutable dng_fingerprint fOriginalRawFileDigest; 748 749 // DNG private data block. 750 751 AutoPtr<dng_memory_block> fDNGPrivateData; 752 753 // Metadata information (XMP, IPTC, EXIF, orientation) 754 755 dng_metadata fMetadata; 756 757 // Information required to linearize and range map the raw data. 758 759 AutoPtr<dng_linearization_info> fLinearizationInfo; 760 761 // Information required to demoasic the raw data. 762 763 AutoPtr<dng_mosaic_info> fMosaicInfo; 764 765 // Opcode list 1. (Applied to stored data) 766 767 dng_opcode_list fOpcodeList1; 768 769 // Opcode list 2. (Applied to range mapped data) 770 771 dng_opcode_list fOpcodeList2; 772 773 // Opcode list 3. (Post demosaic) 774 775 dng_opcode_list fOpcodeList3; 776 777 // Stage 1 image, which is image data stored in a DNG file. 778 779 AutoPtr<dng_image> fStage1Image; 780 781 // Stage 2 image, which is the stage 1 image after it has been 782 // linearized and range mapped. 783 784 AutoPtr<dng_image> fStage2Image; 785 786 // Stage 3 image, which is the stage 2 image after it has been 787 // demosaiced. 788 789 AutoPtr<dng_image> fStage3Image; 790 791 // Additiona gain applied when building the stage 3 image. 792 793 real64 fStage3Gain; 794 795 // Were any approximations (e.g. downsampling, etc.) applied 796 // file reading this image? 797 798 bool fIsPreview; 799 800 // Does the file appear to be damaged? 801 802 bool fIsDamaged; 803 804 // At what processing stage did we grab a copy of raw image data? 805 806 RawImageStageEnum fRawImageStage; 807 808 // The raw image data that we grabbed, if any. 809 810 AutoPtr<dng_image> fRawImage; 811 812 // The floating point bit depth of the raw file, if any. 813 814 uint32 fRawFloatBitDepth; 815 816 // The raw image JPEG data that we grabbed, if any. 817 818 AutoPtr<dng_jpeg_image> fRawJPEGImage; 819 820 // Keep a separate digest for the compressed JPEG data, if any. 821 822 mutable dng_fingerprint fRawJPEGImageDigest; 823 824 // Transparency mask image, if any. 825 826 AutoPtr<dng_image> fTransparencyMask; 827 828 // Grabbed transparency mask, if we are not saving the current mask. 829 830 AutoPtr<dng_image> fRawTransparencyMask; 831 832 // The bit depth for the raw transparancy mask, if known. 833 834 uint32 fRawTransparencyMaskBitDepth; 835 836 // We sometimes need to keep of copy of the stage3 image before 837 // flattening the transparency. 838 839 AutoPtr<dng_image> fUnflattenedStage3Image; 840 841 public: 842 843 virtual ~dng_negative (); 844 845 static dng_negative * Make (dng_host &host); 846 847 /// Provide access to the memory allocator used for this object. 848 849 dng_memory_allocator & Allocator () const 850 { 851 return fAllocator; 852 } 853 854 /// Getter for ModelName. 855 856 void SetModelName (const char *name) 857 { 858 fModelName.Set_ASCII (name); 859 } 860 861 /// Setter for ModelName. 862 863 const dng_string & ModelName () const 864 { 865 return fModelName; 866 } 867 868 /// Setter for LocalName. 869 870 void SetLocalName (const char *name) 871 { 872 fLocalName.Set (name); 873 } 874 875 /// Getter for LocalName. 876 877 const dng_string & LocalName () const 878 { 879 return fLocalName; 880 } 881 882 /// Getter for metadata 883 884 dng_metadata &Metadata () 885 { 886 return fMetadata; 887 } 888 889 #if qMetadataOnConst 890 891 const dng_metadata &Metadata () const 892 { 893 return fMetadata; 894 } 895 896 #endif // qMetadataOnConst 897 898 /// Make a copy of the internal metadata generally as a basis for further 899 /// changes. 900 901 dng_metadata * CloneInternalMetadata () const; 902 903 protected: 904 905 /// An accessor for the internal metadata that works even when we 906 /// have general access turned off. This is needed to provide 907 /// access to EXIF ISO information. 908 909 const dng_metadata &InternalMetadata () const 910 { 911 return fMetadata; 912 } 913 914 public: 915 916 /// Setter for BaseOrientation. 917 918 void SetBaseOrientation (const dng_orientation &orientation) 919 { 920 Metadata ().SetBaseOrientation (orientation); 921 } 922 923 /// Has BaseOrientation been set? 924 925 bool HasBaseOrientation () METACONST 926 { 927 return Metadata ().HasBaseOrientation (); 928 } 929 930 /// Getter for BaseOrientation. 931 932 const dng_orientation & BaseOrientation () METACONST 933 { 934 return Metadata ().BaseOrientation (); 935 } 936 937 /// Hook to allow SDK host code to add additional rotations. 938 939 virtual dng_orientation ComputeOrientation (const dng_metadata &metadata) const; 940 941 /// For non-const negatives, we simply default to using the metadata attached to the negative. 942 943 dng_orientation Orientation () 944 { 945 return ComputeOrientation (Metadata ()); 946 } 947 948 /// Logically rotates the image by changing the orientation values. 949 /// This will also update the XMP data. 950 951 void ApplyOrientation (const dng_orientation &orientation) 952 { 953 Metadata ().ApplyOrientation (orientation); 954 } 955 956 /// Setter for DefaultCropSize. 957 958 void SetDefaultCropSize (const dng_urational &sizeH, 959 const dng_urational &sizeV) 960 { 961 fDefaultCropSizeH = sizeH; 962 fDefaultCropSizeV = sizeV; 963 } 964 965 /// Setter for DefaultCropSize. 966 967 void SetDefaultCropSize (uint32 sizeH, 968 uint32 sizeV) 969 { 970 SetDefaultCropSize (dng_urational (sizeH, 1), 971 dng_urational (sizeV, 1)); 972 } 973 974 /// Getter for DefaultCropSize horizontal. 975 976 const dng_urational & DefaultCropSizeH () const 977 { 978 return fDefaultCropSizeH; 979 } 980 981 /// Getter for DefaultCropSize vertical. 982 983 const dng_urational & DefaultCropSizeV () const 984 { 985 return fDefaultCropSizeV; 986 } 987 988 /// Setter for DefaultCropOrigin. 989 990 void SetDefaultCropOrigin (const dng_urational &originH, 991 const dng_urational &originV) 992 { 993 fDefaultCropOriginH = originH; 994 fDefaultCropOriginV = originV; 995 } 996 997 /// Setter for DefaultCropOrigin. 998 999 void SetDefaultCropOrigin (uint32 originH, 1000 uint32 originV) 1001 { 1002 SetDefaultCropOrigin (dng_urational (originH, 1), 1003 dng_urational (originV, 1)); 1004 } 1005 1006 /// Set default crop around center of image. 1007 1008 void SetDefaultCropCentered (const dng_point &rawSize) 1009 { 1010 1011 uint32 sizeH = Round_uint32 (fDefaultCropSizeH.As_real64 ()); 1012 uint32 sizeV = Round_uint32 (fDefaultCropSizeV.As_real64 ()); 1013 1014 SetDefaultCropOrigin ((rawSize.h - sizeH) >> 1, 1015 (rawSize.v - sizeV) >> 1); 1016 1017 } 1018 1019 /// Get default crop origin horizontal value. 1020 1021 const dng_urational & DefaultCropOriginH () const 1022 { 1023 return fDefaultCropOriginH; 1024 } 1025 1026 /// Get default crop origin vertical value. 1027 1028 const dng_urational & DefaultCropOriginV () const 1029 { 1030 return fDefaultCropOriginV; 1031 } 1032 1033 /// Getter for top coordinate of default user crop. 1034 1035 const dng_urational & DefaultUserCropT () const 1036 { 1037 return fDefaultUserCropT; 1038 } 1039 1040 /// Getter for left coordinate of default user crop. 1041 1042 const dng_urational & DefaultUserCropL () const 1043 { 1044 return fDefaultUserCropL; 1045 } 1046 1047 /// Getter for bottom coordinate of default user crop. 1048 1049 const dng_urational & DefaultUserCropB () const 1050 { 1051 return fDefaultUserCropB; 1052 } 1053 1054 /// Getter for right coordinate of default user crop. 1055 1056 const dng_urational & DefaultUserCropR () const 1057 { 1058 return fDefaultUserCropR; 1059 } 1060 1061 /// Reset default user crop to default crop area. 1062 1063 void ResetDefaultUserCrop () 1064 { 1065 fDefaultUserCropT = dng_urational (0, 1); 1066 fDefaultUserCropL = dng_urational (0, 1); 1067 fDefaultUserCropB = dng_urational (1, 1); 1068 fDefaultUserCropR = dng_urational (1, 1); 1069 } 1070 1071 /// Setter for all 4 coordinates of default user crop. 1072 1073 void SetDefaultUserCrop (const dng_urational &t, 1074 const dng_urational &l, 1075 const dng_urational &b, 1076 const dng_urational &r) 1077 { 1078 fDefaultUserCropT = t; 1079 fDefaultUserCropL = l; 1080 fDefaultUserCropB = b; 1081 fDefaultUserCropR = r; 1082 } 1083 1084 /// Setter for top coordinate of default user crop. 1085 1086 void SetDefaultUserCropT (const dng_urational &value) 1087 { 1088 fDefaultUserCropT = value; 1089 } 1090 1091 /// Setter for left coordinate of default user crop. 1092 1093 void SetDefaultUserCropL (const dng_urational &value) 1094 { 1095 fDefaultUserCropL = value; 1096 } 1097 1098 /// Setter for bottom coordinate of default user crop. 1099 1100 void SetDefaultUserCropB (const dng_urational &value) 1101 { 1102 fDefaultUserCropB = value; 1103 } 1104 1105 /// Setter for right coordinate of default user crop. 1106 1107 void SetDefaultUserCropR (const dng_urational &value) 1108 { 1109 fDefaultUserCropR = value; 1110 } 1111 1112 /// Setter for DefaultScale. 1113 1114 void SetDefaultScale (const dng_urational &scaleH, 1115 const dng_urational &scaleV) 1116 { 1117 fDefaultScaleH = scaleH; 1118 fDefaultScaleV = scaleV; 1119 } 1120 1121 /// Get default scale horizontal value. 1122 1123 const dng_urational & DefaultScaleH () const 1124 { 1125 return fDefaultScaleH; 1126 } 1127 1128 /// Get default scale vertical value. 1129 1130 const dng_urational & DefaultScaleV () const 1131 { 1132 return fDefaultScaleV; 1133 } 1134 1135 /// Setter for BestQualityScale. 1136 1137 void SetBestQualityScale (const dng_urational &scale) 1138 { 1139 fBestQualityScale = scale; 1140 } 1141 1142 /// Getter for BestQualityScale. 1143 1144 const dng_urational & BestQualityScale () const 1145 { 1146 return fBestQualityScale; 1147 } 1148 1149 /// API for raw to full image scaling factors horizontal. 1150 1151 real64 RawToFullScaleH () const 1152 { 1153 return fRawToFullScaleH; 1154 } 1155 1156 /// API for raw to full image scaling factors vertical. 1157 1158 real64 RawToFullScaleV () const 1159 { 1160 return fRawToFullScaleV; 1161 } 1162 1163 /// Setter for raw to full scales. 1164 1165 void SetRawToFullScale (real64 scaleH, 1166 real64 scaleV) 1167 { 1168 fRawToFullScaleH = scaleH; 1169 fRawToFullScaleV = scaleV; 1170 } 1171 1172 /// Get default scale factor. 1173 /// When specifing a single scale factor, we use the horizontal 1174 /// scale factor, and let the vertical scale factor be calculated 1175 /// based on the pixel aspect ratio. 1176 1177 real64 DefaultScale () const 1178 { 1179 return DefaultScaleH ().As_real64 (); 1180 } 1181 1182 /// Default cropped image size (at scale == 1.0) width. 1183 1184 real64 SquareWidth () const 1185 { 1186 return DefaultCropSizeH ().As_real64 (); 1187 } 1188 1189 /// Default cropped image size (at scale == 1.0) height. 1190 1191 real64 SquareHeight () const 1192 { 1193 return DefaultCropSizeV ().As_real64 () * 1194 DefaultScaleV ().As_real64 () / 1195 DefaultScaleH ().As_real64 (); 1196 } 1197 1198 /// Default cropped image aspect ratio. 1199 1200 real64 AspectRatio () const 1201 { 1202 return SquareWidth () / 1203 SquareHeight (); 1204 } 1205 1206 /// Pixel aspect ratio of stage 3 image. 1207 1208 real64 PixelAspectRatio () const 1209 { 1210 return (DefaultScaleH ().As_real64 () / RawToFullScaleH ()) / 1211 (DefaultScaleV ().As_real64 () / RawToFullScaleV ()); 1212 } 1213 1214 /// Default cropped image size at given scale factor width. 1215 1216 uint32 FinalWidth (real64 scale) const 1217 { 1218 return Round_uint32 (SquareWidth () * scale); 1219 } 1220 1221 /// Default cropped image size at given scale factor height. 1222 1223 uint32 FinalHeight (real64 scale) const 1224 { 1225 return Round_uint32 (SquareHeight () * scale); 1226 } 1227 1228 /// Default cropped image size at default scale factor width. 1229 1230 uint32 DefaultFinalWidth () const 1231 { 1232 return FinalWidth (DefaultScale ()); 1233 } 1234 1235 /// Default cropped image size at default scale factor height. 1236 1237 uint32 DefaultFinalHeight () const 1238 { 1239 return FinalHeight (DefaultScale ()); 1240 } 1241 1242 /// Get best quality width. 1243 /// For a naive conversion, one could use either the default size, 1244 /// or the best quality size. 1245 1246 uint32 BestQualityFinalWidth () const 1247 { 1248 return FinalWidth (DefaultScale () * BestQualityScale ().As_real64 ()); 1249 } 1250 1251 /// Get best quality height. 1252 /// For a naive conversion, one could use either the default size, 1253 /// or the best quality size. 1254 1255 uint32 BestQualityFinalHeight () const 1256 { 1257 return FinalHeight (DefaultScale () * BestQualityScale ().As_real64 ()); 1258 } 1259 1260 /// Default size of original (non-proxy) image. For non-proxy images, this 1261 /// is equal to DefaultFinalWidth/DefaultFinalHight. For proxy images, this 1262 /// is equal to the DefaultFinalWidth/DefaultFinalHeight of the image this 1263 /// proxy was derived from. 1264 1265 const dng_point & OriginalDefaultFinalSize () const 1266 { 1267 return fOriginalDefaultFinalSize; 1268 } 1269 1270 /// Setter for OriginalDefaultFinalSize. 1271 1272 void SetOriginalDefaultFinalSize (const dng_point &size) 1273 { 1274 fOriginalDefaultFinalSize = size; 1275 } 1276 1277 /// Best quality size of original (non-proxy) image. For non-proxy images, this 1278 /// is equal to BestQualityFinalWidth/BestQualityFinalHeight. For proxy images, this 1279 /// is equal to the BestQualityFinalWidth/BestQualityFinalHeight of the image this 1280 /// proxy was derived from. 1281 1282 const dng_point & OriginalBestQualityFinalSize () const 1283 { 1284 return fOriginalBestQualityFinalSize; 1285 } 1286 1287 /// Setter for OriginalBestQualityFinalSize. 1288 1289 void SetOriginalBestQualityFinalSize (const dng_point &size) 1290 { 1291 fOriginalBestQualityFinalSize = size; 1292 } 1293 1294 /// DefaultCropSize for original (non-proxy) image. For non-proxy images, 1295 /// this is equal to the DefaultCropSize. for proxy images, this is 1296 /// equal size of the DefaultCropSize of the image this proxy was derived from. 1297 1298 const dng_urational & OriginalDefaultCropSizeH () const 1299 { 1300 return fOriginalDefaultCropSizeH; 1301 } 1302 1303 const dng_urational & OriginalDefaultCropSizeV () const 1304 { 1305 return fOriginalDefaultCropSizeV; 1306 } 1307 1308 /// Setter for OriginalDefaultCropSize. 1309 1310 void SetOriginalDefaultCropSize (const dng_urational &sizeH, 1311 const dng_urational &sizeV) 1312 { 1313 fOriginalDefaultCropSizeH = sizeH; 1314 fOriginalDefaultCropSizeV = sizeV; 1315 } 1316 1317 /// If the original size fields are undefined, set them to the 1318 /// current sizes. 1319 1320 void SetDefaultOriginalSizes (); 1321 1322 /// The default crop area in the stage 3 image coordinates. 1323 1324 dng_rect DefaultCropArea () const; 1325 1326 /// Setter for BaselineNoise. 1327 1328 void SetBaselineNoise (real64 noise) 1329 { 1330 fBaselineNoise.Set_real64 (noise, 100); 1331 } 1332 1333 /// Getter for BaselineNoise as dng_urational. 1334 1335 const dng_urational & BaselineNoiseR () const 1336 { 1337 return fBaselineNoise; 1338 } 1339 1340 /// Getter for BaselineNoise as real64. 1341 1342 real64 BaselineNoise () const 1343 { 1344 return fBaselineNoise.As_real64 (); 1345 } 1346 1347 /// Setter for NoiseReductionApplied. 1348 1349 void SetNoiseReductionApplied (const dng_urational &value) 1350 { 1351 fNoiseReductionApplied = value; 1352 } 1353 1354 /// Getter for NoiseReductionApplied. 1355 1356 const dng_urational & NoiseReductionApplied () const 1357 { 1358 return fNoiseReductionApplied; 1359 } 1360 1361 /// Setter for noise profile. 1362 1363 void SetNoiseProfile (const dng_noise_profile &noiseProfile) 1364 { 1365 fNoiseProfile = noiseProfile; 1366 } 1367 1368 /// Does this negative have a valid noise profile? 1369 1370 bool HasNoiseProfile () const 1371 { 1372 return fNoiseProfile.IsValidForNegative (*this); 1373 } 1374 1375 /// Getter for noise profile. 1376 1377 const dng_noise_profile & NoiseProfile () const 1378 { 1379 return fNoiseProfile; 1380 } 1381 1382 /// Setter for BaselineExposure. 1383 1384 void SetBaselineExposure (real64 exposure) 1385 { 1386 fBaselineExposure.Set_real64 (exposure, 100); 1387 } 1388 1389 /// Getter for BaselineExposure as dng_urational. 1390 1391 const dng_srational & BaselineExposureR () const 1392 { 1393 return fBaselineExposure; 1394 } 1395 1396 /// Getter for BaselineExposure as real64. 1397 1398 real64 BaselineExposure () const 1399 { 1400 return BaselineExposureR ().As_real64 (); 1401 } 1402 1403 /// Compute total baseline exposure (sum of negative's BaselineExposure and 1404 /// profile's BaselineExposureOffset). 1405 1406 real64 TotalBaselineExposure (const dng_camera_profile_id &profileID) const; 1407 1408 /// Setter for BaselineSharpness. 1409 1410 void SetBaselineSharpness (real64 sharpness) 1411 { 1412 fBaselineSharpness.Set_real64 (sharpness, 100); 1413 } 1414 1415 /// Getter for BaselineSharpness as dng_urational. 1416 1417 const dng_urational & BaselineSharpnessR () const 1418 { 1419 return fBaselineSharpness; 1420 } 1421 1422 /// Getter for BaselineSharpness as real64. 1423 1424 real64 BaselineSharpness () const 1425 { 1426 return BaselineSharpnessR ().As_real64 (); 1427 } 1428 1429 /// Setter for ChromaBlurRadius. 1430 1431 void SetChromaBlurRadius (const dng_urational &radius) 1432 { 1433 fChromaBlurRadius = radius; 1434 } 1435 1436 /// Getter for ChromaBlurRadius as dng_urational. 1437 1438 const dng_urational & ChromaBlurRadius () const 1439 { 1440 return fChromaBlurRadius; 1441 } 1442 1443 /// Setter for AntiAliasStrength. 1444 1445 void SetAntiAliasStrength (const dng_urational &strength) 1446 { 1447 fAntiAliasStrength = strength; 1448 } 1449 1450 /// Getter for AntiAliasStrength as dng_urational. 1451 1452 const dng_urational & AntiAliasStrength () const 1453 { 1454 return fAntiAliasStrength; 1455 } 1456 1457 /// Setter for LinearResponseLimit. 1458 1459 void SetLinearResponseLimit (real64 limit) 1460 { 1461 fLinearResponseLimit.Set_real64 (limit, 100); 1462 } 1463 1464 /// Getter for LinearResponseLimit as dng_urational. 1465 1466 const dng_urational & LinearResponseLimitR () const 1467 { 1468 return fLinearResponseLimit; 1469 } 1470 1471 /// Getter for LinearResponseLimit as real64. 1472 1473 real64 LinearResponseLimit () const 1474 { 1475 return LinearResponseLimitR ().As_real64 (); 1476 } 1477 1478 /// Setter for ShadowScale. 1479 1480 void SetShadowScale (const dng_urational &scale); 1481 1482 /// Getter for ShadowScale as dng_urational. 1483 1484 const dng_urational & ShadowScaleR () const 1485 { 1486 return fShadowScale; 1487 } 1488 1489 /// Getter for ShadowScale as real64. 1490 1491 real64 ShadowScale () const 1492 { 1493 return ShadowScaleR ().As_real64 (); 1494 } 1495 1496 // API for ColorimetricReference. 1497 1498 void SetColorimetricReference (uint32 ref) 1499 { 1500 fColorimetricReference = ref; 1501 } 1502 1503 uint32 ColorimetricReference () const 1504 { 1505 return fColorimetricReference; 1506 } 1507 1508 /// Setter for ColorChannels. 1509 1510 void SetColorChannels (uint32 channels) 1511 { 1512 fColorChannels = channels; 1513 } 1514 1515 /// Getter for ColorChannels. 1516 1517 uint32 ColorChannels () const 1518 { 1519 return fColorChannels; 1520 } 1521 1522 /// Setter for Monochrome. 1523 1524 void SetMonochrome () 1525 { 1526 SetColorChannels (1); 1527 } 1528 1529 /// Getter for Monochrome. 1530 1531 bool IsMonochrome () const 1532 { 1533 return ColorChannels () == 1; 1534 } 1535 1536 /// Setter for AnalogBalance. 1537 1538 void SetAnalogBalance (const dng_vector &b); 1539 1540 /// Getter for AnalogBalance as dng_urational. 1541 1542 dng_urational AnalogBalanceR (uint32 channel) const; 1543 1544 /// Getter for AnalogBalance as real64. 1545 1546 real64 AnalogBalance (uint32 channel) const; 1547 1548 /// Setter for CameraNeutral. 1549 1550 void SetCameraNeutral (const dng_vector &n); 1551 1552 /// Clear CameraNeutral. 1553 1554 void ClearCameraNeutral () 1555 { 1556 fCameraNeutral.Clear (); 1557 } 1558 1559 /// Determine if CameraNeutral has been set but not cleared. 1560 1561 bool HasCameraNeutral () const 1562 { 1563 return fCameraNeutral.NotEmpty (); 1564 } 1565 1566 /// Getter for CameraNeutral. 1567 1568 const dng_vector & CameraNeutral () const 1569 { 1570 return fCameraNeutral; 1571 } 1572 1573 dng_urational CameraNeutralR (uint32 channel) const; 1574 1575 /// Setter for CameraWhiteXY. 1576 1577 void SetCameraWhiteXY (const dng_xy_coord &coord); 1578 1579 bool HasCameraWhiteXY () const 1580 { 1581 return fCameraWhiteXY.IsValid (); 1582 } 1583 1584 const dng_xy_coord & CameraWhiteXY () const; 1585 1586 void GetCameraWhiteXY (dng_urational &x, 1587 dng_urational &y) const; 1588 1589 // API for camera calibration: 1590 1591 /// Setter for first of up to two color matrices used for individual camera calibrations. 1592 /// 1593 /// The sequence of matrix transforms is: 1594 /// Camera data --> camera calibration --> "inverse" of color matrix 1595 /// 1596 /// This will be a 4x4 matrix for a four-color camera. The defaults are 1597 /// almost always the identity matrix, and for the cases where they 1598 /// aren't, they are diagonal matrices. 1599 1600 void SetCameraCalibration1 (const dng_matrix &m); 1601 1602 /// Setter for second of up to two color matrices used for individual camera calibrations. 1603 /// 1604 /// The sequence of matrix transforms is: 1605 /// Camera data --> camera calibration --> "inverse" of color matrix 1606 /// 1607 /// This will be a 4x4 matrix for a four-color camera. The defaults are 1608 /// almost always the identity matrix, and for the cases where they 1609 /// aren't, they are diagonal matrices. 1610 1611 void SetCameraCalibration2 (const dng_matrix &m); 1612 1613 /// Getter for first of up to two color matrices used for individual camera calibrations. 1614 1615 const dng_matrix & CameraCalibration1 () const 1616 { 1617 return fCameraCalibration1; 1618 } 1619 1620 /// Getter for second of up to two color matrices used for individual camera calibrations. 1621 1622 const dng_matrix & CameraCalibration2 () const 1623 { 1624 return fCameraCalibration2; 1625 } 1626 1627 void SetCameraCalibrationSignature (const char *signature) 1628 { 1629 fCameraCalibrationSignature.Set (signature); 1630 } 1631 1632 const dng_string & CameraCalibrationSignature () const 1633 { 1634 return fCameraCalibrationSignature; 1635 } 1636 1637 // Camera Profile API: 1638 1639 void AddProfile (AutoPtr<dng_camera_profile> &profile); 1640 1641 void ClearProfiles (); 1642 1643 void ClearProfiles (bool clearBuiltinMatrixProfiles, 1644 bool clearReadFromDisk); 1645 1646 uint32 ProfileCount () const; 1647 1648 const dng_camera_profile & ProfileByIndex (uint32 index) const; 1649 1650 virtual const dng_camera_profile * ProfileByID (const dng_camera_profile_id &id, 1651 bool useDefaultIfNoMatch = true) const; 1652 1653 bool HasProfileID (const dng_camera_profile_id &id) const 1654 { 1655 return ProfileByID (id, false) != NULL; 1656 } 1657 1658 // Returns the camera profile to embed when saving to DNG: 1659 1660 virtual const dng_camera_profile * ComputeCameraProfileToEmbed 1661 (const dng_metadata &metadata) const; 1662 1663 // For non-const negatives, we can use the embedded metadata. 1664 1665 const dng_camera_profile * CameraProfileToEmbed () 1666 { 1667 return ComputeCameraProfileToEmbed (Metadata ()); 1668 } 1669 1670 // API for AsShotProfileName. 1671 1672 void SetAsShotProfileName (const char *name) 1673 { 1674 fAsShotProfileName.Set (name); 1675 } 1676 1677 const dng_string & AsShotProfileName () const 1678 { 1679 return fAsShotProfileName; 1680 } 1681 1682 // Makes a dng_color_spec object for this negative. 1683 1684 virtual dng_color_spec * MakeColorSpec (const dng_camera_profile_id &id) const; 1685 1686 // Compute a MD5 hash on an image, using a fixed algorithm. 1687 // The results must be stable across different hardware, OSes, 1688 // and software versions. 1689 1690 dng_fingerprint FindImageDigest (dng_host &host, 1691 const dng_image &image) const; 1692 1693 // API for RawImageDigest and NewRawImageDigest: 1694 1695 void SetRawImageDigest (const dng_fingerprint &digest) 1696 { 1697 fRawImageDigest = digest; 1698 } 1699 1700 void SetNewRawImageDigest (const dng_fingerprint &digest) 1701 { 1702 fNewRawImageDigest = digest; 1703 } 1704 1705 void ClearRawImageDigest () const 1706 { 1707 fRawImageDigest .Clear (); 1708 fNewRawImageDigest.Clear (); 1709 } 1710 1711 const dng_fingerprint & RawImageDigest () const 1712 { 1713 return fRawImageDigest; 1714 } 1715 1716 const dng_fingerprint & NewRawImageDigest () const 1717 { 1718 return fNewRawImageDigest; 1719 } 1720 1721 void FindRawImageDigest (dng_host &host) const; 1722 1723 void FindNewRawImageDigest (dng_host &host) const; 1724 1725 void ValidateRawImageDigest (dng_host &host); 1726 1727 // API for RawDataUniqueID: 1728 1729 void SetRawDataUniqueID (const dng_fingerprint &id) 1730 { 1731 fRawDataUniqueID = id; 1732 } 1733 1734 const dng_fingerprint & RawDataUniqueID () const 1735 { 1736 return fRawDataUniqueID; 1737 } 1738 1739 void FindRawDataUniqueID (dng_host &host) const; 1740 1741 void RecomputeRawDataUniqueID (dng_host &host); 1742 1743 // API for original raw file name: 1744 1745 void SetOriginalRawFileName (const char *name) 1746 { 1747 fOriginalRawFileName.Set (name); 1748 } 1749 1750 bool HasOriginalRawFileName () const 1751 { 1752 return fOriginalRawFileName.NotEmpty (); 1753 } 1754 1755 const dng_string & OriginalRawFileName () const 1756 { 1757 return fOriginalRawFileName; 1758 } 1759 1760 // API for original raw file data: 1761 1762 void SetHasOriginalRawFileData (bool hasData) 1763 { 1764 fHasOriginalRawFileData = hasData; 1765 } 1766 1767 bool CanEmbedOriginalRaw () const 1768 { 1769 return fHasOriginalRawFileData && HasOriginalRawFileName (); 1770 } 1771 1772 void SetOriginalRawFileData (AutoPtr<dng_memory_block> &data) 1773 { 1774 fOriginalRawFileData.Reset (data.Release ()); 1775 } 1776 1777 const void * OriginalRawFileData () const 1778 { 1779 return fOriginalRawFileData.Get () ? fOriginalRawFileData->Buffer () 1780 : NULL; 1781 } 1782 1783 uint32 OriginalRawFileDataLength () const 1784 { 1785 return fOriginalRawFileData.Get () ? fOriginalRawFileData->LogicalSize () 1786 : 0; 1787 } 1788 1789 // API for original raw file data digest. 1790 1791 void SetOriginalRawFileDigest (const dng_fingerprint &digest) 1792 { 1793 fOriginalRawFileDigest = digest; 1794 } 1795 1796 const dng_fingerprint & OriginalRawFileDigest () const 1797 { 1798 return fOriginalRawFileDigest; 1799 } 1800 1801 void FindOriginalRawFileDigest () const; 1802 1803 void ValidateOriginalRawFileDigest (); 1804 1805 // API for DNG private data: 1806 1807 void SetPrivateData (AutoPtr<dng_memory_block> &block) 1808 { 1809 fDNGPrivateData.Reset (block.Release ()); 1810 } 1811 1812 void ClearPrivateData () 1813 { 1814 fDNGPrivateData.Reset (); 1815 } 1816 1817 const uint8 * PrivateData () const 1818 { 1819 return fDNGPrivateData.Get () ? fDNGPrivateData->Buffer_uint8 () 1820 : NULL; 1821 } 1822 1823 uint32 PrivateLength () const 1824 { 1825 return fDNGPrivateData.Get () ? fDNGPrivateData->LogicalSize () 1826 : 0; 1827 } 1828 1829 // API for MakerNote data: 1830 1831 void SetMakerNoteSafety (bool safe) 1832 { 1833 Metadata ().SetMakerNoteSafety (safe); 1834 } 1835 1836 bool IsMakerNoteSafe () METACONST 1837 { 1838 return Metadata ().IsMakerNoteSafe (); 1839 } 1840 1841 void SetMakerNote (AutoPtr<dng_memory_block> &block) 1842 { 1843 Metadata ().SetMakerNote (block); 1844 } 1845 1846 void ClearMakerNote () 1847 { 1848 Metadata ().ClearMakerNote (); 1849 } 1850 1851 const void * MakerNoteData () METACONST 1852 { 1853 return Metadata ().MakerNoteData (); 1854 } 1855 1856 uint32 MakerNoteLength () METACONST 1857 { 1858 return Metadata ().MakerNoteLength (); 1859 } 1860 1861 // API for EXIF metadata: 1862 1863 dng_exif * GetExif () 1864 { 1865 return Metadata ().GetExif (); 1866 } 1867 1868 #if qMetadataOnConst 1869 1870 const dng_exif * GetExif () const 1871 { 1872 return Metadata ().GetExif (); 1873 } 1874 1875 #endif // qMetadataOnConst 1876 1877 void ResetExif (dng_exif * newExif) 1878 { 1879 Metadata ().ResetExif (newExif); 1880 } 1881 1882 // API for original EXIF metadata. 1883 1884 dng_exif * GetOriginalExif () 1885 { 1886 return Metadata ().GetOriginalExif (); 1887 } 1888 1889 #if qMetadataOnConst 1890 1891 const dng_exif * GetOriginalExif () const 1892 { 1893 return Metadata ().GetOriginalExif (); 1894 } 1895 1896 #endif // qMetadataOnConst 1897 1898 // API for IPTC metadata: 1899 1900 void SetIPTC (AutoPtr<dng_memory_block> &block, 1901 uint64 offset) 1902 { 1903 Metadata ().SetIPTC (block, offset); 1904 } 1905 1906 void SetIPTC (AutoPtr<dng_memory_block> &block) 1907 { 1908 Metadata ().SetIPTC (block); 1909 } 1910 1911 void ClearIPTC () 1912 { 1913 Metadata ().ClearIPTC (); 1914 } 1915 1916 const void * IPTCData () METACONST 1917 { 1918 return Metadata ().IPTCData (); 1919 } 1920 1921 uint32 IPTCLength () METACONST 1922 { 1923 return Metadata ().IPTCLength (); 1924 } 1925 1926 uint64 IPTCOffset () METACONST 1927 { 1928 return Metadata ().IPTCOffset (); 1929 } 1930 1931 dng_fingerprint IPTCDigest (bool includePadding = true) METACONST 1932 { 1933 return Metadata ().IPTCDigest (includePadding); 1934 } 1935 1936 void RebuildIPTC (bool padForTIFF) 1937 { 1938 Metadata ().RebuildIPTC (Allocator (), padForTIFF); 1939 } 1940 1941 // API for XMP metadata: 1942 1943 #if qDNGUseXMP 1944 1945 bool SetXMP (dng_host &host, 1946 const void *buffer, 1947 uint32 count, 1948 bool xmpInSidecar = false, 1949 bool xmpIsNewer = false) 1950 { 1951 return Metadata ().SetXMP (host, 1952 buffer, 1953 count, 1954 xmpInSidecar, 1955 xmpIsNewer); 1956 } 1957 1958 dng_xmp * GetXMP () 1959 { 1960 return Metadata ().GetXMP (); 1961 } 1962 1963 #if qMetadataOnConst 1964 1965 const dng_xmp * GetXMP () const 1966 { 1967 return Metadata ().GetXMP (); 1968 } 1969 1970 #endif // qMetadataOnConst 1971 1972 bool XMPinSidecar () METACONST 1973 { 1974 return Metadata ().XMPinSidecar (); 1975 } 1976 1977 void ResetXMP (dng_xmp * newXMP) 1978 { 1979 Metadata ().ResetXMP (newXMP); 1980 } 1981 1982 void ResetXMPSidecarNewer (dng_xmp * newXMP, bool inSidecar, bool isNewer ) 1983 { 1984 Metadata ().ResetXMPSidecarNewer (newXMP, inSidecar, isNewer); 1985 } 1986 1987 bool HaveValidEmbeddedXMP () METACONST 1988 { 1989 return Metadata ().HaveValidEmbeddedXMP (); 1990 } 1991 1992 #endif 1993 1994 // API for source MIMI type. 1995 1996 void SetSourceMIMI (const char *s) 1997 { 1998 Metadata ().SetSourceMIMI (s); 1999 } 2000 2001 // API for linearization information: 2002 2003 const dng_linearization_info * GetLinearizationInfo () const 2004 { 2005 return fLinearizationInfo.Get (); 2006 } 2007 2008 void ClearLinearizationInfo () 2009 { 2010 fLinearizationInfo.Reset (); 2011 } 2012 2013 // Linearization curve. Usually used to increase compression ratios 2014 // by storing the compressed data in a more visually uniform space. 2015 // This is a 16-bit LUT that maps the stored data back to linear. 2016 2017 void SetLinearization (AutoPtr<dng_memory_block> &curve); 2018 2019 // Active area (non-black masked pixels). These pixels are trimmed 2020 // during linearization step. 2021 2022 void SetActiveArea (const dng_rect &area); 2023 2024 // Areas that are known to contain black masked pixels that can 2025 // be used to estimate black levels. 2026 2027 void SetMaskedAreas (uint32 count, 2028 const dng_rect *area); 2029 2030 void SetMaskedArea (const dng_rect &area) 2031 { 2032 SetMaskedAreas (1, &area); 2033 } 2034 2035 // Sensor black level information. 2036 2037 void SetBlackLevel (real64 black, 2038 int32 plane = -1); 2039 2040 void SetQuadBlacks (real64 black0, 2041 real64 black1, 2042 real64 black2, 2043 real64 black3, 2044 int32 plane = -1); 2045 2046 void SetRowBlacks (const real64 *blacks, 2047 uint32 count); 2048 2049 void SetColumnBlacks (const real64 *blacks, 2050 uint32 count); 2051 2052 // Sensor white level information. 2053 2054 uint32 WhiteLevel (uint32 plane = 0) const; 2055 2056 void SetWhiteLevel (uint32 white, 2057 int32 plane = -1); 2058 2059 // API for mosaic information: 2060 2061 const dng_mosaic_info * GetMosaicInfo () const 2062 { 2063 return fMosaicInfo.Get (); 2064 } 2065 2066 void ClearMosaicInfo () 2067 { 2068 fMosaicInfo.Reset (); 2069 } 2070 2071 // ColorKeys APIs: 2072 2073 void SetColorKeys (ColorKeyCode color0, 2074 ColorKeyCode color1, 2075 ColorKeyCode color2, 2076 ColorKeyCode color3 = colorKeyMaxEnum); 2077 2078 void SetRGB () 2079 { 2080 2081 SetColorChannels (3); 2082 2083 SetColorKeys (colorKeyRed, 2084 colorKeyGreen, 2085 colorKeyBlue); 2086 2087 } 2088 2089 void SetCMY () 2090 { 2091 2092 SetColorChannels (3); 2093 2094 SetColorKeys (colorKeyCyan, 2095 colorKeyMagenta, 2096 colorKeyYellow); 2097 2098 } 2099 2100 void SetGMCY () 2101 { 2102 2103 SetColorChannels (4); 2104 2105 SetColorKeys (colorKeyGreen, 2106 colorKeyMagenta, 2107 colorKeyCyan, 2108 colorKeyYellow); 2109 2110 } 2111 2112 // APIs to set mosaic patterns. 2113 2114 void SetBayerMosaic (uint32 phase); 2115 2116 void SetFujiMosaic (uint32 phase); 2117 2118 void SetFujiMosaic6x6 (uint32 phase); 2119 2120 void SetQuadMosaic (uint32 pattern); 2121 2122 // BayerGreenSplit. 2123 2124 void SetGreenSplit (uint32 split); 2125 2126 // APIs for opcode lists. 2127 2128 const dng_opcode_list & OpcodeList1 () const 2129 { 2130 return fOpcodeList1; 2131 } 2132 2133 dng_opcode_list & OpcodeList1 () 2134 { 2135 return fOpcodeList1; 2136 } 2137 2138 const dng_opcode_list & OpcodeList2 () const 2139 { 2140 return fOpcodeList2; 2141 } 2142 2143 dng_opcode_list & OpcodeList2 () 2144 { 2145 return fOpcodeList2; 2146 } 2147 2148 const dng_opcode_list & OpcodeList3 () const 2149 { 2150 return fOpcodeList3; 2151 } 2152 2153 dng_opcode_list & OpcodeList3 () 2154 { 2155 return fOpcodeList3; 2156 } 2157 2158 // First part of parsing logic. 2159 2160 virtual void Parse (dng_host &host, 2161 dng_stream &stream, 2162 dng_info &info); 2163 2164 // Second part of parsing logic. This is split off from the 2165 // first part because these operations are useful when extending 2166 // this sdk to support non-DNG raw formats. 2167 2168 virtual void PostParse (dng_host &host, 2169 dng_stream &stream, 2170 dng_info &info); 2171 2172 // Synchronize metadata sources. 2173 2174 void SynchronizeMetadata () 2175 { 2176 Metadata ().SynchronizeMetadata (); 2177 } 2178 2179 // Routines to update the date/time field in the EXIF and XMP 2180 // metadata. 2181 2182 void UpdateDateTime (const dng_date_time_info &dt) 2183 { 2184 Metadata ().UpdateDateTime (dt); 2185 } 2186 2187 void UpdateDateTimeToNow () 2188 { 2189 Metadata ().UpdateDateTimeToNow (); 2190 } 2191 2192 // Developer's utility function to switch to four color Bayer 2193 // interpolation. This is useful for evaluating how much green 2194 // split a Bayer pattern sensor has. 2195 2196 virtual bool SetFourColorBayer (); 2197 2198 // Access routines for the image stages. 2199 2200 const dng_image * Stage1Image () const 2201 { 2202 return fStage1Image.Get (); 2203 } 2204 2205 const dng_image * Stage2Image () const 2206 { 2207 return fStage2Image.Get (); 2208 } 2209 2210 const dng_image * Stage3Image () const 2211 { 2212 return fStage3Image.Get (); 2213 } 2214 2215 // Returns the processing stage of the raw image data. 2216 2217 RawImageStageEnum RawImageStage () const 2218 { 2219 return fRawImageStage; 2220 } 2221 2222 // Returns the raw image data. 2223 2224 const dng_image & RawImage () const; 2225 2226 // API for raw floating point bit depth. 2227 2228 uint32 RawFloatBitDepth () const 2229 { 2230 return fRawFloatBitDepth; 2231 } 2232 2233 void SetRawFloatBitDepth (uint32 bitDepth) 2234 { 2235 fRawFloatBitDepth = bitDepth; 2236 } 2237 2238 // API for raw jpeg image. 2239 2240 const dng_jpeg_image * RawJPEGImage () const; 2241 2242 void SetRawJPEGImage (AutoPtr<dng_jpeg_image> &jpegImage); 2243 2244 void ClearRawJPEGImage (); 2245 2246 // API for RawJPEGImageDigest: 2247 2248 void SetRawJPEGImageDigest (const dng_fingerprint &digest) 2249 { 2250 fRawJPEGImageDigest = digest; 2251 } 2252 2253 void ClearRawJPEGImageDigest () const 2254 { 2255 fRawJPEGImageDigest.Clear (); 2256 } 2257 2258 const dng_fingerprint & RawJPEGImageDigest () const 2259 { 2260 return fRawJPEGImageDigest; 2261 } 2262 2263 void FindRawJPEGImageDigest (dng_host &host) const; 2264 2265 // Read the stage 1 image. 2266 2267 virtual void ReadStage1Image (dng_host &host, 2268 dng_stream &stream, 2269 dng_info &info); 2270 2271 // Assign the stage 1 image. 2272 2273 void SetStage1Image (AutoPtr<dng_image> &image); 2274 2275 // Assign the stage 2 image. 2276 2277 void SetStage2Image (AutoPtr<dng_image> &image); 2278 2279 // Assign the stage 3 image. 2280 2281 void SetStage3Image (AutoPtr<dng_image> &image); 2282 2283 // Build the stage 2 (linearized and range mapped) image. 2284 2285 void BuildStage2Image (dng_host &host); 2286 2287 // Build the stage 3 (demosaiced) image. 2288 2289 void BuildStage3Image (dng_host &host, 2290 int32 srcPlane = -1); 2291 2292 // Additional gain applied when building the stage 3 image. 2293 2294 void SetStage3Gain (real64 gain) 2295 { 2296 fStage3Gain = gain; 2297 } 2298 2299 real64 Stage3Gain () const 2300 { 2301 return fStage3Gain; 2302 } 2303 2304 // Adaptively encode a proxy image down to 8-bits/channel. 2305 2306 dng_image * EncodeRawProxy (dng_host &host, 2307 const dng_image &srcImage, 2308 dng_opcode_list &opcodeList) const; 2309 2310 // Convert to a proxy negative. 2311 2312 void ConvertToProxy (dng_host &host, 2313 dng_image_writer &writer, 2314 uint32 proxySize = 0, 2315 uint64 proxyCount = 0); 2316 2317 // IsPreview API: 2318 2319 void SetIsPreview (bool preview) 2320 { 2321 fIsPreview = preview; 2322 } 2323 2324 bool IsPreview () const 2325 { 2326 return fIsPreview; 2327 } 2328 2329 // IsDamaged API: 2330 2331 void SetIsDamaged (bool damaged) 2332 { 2333 fIsDamaged = damaged; 2334 } 2335 2336 bool IsDamaged () const 2337 { 2338 return fIsDamaged; 2339 } 2340 2341 // Transparancy Mask API: 2342 2343 void SetTransparencyMask (AutoPtr<dng_image> &image, 2344 uint32 bitDepth = 0); 2345 2346 const dng_image * TransparencyMask () const; 2347 2348 const dng_image * RawTransparencyMask () const; 2349 2350 uint32 RawTransparencyMaskBitDepth () const; 2351 2352 void ReadTransparencyMask (dng_host &host, 2353 dng_stream &stream, 2354 dng_info &info); 2355 2356 virtual bool NeedFlattenTransparency (dng_host &host); 2357 2358 virtual void FlattenTransparency (dng_host &host); 2359 2360 const dng_image * UnflattenedStage3Image () const; 2361 2362 protected: 2363 2364 dng_negative (dng_host &host); 2365 2366 virtual void Initialize (); 2367 2368 virtual dng_linearization_info * MakeLinearizationInfo (); 2369 2370 void NeedLinearizationInfo (); 2371 2372 virtual dng_mosaic_info * MakeMosaicInfo (); 2373 2374 void NeedMosaicInfo (); 2375 2376 virtual void DoBuildStage2 (dng_host &host); 2377 2378 virtual void DoPostOpcodeList2 (dng_host &host); 2379 2380 virtual bool NeedDefloatStage2 (dng_host &host); 2381 2382 virtual void DefloatStage2 (dng_host &host); 2383 2384 virtual void DoInterpolateStage3 (dng_host &host, 2385 int32 srcPlane); 2386 2387 virtual void DoMergeStage3 (dng_host &host); 2388 2389 virtual void DoBuildStage3 (dng_host &host, 2390 int32 srcPlane); 2391 2392 virtual void AdjustProfileForStage3 (); 2393 2394 virtual void ResizeTransparencyToMatchStage3 (dng_host &host, 2395 bool convertTo8Bit = false); 2396 2397 }; 2398 2399 /*****************************************************************************/ 2400 2401 #endif 2402 2403 /*****************************************************************************/ 2404