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 22 dng_1d_function::~dng_1d_function () 23 { 24 25 } 26 27 /*****************************************************************************/ 28 29 bool dng_1d_function::IsIdentity () const 30 { 31 32 return false; 33 34 } 35 36 /*****************************************************************************/ 37 38 real64 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 78 bool dng_1d_identity::IsIdentity () const 79 { 80 81 return true; 82 83 } 84 85 /*****************************************************************************/ 86 87 real64 dng_1d_identity::Evaluate (real64 x) const 88 { 89 90 return x; 91 92 } 93 94 /*****************************************************************************/ 95 96 real64 dng_1d_identity::EvaluateInverse (real64 x) const 97 { 98 99 return x; 100 101 } 102 103 /*****************************************************************************/ 104 105 const 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 116 dng_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 128 bool dng_1d_concatenate::IsIdentity () const 129 { 130 131 return fFunction1.IsIdentity () && 132 fFunction2.IsIdentity (); 133 134 } 135 136 /*****************************************************************************/ 137 138 real64 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 149 real64 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 160 dng_1d_inverse::dng_1d_inverse (const dng_1d_function &f) 161 162 : fFunction (f) 163 164 { 165 166 } 167 168 /*****************************************************************************/ 169 170 bool dng_1d_inverse::IsIdentity () const 171 { 172 173 return fFunction.IsIdentity (); 174 175 } 176 177 /*****************************************************************************/ 178 179 real64 dng_1d_inverse::Evaluate (real64 x) const 180 { 181 182 return fFunction.EvaluateInverse (x); 183 184 } 185 186 /*****************************************************************************/ 187 188 real64 dng_1d_inverse::EvaluateInverse (real64 y) const 189 { 190 191 return fFunction.Evaluate (y); 192 193 } 194 195 /*****************************************************************************/ 196