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