| 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.h#1 $ */ |
| 10 | /* $DateTime: 2012/05/30 13:28:51 $ */ |
| 11 | /* $Change: 832332 $ */ |
| 12 | /* $Author: tknoll $ */ |
| 13 | |
| 14 | /** \file |
| 15 | * Classes for a 1D floating-point to floating-point function abstraction. |
| 16 | */ |
| 17 | |
| 18 | /*****************************************************************************/ |
| 19 | |
| 20 | #ifndef __dng_1d_function__ |
| 21 | #define __dng_1d_function__ |
| 22 | |
| 23 | /*****************************************************************************/ |
| 24 | |
| 25 | #include "dng_classes.h" |
| 26 | #include "dng_types.h" |
| 27 | |
| 28 | /*****************************************************************************/ |
| 29 | |
| 30 | /// \brief A 1D floating-point function. |
| 31 | /// |
| 32 | /// The domain (input) is always from 0.0 to 1.0, while the range (output) can be an arbitrary interval. |
| 33 | |
| 34 | class dng_1d_function |
| 35 | { |
| 36 | |
| 37 | public: |
| 38 | |
| 39 | virtual ~dng_1d_function (); |
| 40 | |
| 41 | /// Returns true if this function is the map x -> y such that x == y for all x . That is if Evaluate(x) == x for all x. |
| 42 | |
| 43 | virtual bool IsIdentity () const; |
| 44 | |
| 45 | /// Return the mapping for value x. |
| 46 | /// This method must be implemented by a derived class of dng_1d_function and the derived class determines the |
| 47 | /// lookup method and function used. |
| 48 | /// \param x A value between 0.0 and 1.0 (inclusive). |
| 49 | /// \retval Mapped value for x |
| 50 | |
| 51 | virtual real64 Evaluate (real64 x) const = 0; |
| 52 | |
| 53 | /// Return the reverse mapped value for y. |
| 54 | /// This method can be implemented by derived classes. The default implementation uses Newton's method to solve |
| 55 | /// for x such that Evaluate(x) == y. |
| 56 | /// \param y A value to reverse map. Should be within the range of the function implemented by this dng_1d_function . |
| 57 | /// \retval A value x such that Evaluate(x) == y (to very close approximation). |
| 58 | |
| 59 | virtual real64 EvaluateInverse (real64 y) const; |
| 60 | |
| 61 | }; |
| 62 | |
| 63 | /*****************************************************************************/ |
| 64 | |
| 65 | /// An identity (x -> y such that x == y for all x) mapping function. |
| 66 | |
| 67 | class dng_1d_identity: public dng_1d_function |
| 68 | { |
| 69 | |
| 70 | public: |
| 71 | /// Always returns true for this class. |
| 72 | |
| 73 | virtual bool IsIdentity () const; |
| 74 | |
| 75 | /// Always returns x for this class. |
| 76 | |
| 77 | virtual real64 Evaluate (real64 x) const; |
| 78 | |
| 79 | /// Always returns y for this class. |
| 80 | |
| 81 | virtual real64 EvaluateInverse (real64 y) const; |
| 82 | |
| 83 | /// This class is a singleton, and is entirely threadsafe. Use this method to get an instance of the class. |
| 84 | |
| 85 | static const dng_1d_function & Get (); |
| 86 | |
| 87 | }; |
| 88 | |
| 89 | /*****************************************************************************/ |
| 90 | |
| 91 | /// A dng_1d_function that represents the composition (curry) of two other dng_1d_functions. |
| 92 | |
| 93 | class dng_1d_concatenate: public dng_1d_function |
| 94 | { |
| 95 | |
| 96 | protected: |
| 97 | |
| 98 | const dng_1d_function &fFunction1; |
| 99 | |
| 100 | const dng_1d_function &fFunction2; |
| 101 | |
| 102 | public: |
| 103 | |
| 104 | /// Create a dng_1d_function which computes y = function2.Evaluate(function1.Evaluate(x)). |
| 105 | /// Compose function1 and function2 to compute y = function2.Evaluate(function1.Evaluate(x)). The range of function1.Evaluate must be a subset of 0.0 to 1.0 inclusive, |
| 106 | /// otherwise the result of function1(x) will be pinned (clipped) to 0.0 if <0.0 and to 1.0 if > 1.0 . |
| 107 | /// \param function1 Inner function of composition. |
| 108 | /// \param function2 Outer function of composition. |
| 109 | |
| 110 | dng_1d_concatenate (const dng_1d_function &function1, |
| 111 | const dng_1d_function &function2); |
| 112 | |
| 113 | /// Only true if both function1 and function2 have IsIdentity equal to true. |
| 114 | |
| 115 | virtual bool IsIdentity () const; |
| 116 | |
| 117 | /// Return the composed mapping for value x. |
| 118 | /// \param x A value between 0.0 and 1.0 (inclusive). |
| 119 | /// \retval function2.Evaluate(function1.Evaluate(x)). |
| 120 | |
| 121 | virtual real64 Evaluate (real64 x) const; |
| 122 | |
| 123 | /// Return the reverse mapped value for y. |
| 124 | /// Be careful using this method with compositions where the inner function does not have a range 0.0 to 1.0 . (Or better yet, do not use such functions.) |
| 125 | /// \param y A value to reverse map. Should be within the range of function2.Evaluate. |
| 126 | /// \retval A value x such that function2.Evaluate(function1.Evaluate(x)) == y (to very close approximation). |
| 127 | |
| 128 | virtual real64 EvaluateInverse (real64 y) const; |
| 129 | |
| 130 | }; |
| 131 | |
| 132 | /*****************************************************************************/ |
| 133 | |
| 134 | /// A dng_1d_function that represents the inverse of another dng_1d_function. |
| 135 | |
| 136 | class dng_1d_inverse: public dng_1d_function |
| 137 | { |
| 138 | |
| 139 | protected: |
| 140 | |
| 141 | const dng_1d_function &fFunction; |
| 142 | |
| 143 | public: |
| 144 | |
| 145 | dng_1d_inverse (const dng_1d_function &f); |
| 146 | |
| 147 | virtual bool IsIdentity () const; |
| 148 | |
| 149 | virtual real64 Evaluate (real64 x) const; |
| 150 | |
| 151 | virtual real64 EvaluateInverse (real64 y) const; |
| 152 | |
| 153 | }; |
| 154 | |
| 155 | /*****************************************************************************/ |
| 156 | |
| 157 | #endif |
| 158 | |
| 159 | /*****************************************************************************/ |
| 160 | |