dng_linearization_info.h revision ffee7a66caebb7027d7591405e8494e3c9e8517e
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
39class 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