1/*****************************************************************************/
2// Copyright 2006 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_function.cpp#1 $ */
10/* $DateTime: 2012/05/30 13:28:51 $ */
11/* $Change: 832332 $ */
12/* $Author: tknoll $ */
13
14/*****************************************************************************/
15
16#include "dng_1d_function.h"
17
18#include "dng_utils.h"
19
20/*****************************************************************************/
21
22dng_1d_function::~dng_1d_function ()
23	{
24
25	}
26
27/*****************************************************************************/
28
29bool dng_1d_function::IsIdentity () const
30	{
31
32	return false;
33
34	}
35
36/*****************************************************************************/
37
38real64 dng_1d_function::EvaluateInverse (real64 y) const
39	{
40
41	const uint32 kMaxIterations = 30;
42	const real64 kNearZero      = 1.0e-10;
43
44	real64 x0 = 0.0;
45	real64 y0 = Evaluate (x0);
46
47	real64 x1 = 1.0;
48	real64 y1 = Evaluate (x1);
49
50	for (uint32 iteration = 0; iteration < kMaxIterations; iteration++)
51		{
52
53		if (Abs_real64 (y1 - y0) < kNearZero)
54			{
55			break;
56			}
57
58		real64 x2 = Pin_real64 (0.0,
59								x1 + (y - y1) * (x1 - x0) / (y1 - y0),
60								1.0);
61
62		real64 y2 = Evaluate (x2);
63
64		x0 = x1;
65		y0 = y1;
66
67		x1 = x2;
68		y1 = y2;
69
70		}
71
72	return x1;
73
74	}
75
76/*****************************************************************************/
77
78bool dng_1d_identity::IsIdentity () const
79	{
80
81	return true;
82
83	}
84
85/*****************************************************************************/
86
87real64 dng_1d_identity::Evaluate (real64 x) const
88	{
89
90	return x;
91
92	}
93
94/*****************************************************************************/
95
96real64 dng_1d_identity::EvaluateInverse (real64 x) const
97	{
98
99	return x;
100
101	}
102
103/*****************************************************************************/
104
105const dng_1d_function & dng_1d_identity::Get ()
106	{
107
108	static dng_1d_identity static_function;
109
110	return static_function;
111
112	}
113
114/*****************************************************************************/
115
116dng_1d_concatenate::dng_1d_concatenate (const dng_1d_function &function1,
117										const dng_1d_function &function2)
118
119	:	fFunction1 (function1)
120	,	fFunction2 (function2)
121
122	{
123
124	}
125
126/*****************************************************************************/
127
128bool dng_1d_concatenate::IsIdentity () const
129	{
130
131	return fFunction1.IsIdentity () &&
132		   fFunction2.IsIdentity ();
133
134	}
135
136/*****************************************************************************/
137
138real64 dng_1d_concatenate::Evaluate (real64 x) const
139	{
140
141	real64 y = Pin_real64 (0.0, fFunction1.Evaluate (x), 1.0);
142
143	return fFunction2.Evaluate (y);
144
145	}
146
147/*****************************************************************************/
148
149real64 dng_1d_concatenate::EvaluateInverse (real64 x) const
150	{
151
152	real64 y = fFunction2.EvaluateInverse (x);
153
154	return fFunction1.EvaluateInverse (y);
155
156	}
157
158/*****************************************************************************/
159
160dng_1d_inverse::dng_1d_inverse (const dng_1d_function &f)
161
162	:	fFunction (f)
163
164	{
165
166	}
167
168/*****************************************************************************/
169
170bool dng_1d_inverse::IsIdentity () const
171	{
172
173	return fFunction.IsIdentity ();
174
175	}
176
177/*****************************************************************************/
178
179real64 dng_1d_inverse::Evaluate (real64 x) const
180	{
181
182	return fFunction.EvaluateInverse (x);
183
184	}
185
186/*****************************************************************************/
187
188real64 dng_1d_inverse::EvaluateInverse (real64 y) const
189	{
190
191	return fFunction.Evaluate (y);
192
193	}
194
195/*****************************************************************************/
196