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