Home | History | Annotate | Download | only in source
      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