| /*****************************************************************************/ |
| // Copyright 2006 Adobe Systems Incorporated |
| // All Rights Reserved. |
| // |
| // NOTICE: Adobe permits you to use, modify, and distribute this file in |
| // accordance with the terms of the Adobe license agreement accompanying it. |
| /*****************************************************************************/ |
| |
| /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_1d_function.cpp#1 $ */ |
| /* $DateTime: 2012/05/30 13:28:51 $ */ |
| /* $Change: 832332 $ */ |
| /* $Author: tknoll $ */ |
| |
| /*****************************************************************************/ |
| |
| #include "dng_1d_function.h" |
| |
| #include "dng_utils.h" |
| |
| /*****************************************************************************/ |
| |
| dng_1d_function::~dng_1d_function () |
| { |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| bool dng_1d_function::IsIdentity () const |
| { |
| |
| return false; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_1d_function::EvaluateInverse (real64 y) const |
| { |
| |
| const uint32 kMaxIterations = 30; |
| const real64 kNearZero = 1.0e-10; |
| |
| real64 x0 = 0.0; |
| real64 y0 = Evaluate (x0); |
| |
| real64 x1 = 1.0; |
| real64 y1 = Evaluate (x1); |
| |
| for (uint32 iteration = 0; iteration < kMaxIterations; iteration++) |
| { |
| |
| if (Abs_real64 (y1 - y0) < kNearZero) |
| { |
| break; |
| } |
| |
| real64 x2 = Pin_real64 (0.0, |
| x1 + (y - y1) * (x1 - x0) / (y1 - y0), |
| 1.0); |
| |
| real64 y2 = Evaluate (x2); |
| |
| x0 = x1; |
| y0 = y1; |
| |
| x1 = x2; |
| y1 = y2; |
| |
| } |
| |
| return x1; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| bool dng_1d_identity::IsIdentity () const |
| { |
| |
| return true; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_1d_identity::Evaluate (real64 x) const |
| { |
| |
| return x; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_1d_identity::EvaluateInverse (real64 x) const |
| { |
| |
| return x; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| const dng_1d_function & dng_1d_identity::Get () |
| { |
| |
| static dng_1d_identity static_function; |
| |
| return static_function; |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| dng_1d_concatenate::dng_1d_concatenate (const dng_1d_function &function1, |
| const dng_1d_function &function2) |
| |
| : fFunction1 (function1) |
| , fFunction2 (function2) |
| |
| { |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| bool dng_1d_concatenate::IsIdentity () const |
| { |
| |
| return fFunction1.IsIdentity () && |
| fFunction2.IsIdentity (); |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_1d_concatenate::Evaluate (real64 x) const |
| { |
| |
| real64 y = Pin_real64 (0.0, fFunction1.Evaluate (x), 1.0); |
| |
| return fFunction2.Evaluate (y); |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_1d_concatenate::EvaluateInverse (real64 x) const |
| { |
| |
| real64 y = fFunction2.EvaluateInverse (x); |
| |
| return fFunction1.EvaluateInverse (y); |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| dng_1d_inverse::dng_1d_inverse (const dng_1d_function &f) |
| |
| : fFunction (f) |
| |
| { |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| bool dng_1d_inverse::IsIdentity () const |
| { |
| |
| return fFunction.IsIdentity (); |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_1d_inverse::Evaluate (real64 x) const |
| { |
| |
| return fFunction.EvaluateInverse (x); |
| |
| } |
| |
| /*****************************************************************************/ |
| |
| real64 dng_1d_inverse::EvaluateInverse (real64 y) const |
| { |
| |
| return fFunction.Evaluate (y); |
| |
| } |
| |
| /*****************************************************************************/ |