10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2006-2008 Adobe Systems Incorporated 30b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// All Rights Reserved. 40b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// 50b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// NOTICE: Adobe permits you to use, modify, and distribute this file in 60b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it. 70b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 80b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 90b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_1d_table.h#1 $ */ 100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */ 110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 832332 $ */ 120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */ 130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file 150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * Definition of a lookup table based 1D floating-point to floating-point function abstraction using linear interpolation. 160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */ 170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_1d_table__ 210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_1d_table__ 220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_assertions.h" 260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_auto_ptr.h" 270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_classes.h" 280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_types.h" 290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief A 1D floating-point lookup table using linear interpolation. 330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_1d_table 350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Constants denoting size of table. 400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener enum 420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener kTableBits = 12, //< Table is always a power of 2 in size. This is log2(kTableSize). 440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener kTableSize = (1 << kTableBits) //< Number of entries in table. 450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener protected: 480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener AutoPtr<dng_memory_block> fBuffer; 500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 *fTable; 520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_1d_table (); 560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual ~dng_1d_table (); 580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Set up table, initialize entries using functiion. 600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// This method can throw an exception, e.g. if there is not enough memory. 610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param allocator Memory allocator from which table memory is allocated. 620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param function Table is initialized with values of finction.Evalluate(0.0) to function.Evaluate(1.0). 630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param subSample If true, only sample the function a limited number of times and interpolate. 640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener void Initialize (dng_memory_allocator &allocator, 660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_1d_function &function, 670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool subSample = false); 680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Lookup and interpolate mapping for an input. 700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param x value from 0.0 to 1.0 used as input for mapping 710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \retval Approximation of function.Evaluate(x) 720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 Interpolate (real32 x) const 740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 y = x * (real32) kTableSize; 770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener int32 index = (int32) y; 790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener if (index < 0 || index > kTableSize) 810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener ThrowBadFormat("Index out of range."); 840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener DNG_ASSERT (index >= 0 && index <= kTableSize, 880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener "dng_1d_table::Interpolate parameter out of range"); 890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 z = (real32) index; 910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 fract = y - z; 930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fTable [index ] * (1.0f - fract) + 950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener fTable [index + 1] * ( fract); 960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Direct access function for table data. 1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const real32 * Table () const 1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fTable; 1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Expand the table to a 16-bit to 16-bit table. 1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener void Expand16 (uint16 *table16) const; 1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener void SubDivide (const dng_1d_function &function, 1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 lower, 1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 upper, 1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 maxDelta); 1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener // Hidden copy constructor and assignment operator. 1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_1d_table (const dng_1d_table &table); 1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_1d_table & operator= (const dng_1d_table &table); 1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif 1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 130