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.cpp#1 $ */
10/* $DateTime: 2012/05/30 13:28:51 $ */
11/* $Change: 832332 $ */
12/* $Author: tknoll $ */
13
14/*****************************************************************************/
15
16#include "dng_1d_table.h"
17
18#include "dng_1d_function.h"
19#include "dng_memory.h"
20#include "dng_utils.h"
21
22/*****************************************************************************/
23
24dng_1d_table::dng_1d_table ()
25
26 : fBuffer ()
27 , fTable (NULL)
28
29 {
30
31 }
32
33/*****************************************************************************/
34
35dng_1d_table::~dng_1d_table ()
36 {
37
38 }
39
40/*****************************************************************************/
41
42void dng_1d_table::SubDivide (const dng_1d_function &function,
43 uint32 lower,
44 uint32 upper,
45 real32 maxDelta)
46 {
47
48 uint32 range = upper - lower;
49
50 bool subDivide = (range > (kTableSize >> 8));
51
52 if (!subDivide)
53 {
54
55 real32 delta = Abs_real32 (fTable [upper] -
56 fTable [lower]);
57
58 if (delta > maxDelta)
59 {
60
61 subDivide = true;
62
63 }
64
65 }
66
67 if (subDivide)
68 {
69
70 uint32 middle = (lower + upper) >> 1;
71
72 fTable [middle] = (real32) function.Evaluate (middle * (1.0 / (real64) kTableSize));
73
74 if (range > 2)
75 {
76
77 SubDivide (function, lower, middle, maxDelta);
78
79 SubDivide (function, middle, upper, maxDelta);
80
81 }
82
83 }
84
85 else
86 {
87
88 real64 y0 = fTable [lower];
89 real64 y1 = fTable [upper];
90
91 real64 delta = (y1 - y0) / (real64) range;
92
93 for (uint32 j = lower + 1; j < upper; j++)
94 {
95
96 y0 += delta;
97
98 fTable [j] = (real32) y0;
99
100 }
101
102 }
103
104 }
105
106/*****************************************************************************/
107
108void dng_1d_table::Initialize (dng_memory_allocator &allocator,
109 const dng_1d_function &function,
110 bool subSample)
111 {
112
113 fBuffer.Reset (allocator.Allocate ((kTableSize + 2) * sizeof (real32)));
114
115 fTable = fBuffer->Buffer_real32 ();
116
117 if (subSample)
118 {
119
120 fTable [0 ] = (real32) function.Evaluate (0.0);
121 fTable [kTableSize] = (real32) function.Evaluate (1.0);
122
123 real32 maxDelta = Max_real32 (Abs_real32 (fTable [kTableSize] -
124 fTable [0 ]), 1.0f) *
125 (1.0f / 256.0f);
126
127 SubDivide (function,
128 0,
129 kTableSize,
130 maxDelta);
131
132 }
133
134 else
135 {
136
137 for (uint32 j = 0; j <= kTableSize; j++)
138 {
139
140 real64 x = j * (1.0 / (real64) kTableSize);
141
142 real64 y = function.Evaluate (x);
143
144 fTable [j] = (real32) y;
145
146 }
147
148 }
149
150 fTable [kTableSize + 1] = fTable [kTableSize];
151
152 }
153
154/*****************************************************************************/
155
156void dng_1d_table::Expand16 (uint16 *table16) const
157 {
158
159 real64 step = (real64) kTableSize / 65535.0;
160
161 real64 y0 = fTable [0];
162 real64 y1 = fTable [1];
163
164 real64 base = y0 * 65535.0 + 0.5;
165 real64 slope = (y1 - y0) * 65535.0;
166
167 uint32 index = 1;
168 real64 fract = 0.0;
169
170 for (uint32 j = 0; j < 0x10000; j++)
171 {
172
173 table16 [j] = (uint16) (base + slope * fract);
174
175 fract += step;
176
177 if (fract > 1.0)
178 {
179
180 index += 1;
181 fract -= 1.0;
182
183 y0 = y1;
184 y1 = fTable [index];
185
186 base = y0 * 65535.0 + 0.5;
187 slope = (y1 - y0) * 65535.0;
188
189 }
190
191 }
192
193 }
194
195/*****************************************************************************/
196