1 /*****************************************************************************/ 2 // Copyright 2006-2011 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_linearization_info.h#1 $ */ 10 /* $DateTime: 2012/05/30 13:28:51 $ */ 11 /* $Change: 832332 $ */ 12 /* $Author: tknoll $ */ 13 14 /** \file 15 * Support for linearization table and black level tags. 16 */ 17 18 /*****************************************************************************/ 19 20 #ifndef __dng_linearization_info__ 21 #define __dng_linearization_info__ 22 23 /*****************************************************************************/ 24 25 #include "dng_auto_ptr.h" 26 #include "dng_classes.h" 27 #include "dng_memory.h" 28 #include "dng_rational.h" 29 #include "dng_rect.h" 30 #include "dng_sdk_limits.h" 31 32 /*****************************************************************************/ 33 34 /// \brief Class for managing data values related to DNG linearization. 35 /// 36 /// See LinearizationTable, BlackLevel, BlackLevelRepeatDim, BlackLevelDeltaH, 37 /// BlackLevelDeltaV and WhiteLevel tags in the \ref spec_dng "DNG 1.1.0 specification". 38 39 class dng_linearization_info 40 { 41 42 public: 43 44 /// This rectangle defines the active (non-masked) pixels of the sensor. 45 /// The order of the rectangle coordinates is: top, left, bottom, right. 46 47 dng_rect fActiveArea; 48 49 /// Number of rectangles in fMaskedArea 50 51 uint32 fMaskedAreaCount; 52 53 /// List of non-overlapping rectangle coordinates of fully masked pixels. 54 /// Can be optionally used by DNG readers to measure the black encoding level. 55 /// The order of each rectangle's coordinates is: top, left, bottom, right. 56 /// If the raw image data has already had its black encoding level subtracted, then this tag should 57 /// not be used, since the masked pixels are no longer useful. 58 /// Note that DNG writers are still required to include an estimate and store the black encoding level 59 /// using the black level DNG tags. Support for the MaskedAreas tag is not required of DNG 60 /// readers. 61 62 dng_rect fMaskedArea [kMaxMaskedAreas]; 63 64 /// A lookup table that maps stored values into linear values. 65 /// This tag is typically used to increase compression ratios by storing the raw data in a non-linear, more 66 /// visually uniform space with fewer total encoding levels. 67 /// If SamplesPerPixel is not equal to one, e.g. Fuji S3 type sensor, this single table applies to all the samples for each 68 /// pixel. 69 70 AutoPtr<dng_memory_block> fLinearizationTable; 71 72 /// Actual number of rows in fBlackLevel pattern 73 74 uint32 fBlackLevelRepeatRows; 75 76 /// Actual number of columns in fBlackLevel pattern 77 78 uint32 fBlackLevelRepeatCols; 79 80 /// Repeating pattern of black level deltas fBlackLevelRepeatRows by fBlackLevelRepeatCols in size. 81 82 real64 fBlackLevel [kMaxBlackPattern] [kMaxBlackPattern] [kMaxSamplesPerPixel]; 83 84 /// Memory block of double-precision floating point deltas between baseline black level and a given column's black level 85 86 AutoPtr<dng_memory_block> fBlackDeltaH; 87 88 /// Memory block of double-precision floating point deltas between baseline black level and a given row's black level 89 90 AutoPtr<dng_memory_block> fBlackDeltaV; 91 92 /// Single white level (maximum sensor value) for each sample plane. 93 94 real64 fWhiteLevel [kMaxSamplesPerPixel]; 95 96 protected: 97 98 int32 fBlackDenom; 99 100 public: 101 102 dng_linearization_info (); 103 104 virtual ~dng_linearization_info (); 105 106 void RoundBlacks (); 107 108 virtual void Parse (dng_host &host, 109 dng_stream &stream, 110 dng_info &info); 111 112 virtual void PostParse (dng_host &host, 113 dng_negative &negative); 114 115 /// Compute the maximum black level for a given sample plane taking into account base 116 /// black level, repeated black level patter, and row/column delta maps. 117 118 real64 MaxBlackLevel (uint32 plane) const; 119 120 /// Convert raw data from in-file format to a true linear image using linearization data from DNG. 121 /// \param host Used to allocate buffers, check for aborts, and post progress updates. 122 /// \param srcImage Input pre-linearization RAW samples. 123 /// \param dstImage Output linearized image. 124 125 virtual void Linearize (dng_host &host, 126 const dng_image &srcImage, 127 dng_image &dstImage); 128 129 /// Compute black level for one coordinate and sample plane in the image. 130 /// \param row Row to compute black level for. 131 /// \param col Column to compute black level for. 132 /// \param plane Sample plane to compute black level for. 133 134 dng_urational BlackLevel (uint32 row, 135 uint32 col, 136 uint32 plane) const; 137 138 /// Number of per-row black level deltas in fBlackDeltaV. 139 140 uint32 RowBlackCount () const; 141 142 /// Lookup black level delta for a given row. 143 /// \param row Row to get black level for. 144 /// \retval black level for indicated row. 145 146 dng_srational RowBlack (uint32 row) const; 147 148 /// Number of per-column black level deltas in fBlackDeltaV. 149 150 uint32 ColumnBlackCount () const; 151 152 /// Lookup black level delta for a given column. 153 /// \param col Column to get black level for. 154 /// \retval black level for indicated column. 155 156 dng_srational ColumnBlack (uint32 col) const; 157 158 }; 159 160 /*****************************************************************************/ 161 162 #endif 163 164 /*****************************************************************************/ 165