1/*****************************************************************************/
2// Copyright 2006-2008 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_1d_table.h#1 $ */
10/* $DateTime: 2012/05/30 13:28:51 $ */
11/* $Change: 832332 $ */
12/* $Author: tknoll $ */
13
14/** \file
15 * Definition of a lookup table based 1D floating-point to floating-point function abstraction using linear interpolation.
16 */
17
18/*****************************************************************************/
19
20#ifndef __dng_1d_table__
21#define __dng_1d_table__
22
23/*****************************************************************************/
24
25#include "dng_assertions.h"
26#include "dng_auto_ptr.h"
27#include "dng_classes.h"
28#include "dng_types.h"
29
30/*****************************************************************************/
31
32/// \brief A 1D floating-point lookup table using linear interpolation.
33
34class dng_1d_table
35	{
36
37	public:
38
39		/// Constants denoting size of table.
40
41		enum
42			{
43			kTableBits = 12,				//< Table is always a power of 2 in size. This is log2(kTableSize).
44			kTableSize = (1 << kTableBits)	//< Number of entries in table.
45			};
46
47	protected:
48
49		AutoPtr<dng_memory_block> fBuffer;
50
51		real32 *fTable;
52
53	public:
54
55		dng_1d_table ();
56
57		virtual ~dng_1d_table ();
58
59		/// Set up table, initialize entries using functiion.
60		/// This method can throw an exception, e.g. if there is not enough memory.
61		/// \param allocator Memory allocator from which table memory is allocated.
62		/// \param function Table is initialized with values of finction.Evalluate(0.0) to function.Evaluate(1.0).
63		/// \param subSample If true, only sample the function a limited number of times and interpolate.
64
65		void Initialize (dng_memory_allocator &allocator,
66						 const dng_1d_function &function,
67						 bool subSample = false);
68
69		/// Lookup and interpolate mapping for an input.
70		/// \param x value from 0.0 to 1.0 used as input for mapping
71		/// \retval Approximation of function.Evaluate(x)
72
73		real32 Interpolate (real32 x) const
74			{
75
76			real32 y = x * (real32) kTableSize;
77
78			int32 index = (int32) y;
79
80			if (index < 0 || index > kTableSize)
81				{
82
83				ThrowBadFormat("Index out of range.");
84
85				}
86
87			DNG_ASSERT (index >= 0 && index <= kTableSize,
88						"dng_1d_table::Interpolate parameter out of range");
89
90			real32 z = (real32) index;
91
92			real32 fract = y - z;
93
94			return fTable [index    ] * (1.0f - fract) +
95				   fTable [index + 1] * (       fract);
96
97			}
98
99		/// Direct access function for table data.
100
101		const real32 * Table () const
102			{
103			return fTable;
104			}
105
106		/// Expand the table to a 16-bit to 16-bit table.
107
108		void Expand16 (uint16 *table16) const;
109
110	private:
111
112		void SubDivide (const dng_1d_function &function,
113						uint32 lower,
114						uint32 upper,
115						real32 maxDelta);
116
117		// Hidden copy constructor and assignment operator.
118
119		dng_1d_table (const dng_1d_table &table);
120
121		dng_1d_table & operator= (const dng_1d_table &table);
122
123	};
124
125/*****************************************************************************/
126
127#endif
128
129/*****************************************************************************/
130