| /*****************************************************************************/ |
| // Copyright 2006-2011 Adobe Systems Incorporated |
| // All Rights Reserved. |
| // |
| // NOTICE: Adobe permits you to use, modify, and distribute this file in |
| // accordance with the terms of the Adobe license agreement accompanying it. |
| /*****************************************************************************/ |
| |
| /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_linearization_info.h#1 $ */ |
| /* $DateTime: 2012/05/30 13:28:51 $ */ |
| /* $Change: 832332 $ */ |
| /* $Author: tknoll $ */ |
| |
| /** \file |
| * Support for linearization table and black level tags. |
| */ |
| |
| /*****************************************************************************/ |
| |
| #ifndef __dng_linearization_info__ |
| #define __dng_linearization_info__ |
| |
| /*****************************************************************************/ |
| |
| #include "dng_auto_ptr.h" |
| #include "dng_classes.h" |
| #include "dng_memory.h" |
| #include "dng_rational.h" |
| #include "dng_rect.h" |
| #include "dng_sdk_limits.h" |
| |
| /*****************************************************************************/ |
| |
| /// \brief Class for managing data values related to DNG linearization. |
| /// |
| /// See LinearizationTable, BlackLevel, BlackLevelRepeatDim, BlackLevelDeltaH, |
| /// BlackLevelDeltaV and WhiteLevel tags in the \ref spec_dng "DNG 1.1.0 specification". |
| |
| class dng_linearization_info |
| { |
| |
| public: |
| |
| /// This rectangle defines the active (non-masked) pixels of the sensor. |
| /// The order of the rectangle coordinates is: top, left, bottom, right. |
| |
| dng_rect fActiveArea; |
| |
| /// Number of rectangles in fMaskedArea |
| |
| uint32 fMaskedAreaCount; |
| |
| /// List of non-overlapping rectangle coordinates of fully masked pixels. |
| /// Can be optionally used by DNG readers to measure the black encoding level. |
| /// The order of each rectangle's coordinates is: top, left, bottom, right. |
| /// If the raw image data has already had its black encoding level subtracted, then this tag should |
| /// not be used, since the masked pixels are no longer useful. |
| /// Note that DNG writers are still required to include an estimate and store the black encoding level |
| /// using the black level DNG tags. Support for the MaskedAreas tag is not required of DNG |
| /// readers. |
| |
| dng_rect fMaskedArea [kMaxMaskedAreas]; |
| |
| /// A lookup table that maps stored values into linear values. |
| /// This tag is typically used to increase compression ratios by storing the raw data in a non-linear, more |
| /// visually uniform space with fewer total encoding levels. |
| /// If SamplesPerPixel is not equal to one, e.g. Fuji S3 type sensor, this single table applies to all the samples for each |
| /// pixel. |
| |
| AutoPtr<dng_memory_block> fLinearizationTable; |
| |
| /// Actual number of rows in fBlackLevel pattern |
| |
| uint32 fBlackLevelRepeatRows; |
| |
| /// Actual number of columns in fBlackLevel pattern |
| |
| uint32 fBlackLevelRepeatCols; |
| |
| /// Repeating pattern of black level deltas fBlackLevelRepeatRows by fBlackLevelRepeatCols in size. |
| |
| real64 fBlackLevel [kMaxBlackPattern] [kMaxBlackPattern] [kMaxSamplesPerPixel]; |
| |
| /// Memory block of double-precision floating point deltas between baseline black level and a given column's black level |
| |
| AutoPtr<dng_memory_block> fBlackDeltaH; |
| |
| /// Memory block of double-precision floating point deltas between baseline black level and a given row's black level |
| |
| AutoPtr<dng_memory_block> fBlackDeltaV; |
| |
| /// Single white level (maximum sensor value) for each sample plane. |
| |
| real64 fWhiteLevel [kMaxSamplesPerPixel]; |
| |
| protected: |
| |
| int32 fBlackDenom; |
| |
| public: |
| |
| dng_linearization_info (); |
| |
| virtual ~dng_linearization_info (); |
| |
| void RoundBlacks (); |
| |
| virtual void Parse (dng_host &host, |
| dng_stream &stream, |
| dng_info &info); |
| |
| virtual void PostParse (dng_host &host, |
| dng_negative &negative); |
| |
| /// Compute the maximum black level for a given sample plane taking into account base |
| /// black level, repeated black level patter, and row/column delta maps. |
| |
| real64 MaxBlackLevel (uint32 plane) const; |
| |
| /// Convert raw data from in-file format to a true linear image using linearization data from DNG. |
| /// \param host Used to allocate buffers, check for aborts, and post progress updates. |
| /// \param srcImage Input pre-linearization RAW samples. |
| /// \param dstImage Output linearized image. |
| |
| virtual void Linearize (dng_host &host, |
| const dng_image &srcImage, |
| dng_image &dstImage); |
| |
| /// Compute black level for one coordinate and sample plane in the image. |
| /// \param row Row to compute black level for. |
| /// \param col Column to compute black level for. |
| /// \param plane Sample plane to compute black level for. |
| |
| dng_urational BlackLevel (uint32 row, |
| uint32 col, |
| uint32 plane) const; |
| |
| /// Number of per-row black level deltas in fBlackDeltaV. |
| |
| uint32 RowBlackCount () const; |
| |
| /// Lookup black level delta for a given row. |
| /// \param row Row to get black level for. |
| /// \retval black level for indicated row. |
| |
| dng_srational RowBlack (uint32 row) const; |
| |
| /// Number of per-column black level deltas in fBlackDeltaV. |
| |
| uint32 ColumnBlackCount () const; |
| |
| /// Lookup black level delta for a given column. |
| /// \param col Column to get black level for. |
| /// \retval black level for indicated column. |
| |
| dng_srational ColumnBlack (uint32 col) const; |
| |
| }; |
| |
| /*****************************************************************************/ |
| |
| #endif |
| |
| /*****************************************************************************/ |