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