| 1 | /*****************************************************************************/ | 
|---|
| 2 | // Copyright 2006-2008 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_table.cpp#1 $ */ | 
|---|
| 10 | /* $DateTime: 2012/05/30 13:28:51 $ */ | 
|---|
| 11 | /* $Change: 832332 $ */ | 
|---|
| 12 | /* $Author: tknoll $ */ | 
|---|
| 13 |  | 
|---|
| 14 | /*****************************************************************************/ | 
|---|
| 15 |  | 
|---|
| 16 | #include "dng_1d_table.h" | 
|---|
| 17 |  | 
|---|
| 18 | #include "dng_1d_function.h" | 
|---|
| 19 | #include "dng_memory.h" | 
|---|
| 20 | #include "dng_utils.h" | 
|---|
| 21 |  | 
|---|
| 22 | /*****************************************************************************/ | 
|---|
| 23 |  | 
|---|
| 24 | dng_1d_table::dng_1d_table () | 
|---|
| 25 |  | 
|---|
| 26 | :	fBuffer () | 
|---|
| 27 | ,	fTable  (NULL) | 
|---|
| 28 |  | 
|---|
| 29 | { | 
|---|
| 30 |  | 
|---|
| 31 | } | 
|---|
| 32 |  | 
|---|
| 33 | /*****************************************************************************/ | 
|---|
| 34 |  | 
|---|
| 35 | dng_1d_table::~dng_1d_table () | 
|---|
| 36 | { | 
|---|
| 37 |  | 
|---|
| 38 | } | 
|---|
| 39 |  | 
|---|
| 40 | /*****************************************************************************/ | 
|---|
| 41 |  | 
|---|
| 42 | void dng_1d_table::SubDivide (const dng_1d_function &function, | 
|---|
| 43 | uint32 lower, | 
|---|
| 44 | uint32 upper, | 
|---|
| 45 | real32 maxDelta) | 
|---|
| 46 | { | 
|---|
| 47 |  | 
|---|
| 48 | uint32 range = upper - lower; | 
|---|
| 49 |  | 
|---|
| 50 | bool subDivide = (range > (kTableSize >> 8)); | 
|---|
| 51 |  | 
|---|
| 52 | if (!subDivide) | 
|---|
| 53 | { | 
|---|
| 54 |  | 
|---|
| 55 | real32 delta = Abs_real32 (fTable [upper] - | 
|---|
| 56 | fTable [lower]); | 
|---|
| 57 |  | 
|---|
| 58 | if (delta > maxDelta) | 
|---|
| 59 | { | 
|---|
| 60 |  | 
|---|
| 61 | subDivide = true; | 
|---|
| 62 |  | 
|---|
| 63 | } | 
|---|
| 64 |  | 
|---|
| 65 | } | 
|---|
| 66 |  | 
|---|
| 67 | if (subDivide) | 
|---|
| 68 | { | 
|---|
| 69 |  | 
|---|
| 70 | uint32 middle = (lower + upper) >> 1; | 
|---|
| 71 |  | 
|---|
| 72 | fTable [middle] = (real32) function.Evaluate (middle * (1.0 / (real64) kTableSize)); | 
|---|
| 73 |  | 
|---|
| 74 | if (range > 2) | 
|---|
| 75 | { | 
|---|
| 76 |  | 
|---|
| 77 | SubDivide (function, lower, middle, maxDelta); | 
|---|
| 78 |  | 
|---|
| 79 | SubDivide (function, middle, upper, maxDelta); | 
|---|
| 80 |  | 
|---|
| 81 | } | 
|---|
| 82 |  | 
|---|
| 83 | } | 
|---|
| 84 |  | 
|---|
| 85 | else | 
|---|
| 86 | { | 
|---|
| 87 |  | 
|---|
| 88 | real64 y0 = fTable [lower]; | 
|---|
| 89 | real64 y1 = fTable [upper]; | 
|---|
| 90 |  | 
|---|
| 91 | real64 delta = (y1 - y0) / (real64) range; | 
|---|
| 92 |  | 
|---|
| 93 | for (uint32 j = lower + 1; j < upper; j++) | 
|---|
| 94 | { | 
|---|
| 95 |  | 
|---|
| 96 | y0 += delta; | 
|---|
| 97 |  | 
|---|
| 98 | fTable [j] = (real32) y0; | 
|---|
| 99 |  | 
|---|
| 100 | } | 
|---|
| 101 |  | 
|---|
| 102 | } | 
|---|
| 103 |  | 
|---|
| 104 | } | 
|---|
| 105 |  | 
|---|
| 106 | /*****************************************************************************/ | 
|---|
| 107 |  | 
|---|
| 108 | void dng_1d_table::Initialize (dng_memory_allocator &allocator, | 
|---|
| 109 | const dng_1d_function &function, | 
|---|
| 110 | bool subSample) | 
|---|
| 111 | { | 
|---|
| 112 |  | 
|---|
| 113 | fBuffer.Reset (allocator.Allocate ((kTableSize + 2) * sizeof (real32))); | 
|---|
| 114 |  | 
|---|
| 115 | fTable = fBuffer->Buffer_real32 (); | 
|---|
| 116 |  | 
|---|
| 117 | if (subSample) | 
|---|
| 118 | { | 
|---|
| 119 |  | 
|---|
| 120 | fTable [0         ] = (real32) function.Evaluate (0.0); | 
|---|
| 121 | fTable [kTableSize] = (real32) function.Evaluate (1.0); | 
|---|
| 122 |  | 
|---|
| 123 | real32 maxDelta = Max_real32 (Abs_real32 (fTable [kTableSize] - | 
|---|
| 124 | fTable [0         ]), 1.0f) * | 
|---|
| 125 | (1.0f / 256.0f); | 
|---|
| 126 |  | 
|---|
| 127 | SubDivide (function, | 
|---|
| 128 | 0, | 
|---|
| 129 | kTableSize, | 
|---|
| 130 | maxDelta); | 
|---|
| 131 |  | 
|---|
| 132 | } | 
|---|
| 133 |  | 
|---|
| 134 | else | 
|---|
| 135 | { | 
|---|
| 136 |  | 
|---|
| 137 | for (uint32 j = 0; j <= kTableSize; j++) | 
|---|
| 138 | { | 
|---|
| 139 |  | 
|---|
| 140 | real64 x = j * (1.0 / (real64) kTableSize); | 
|---|
| 141 |  | 
|---|
| 142 | real64 y = function.Evaluate (x); | 
|---|
| 143 |  | 
|---|
| 144 | fTable [j] = (real32) y; | 
|---|
| 145 |  | 
|---|
| 146 | } | 
|---|
| 147 |  | 
|---|
| 148 | } | 
|---|
| 149 |  | 
|---|
| 150 | fTable [kTableSize + 1] = fTable [kTableSize]; | 
|---|
| 151 |  | 
|---|
| 152 | } | 
|---|
| 153 |  | 
|---|
| 154 | /*****************************************************************************/ | 
|---|
| 155 |  | 
|---|
| 156 | void dng_1d_table::Expand16 (uint16 *table16) const | 
|---|
| 157 | { | 
|---|
| 158 |  | 
|---|
| 159 | real64 step = (real64) kTableSize / 65535.0; | 
|---|
| 160 |  | 
|---|
| 161 | real64 y0 = fTable [0]; | 
|---|
| 162 | real64 y1 = fTable [1]; | 
|---|
| 163 |  | 
|---|
| 164 | real64 base  = y0 * 65535.0 + 0.5; | 
|---|
| 165 | real64 slope = (y1 - y0) * 65535.0; | 
|---|
| 166 |  | 
|---|
| 167 | uint32 index = 1; | 
|---|
| 168 | real64 fract = 0.0; | 
|---|
| 169 |  | 
|---|
| 170 | for (uint32 j = 0; j < 0x10000; j++) | 
|---|
| 171 | { | 
|---|
| 172 |  | 
|---|
| 173 | table16 [j] = (uint16) (base + slope * fract); | 
|---|
| 174 |  | 
|---|
| 175 | fract += step; | 
|---|
| 176 |  | 
|---|
| 177 | if (fract > 1.0) | 
|---|
| 178 | { | 
|---|
| 179 |  | 
|---|
| 180 | index += 1; | 
|---|
| 181 | fract -= 1.0; | 
|---|
| 182 |  | 
|---|
| 183 | y0 = y1; | 
|---|
| 184 | y1 = fTable [index]; | 
|---|
| 185 |  | 
|---|
| 186 | base  = y0 * 65535.0 + 0.5; | 
|---|
| 187 | slope = (y1 - y0) * 65535.0; | 
|---|
| 188 |  | 
|---|
| 189 | } | 
|---|
| 190 |  | 
|---|
| 191 | } | 
|---|
| 192 |  | 
|---|
| 193 | } | 
|---|
| 194 |  | 
|---|
| 195 | /*****************************************************************************/ | 
|---|
| 196 |  | 
|---|