Home | History | Annotate | Download | only in source
      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