16e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 26e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// Copyright 2006-2011 Adobe Systems Incorporated 36e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// All Rights Reserved. 46e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// 56e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// NOTICE: Adobe permits you to use, modify, and distribute this file in 66e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// accordance with the terms of the Adobe license agreement accompanying it. 76e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 86e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 96e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_linearization_info.cpp#1 $ */ 106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $DateTime: 2012/05/30 13:28:51 $ */ 116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Change: 832332 $ */ 126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Author: tknoll $ */ 136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_linearization_info.h" 176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_area_task.h" 196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_exceptions.h" 206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_host.h" 216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_image.h" 226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_info.h" 236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_negative.h" 246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_pixel_buffer.h" 256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_safe_arithmetic.h" 266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_tag_types.h" 276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_tile_iterator.h" 286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_utils.h" 296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_linearize_plane 336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim private: 366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_image & fSrcImage; 386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_image & fDstImage; 396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 fPlane; 416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_rect fActiveArea; 436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 fSrcPixelType; 456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 fDstPixelType; 466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim bool fReal32; 486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 fScale; 506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim AutoPtr<dng_memory_block> fScale_buffer; 526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 fBlack_2D_rows; 546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 fBlack_2D_cols; 556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim AutoPtr<dng_memory_block> fBlack_2D_buffer; 576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 fBlack_1D_rows; 596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim AutoPtr<dng_memory_block> fBlack_1D_buffer; 616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim public: 636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_linearize_plane (dng_host &host, 656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_linearization_info &info, 666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_image &srcImage, 676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_image &dstImage, 686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 plane); 696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ~dng_linearize_plane (); 716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim void Process (const dng_rect &tile); 736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim }; 756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_plane::dng_linearize_plane (dng_host &host, 796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_linearization_info &info, 806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_image &srcImage, 816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_image &dstImage, 826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 plane) 836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fSrcImage (srcImage) 856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fDstImage (dstImage) 866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fPlane (plane) 876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fActiveArea (info.fActiveArea) 886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fSrcPixelType (srcImage.PixelType ()) 896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fDstPixelType (dstImage.PixelType ()) 906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fReal32 (false) 916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fScale (0.0f) 926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fScale_buffer () 936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlack_2D_rows (0) 946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlack_2D_cols (0) 956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlack_2D_buffer () 966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlack_1D_rows (0) 976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlack_1D_buffer () 986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 j; 1026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 k; 1036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Make sure the source pixel type is supported. 1056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType != ttByte && 1076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSrcPixelType != ttShort && 1086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSrcPixelType != ttLong && 1096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSrcPixelType != ttFloat) 1106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim DNG_REPORT ("Unsupported source pixel type"); 1136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ThrowProgramError (); 1156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fDstPixelType != ttShort && 1196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDstPixelType != ttFloat) 1206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim DNG_REPORT ("Unsupported destination pixel type"); 1236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ThrowProgramError (); 1256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType == ttFloat && 1296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDstPixelType != ttFloat) 1306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim DNG_REPORT ("Cannot convert floating point stage1 to non-floating stage2"); 1336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ThrowProgramError (); 1356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Are we using floating point math? 1396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fReal32 = (fSrcPixelType == ttLong || 1416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fDstPixelType == ttFloat); 1426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Find the scale for this plane. 1446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 maxBlack = info.MaxBlackLevel (plane); 1466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 minRange = info.fWhiteLevel [plane] - maxBlack; 1486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (minRange <= 0.0) 1506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim ThrowBadFormat (); 1526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 scale = 1.0 / minRange; 1556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fScale = (real32) scale; 1576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Calculate two-dimensional black pattern, if any. 1596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (info.fBlackDeltaH.Get ()) 1616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_rows = info.fBlackLevelRepeatRows; 1646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_cols = info.fActiveArea.W (); 1656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else if (info.fBlackLevelRepeatCols > 1) 1696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_rows = info.fBlackLevelRepeatRows; 1726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_cols = info.fBlackLevelRepeatCols; 1736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_2D_rows) 1776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_buffer.Reset (host.Allocate ( 1806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SafeUint32Mult (fBlack_2D_rows, fBlack_2D_cols, 4))); 1816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fBlack_2D_rows; j++) 1836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (k = 0; k < fBlack_2D_cols; k++) 1866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 x = info.fBlackLevel [j] 1896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim [k % info.fBlackLevelRepeatCols] 1906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim [plane]; 1916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (info.fBlackDeltaH.Get ()) 1936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 1946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x += info.fBlackDeltaH->Buffer_real64 () [k]; 1966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 1986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 1996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x *= scale; 2006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 index = j * fBlack_2D_cols + k; 2026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fReal32) 2046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_buffer->Buffer_real32 () [index] = (real32) x; 2076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 2116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x *= 0x0FFFF * 256.0; 2146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 y = Round_int32 (x); 2166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_buffer->Buffer_int32 () [index] = y; 2186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Calculate one-dimensional (per row) black pattern, if any. 2286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (info.fBlackDeltaV.Get ()) 2306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_1D_rows = info.fActiveArea.H (); 2336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else if (fBlack_2D_rows == 0 && 2376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim (info.fBlackLevelRepeatRows > 1 || fSrcPixelType != ttShort)) 2386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_1D_rows = info.fBlackLevelRepeatRows; 2416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_1D_rows) 2456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_1D_buffer.Reset (host.Allocate ( 2486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim SafeUint32Mult(fBlack_1D_rows, 4))); 2496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim bool allZero = true; 2516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fBlack_1D_rows; j++) 2536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 x = 0.0; 2566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_2D_rows == 0) 2586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = info.fBlackLevel [j % info.fBlackLevelRepeatRows] 2616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim [0] 2626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim [plane]; 2636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (info.fBlackDeltaV.Get ()) 2676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x += info.fBlackDeltaV->Buffer_real64 () [j]; 2706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim allZero = allZero && (x == 0.0); 2746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x *= scale; 2766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fReal32) 2786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_1D_buffer->Buffer_real32 () [j] = (real32) x; 2816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 2856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x *= 0x0FFFF * 256.0; 2886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 y = Round_int32 (x); 2906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_1D_buffer->Buffer_int32 () [j] = y; 2926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 2966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 2976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (allZero) 2986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 2996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_1D_rows = 0; 3016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_1D_buffer.Reset (); 3036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Calculate scale table, if any. 3096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType != ttLong && 3116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fSrcPixelType != ttFloat) 3126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Find linearization table, if any. 3156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint16 *lut = NULL; 3176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 lutEntries = 0; 3196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (info.fLinearizationTable.Get ()) 3216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim lut = info.fLinearizationTable->Buffer_uint16 (); 3246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim lutEntries = info.fLinearizationTable->LogicalSize () >> 1; 3266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // If the black level does not vary from pixel to pixel, then 3306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // the entire process can be a single LUT. 3316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_1D_rows == 0 && 3336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_rows == 0) 3346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fScale_buffer.Reset (host.Allocate (0x10000 * 3376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim TagTypeSize (fDstPixelType))); 3386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < 0x10000; j++) 3406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 x = j; 3436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Apply linearization table, if any. 3456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (lut) 3476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = Min_uint32 (x, lutEntries - 1); 3506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = lut [x]; 3526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Subtract constant black level. 3566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 y = x - info.fBlackLevel [0] [0] [plane]; 3586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Apply scale. 3606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim y *= scale; 3626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // We can burn in the clipping also. 3646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim y = Pin_real64 (0.0, y, 1.0); 3666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Store output value in table. 3686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fDstPixelType == ttShort) 3706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint16 z = (uint16) Round_uint32 (y * 0x0FFFF); 3736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fScale_buffer->Buffer_uint16 () [j] = z; 3756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 3796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fScale_buffer->Buffer_real32 () [j] = (real32) y; 3826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 3886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Else we only do the scaling operation in the scale table. 3906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 3926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fScale_buffer.Reset (host.Allocate (0x10000 * 4)); 3956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < 0x10000; j++) 3976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 3986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 3996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 x = j; 4006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Apply linearization table, if any. 4026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (lut) 4046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = Min_uint32 (x, lutEntries - 1); 4076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = lut [x]; 4096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Apply scale. 4136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 y = x * scale; 4156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Store output value in table. 4176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fReal32) 4196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fScale_buffer->Buffer_real32 () [j] = (real32) y; 4226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 4266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 z = Round_int32 (y * 0x0FFFF * 256.0); 4296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fScale_buffer->Buffer_int32 () [j] = z; 4316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 4436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_plane::~dng_linearize_plane () 4456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 4486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 4506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearize_plane::Process (const dng_rect &srcTile) 4526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Process tile. 4556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_rect dstTile = srcTile - fActiveArea.TL (); 4576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_const_tile_buffer srcBuffer (fSrcImage, srcTile); 4596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_dirty_tile_buffer dstBuffer (fDstImage, dstTile); 4606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 sStep = srcBuffer.fColStep; 4626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 dStep = dstBuffer.fColStep; 4636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 count = srcTile.W (); 4656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 dstCol = dstTile.l; 4676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 rows = srcTile.H (); 4696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 row = 0; row < rows; row++) 4716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 dstRow = dstTile.t + row; 4746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const void *sPtr = srcBuffer.ConstPixel (srcTile.t + row, 4766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcTile.l, 4776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fPlane); 4786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim void *dPtr = dstBuffer.DirtyPixel (dstRow, 4806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstCol, 4816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fPlane); 4826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Floating point source case. 4846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType == ttFloat) 4866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 scale = fScale; 4896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const real32 *srcPtr = (const real32 *) sPtr; 4916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 *dstPtr = (real32 *) dPtr; 4936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Optimize scale only case, which is the most common. 4956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 4966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_1D_rows == 0 && 4976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_cols == 0) 4986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 4996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 5016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = (*srcPtr) * scale; 5046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 5066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 5076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 5136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 b1 = 0.0f; 5166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_1D_rows) 5186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b1 = fBlack_1D_buffer->Buffer_real32 () [dstRow % fBlack_1D_rows]; 5206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const real32 *b2 = NULL; 5236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 b2_count = fBlack_2D_cols; 5256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 b2_phase = 0; 5266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 5286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2 = fBlack_2D_buffer->Buffer_real32 () + 5316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_count * (dstRow % fBlack_2D_rows); 5326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = dstCol % b2_count; 5346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 5386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 x = (*srcPtr) * scale - b1; 5416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 5436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x -= b2 [b2_phase]; 5466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (++b2_phase == b2_count) 5486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = 0; 5506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = x; 5556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 5576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 5586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Simple LUT case. 5666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else if (fBlack_1D_rows == 0 && 5686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlack_2D_rows == 0 && fSrcPixelType != ttLong) 5696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fDstPixelType == ttShort) 5726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint16 *lut = fScale_buffer->Buffer_uint16 (); 5756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint16 *dstPtr = (uint16 *) dPtr; 5776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType == ttByte) 5796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint8 *srcPtr = (const uint8 *) sPtr; 5826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 5846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = lut [*srcPtr]; 5876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 5896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 5906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 5946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 5966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 5976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 5986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint16 *srcPtr = (const uint16 *) sPtr; 5996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 6016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = lut [*srcPtr]; 6046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 6066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 6076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 6156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const real32 *lut = fScale_buffer->Buffer_real32 (); 6186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 *dstPtr = (real32 *) dPtr; 6206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType == ttByte) 6226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint8 *srcPtr = (const uint8 *) sPtr; 6256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 6276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = lut [*srcPtr]; 6306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 6326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 6336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 6396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint16 *srcPtr = (const uint16 *) sPtr; 6426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 6446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = lut [*srcPtr]; 6476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 6496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 6506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Integer math case. 6606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else if (!fReal32) 6626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const int32 *lut = fScale_buffer->Buffer_int32 (); 6656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 b1 = 0; 6676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_1D_rows) 6696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b1 = fBlack_1D_buffer->Buffer_int32 () [dstRow % fBlack_1D_rows]; 6716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const int32 *b2 = NULL; 6746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 b2_count = fBlack_2D_cols; 6766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 b2_phase = 0; 6776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 6796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2 = fBlack_2D_buffer->Buffer_int32 () + 6826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_count * (dstRow % fBlack_2D_rows); 6836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = dstCol % b2_count; 6856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 6876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint16 *dstPtr = (uint16 *) dPtr; 6896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6907841298310de58d0cddb212ac6295d9a27cf547cFlorian Kriener b1 -= 128; // Rounding for 8 bit shift 6916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType == ttByte) 6936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint8 *srcPtr = (const uint8 *) sPtr; 6966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 6976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 6986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 6996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 x = lut [*srcPtr] - b1; 7016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 7036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x -= b2 [b2_phase]; 7066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (++b2_phase == b2_count) 7086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = 0; 7106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x >>= 8; 7156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = Pin_uint16 (x); 7176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 7196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 7206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 7266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint16 *srcPtr = (const uint16 *) sPtr; 7296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 7316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim int32 x = lut [*srcPtr] - b1; 7346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 7366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7387841298310de58d0cddb212ac6295d9a27cf547cFlorian Kriener x -= b2 [b2_phase]; 7396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (++b2_phase == b2_count) 7416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = 0; 7436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x >>= 8; 7486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = Pin_uint16 (x); 7506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 7526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 7536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Floating point math cases. 7616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 7636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 b1 = 0.0f; 7666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlack_1D_rows) 7686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b1 = fBlack_1D_buffer->Buffer_real32 () [dstRow % fBlack_1D_rows]; 7706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const real32 *b2 = NULL; 7736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 b2_count = fBlack_2D_cols; 7756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 b2_phase = 0; 7766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 7786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2 = fBlack_2D_buffer->Buffer_real32 () + 7816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_count * (dstRow % fBlack_2D_rows); 7826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = dstCol % b2_count; 7846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 7866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Case 1: uint8/uint16 -> real32 7886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType != ttLong) 7906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const real32 *lut = fScale_buffer->Buffer_real32 (); 7936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 *dstPtr = (real32 *) dPtr; 7956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fSrcPixelType == ttByte) 7976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 7986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 7996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint8 *srcPtr = (const uint8 *) sPtr; 8006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 8026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 x = lut [*srcPtr] - b1; 8056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 8076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x -= b2 [b2_phase]; 8106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (++b2_phase == b2_count) 8126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = 0; 8146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = Pin_real32 (0.0f, x, 1.0f); 8196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = x; 8216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 8236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 8246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 8306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint16 *srcPtr = (const uint16 *) sPtr; 8336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 8356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 x = lut [*srcPtr] - b1; 8386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 8406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x -= b2 [b2_phase]; 8436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (++b2_phase == b2_count) 8456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = 0; 8476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = Pin_real32 (0.0f, x, 1.0f); 8526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = x; 8546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 8566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 8576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Otherwise source is uint32 8656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 8676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 scale = fScale; 8706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const uint32 *srcPtr = (const uint32 *) sPtr; 8726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Case 2: uint32 -> real32 8746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fDstPixelType == ttFloat) 8766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 *dstPtr = (real32 *) dPtr; 8796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 8816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 x = ((real32) *srcPtr) * scale - b1; 8846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 8866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x -= b2 [b2_phase]; 8896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (++b2_phase == b2_count) 8916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 8926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = 0; 8936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 8966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = Pin_real32 (0.0f, x, 1.0f); 8986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 8996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = x; 9006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 9026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 9036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Case 3: uint32 -> uint16 9096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 9116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint16 *dstPtr = (uint16 *) dPtr; 9146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 dstScale = (real32) 0x0FFFF; 9166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 j = 0; j < count; j++) 9186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real32 x = ((real32) *srcPtr) * scale - b1; 9216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (b2_count) 9236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x -= b2 [b2_phase]; 9266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (++b2_phase == b2_count) 9286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim b2_phase = 0; 9306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim x = Pin_real32 (0.0f, x, 1.0f); 9356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *dstPtr = (uint16) (x * dstScale + 0.5f); 9376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcPtr += sStep; 9396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstPtr += dStep; 9406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 9526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 9546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_linearize_image: public dng_area_task 9566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim private: 9596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_image & fSrcImage; 9616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_image & fDstImage; 9626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_rect fActiveArea; 9646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim AutoPtr<dng_linearize_plane> fPlaneTask [kMaxColorPlanes]; 9666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim public: 9686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_linearize_image (dng_host &host, 9706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_linearization_info &info, 9716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_image &srcImage, 9726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_image &dstImage); 9736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim virtual ~dng_linearize_image (); 9756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim virtual dng_rect RepeatingTile1 () const; 9776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim virtual dng_rect RepeatingTile2 () const; 9796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim virtual void Process (uint32 threadIndex, 9816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_rect &tile, 9826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_abort_sniffer *sniffer); 9836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim }; 9856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 9876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_image::dng_linearize_image (dng_host &host, 9896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_linearization_info &info, 9906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_image &srcImage, 9916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_image &dstImage) 9926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fSrcImage (srcImage) 9946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fDstImage (dstImage) 9956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fActiveArea (info.fActiveArea) 9966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 9986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 9996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Build linearization table for each plane. 10006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 plane = 0; plane < srcImage.Planes (); plane++) 10026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fPlaneTask [plane].Reset (new dng_linearize_plane (host, 10056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim info, 10066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcImage, 10076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstImage, 10086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim plane)); 10096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Adjust maximum tile size. 10136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fMaxTileSize = dng_point (1024, 1024); 10156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 10196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearize_image::~dng_linearize_image () 10216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 10266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_rect dng_linearize_image::RepeatingTile1 () const 10286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fSrcImage.RepeatingTile (); 10316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 10356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_rect dng_linearize_image::RepeatingTile2 () const 10376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fDstImage.RepeatingTile () + fActiveArea.TL (); 10406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 10446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearize_image::Process (uint32 /* threadIndex */, 10466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_rect &srcTile, 10476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_abort_sniffer * /* sniffer */) 10486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Process each plane. 10516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (uint32 plane = 0; plane < fSrcImage.Planes (); plane++) 10536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fPlaneTask [plane]->Process (srcTile); 10566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 10626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearization_info::dng_linearization_info () 10646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim : fActiveArea () 10666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fMaskedAreaCount (0) 10676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fLinearizationTable () 10686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlackLevelRepeatRows (1) 10696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlackLevelRepeatCols (1) 10706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlackDeltaH () 10716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlackDeltaV () 10726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim , fBlackDenom (256) 10736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 j; 10776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 k; 10786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 n; 10796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < kMaxBlackPattern; j++) 10816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (k = 0; k < kMaxBlackPattern; k++) 10826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (n = 0; n < kMaxSamplesPerPixel; n++) 10836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackLevel [j] [k] [n] = 0.0; 10856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (n = 0; n < kMaxSamplesPerPixel; n++) 10886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fWhiteLevel [n] = 65535.0; 10906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 10936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 10956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_linearization_info::~dng_linearization_info () 10976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 10986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 10996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 11026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::RoundBlacks () 11046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 j; 11076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 k; 11086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 n; 11096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 maxAbs = 0.0; 11116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fBlackLevelRepeatRows; j++) 11136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (k = 0; k < fBlackLevelRepeatCols; k++) 11146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (n = 0; n < kMaxSamplesPerPixel; n++) 11156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim maxAbs = Max_real64 (maxAbs, 11186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim Abs_real64 (fBlackLevel [j] [k] [n])); 11196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 count = RowBlackCount (); 11236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < count; j++) 11256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim maxAbs = Max_real64 (maxAbs, 11286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim Abs_real64 (fBlackDeltaV->Buffer_real64 () [j])); 11296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim count = ColumnBlackCount (); 11336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < count; j++) 11356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim maxAbs = Max_real64 (maxAbs, 11386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim Abs_real64 (fBlackDeltaH->Buffer_real64 () [j])); 11396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackDenom = 256; 11446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim while (fBlackDenom > 1 && (maxAbs * fBlackDenom) >= 30000.0 * 65536.0) 11466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackDenom >>= 1; 11486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fBlackLevelRepeatRows; j++) 11516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (k = 0; k < fBlackLevelRepeatCols; k++) 11526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (n = 0; n < kMaxSamplesPerPixel; n++) 11536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackLevel [j] [k] [n] = BlackLevel (j, k, n).As_real64 (); 11566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim count = RowBlackCount (); 11606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < count; j++) 11626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackDeltaV->Buffer_real64 () [j] = RowBlack (j).As_real64 (); 11656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim count = ColumnBlackCount (); 11696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < count; j++) 11716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackDeltaH->Buffer_real64 () [j] = ColumnBlack (j).As_real64 (); 11746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 11786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 11806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::Parse (dng_host &host, 11826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_stream &stream, 11836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_info &info) 11846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 11856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 j; 11876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 k; 11886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 n; 11896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Find main image IFD. 11916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_ifd &rawIFD = *info.fIFD [info.fMainIndex].Get (); 11936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Copy active area. 11956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fActiveArea = rawIFD.fActiveArea; 11976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 11986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Copy masked areas. 11996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fMaskedAreaCount = rawIFD.fMaskedAreaCount; 12016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fMaskedAreaCount; j++) 12036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fMaskedArea [j] = rawIFD.fMaskedArea [j]; 12056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Read linearization LUT. 12086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (rawIFD.fLinearizationTableCount) 12106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 size = SafeUint32Mult (rawIFD.fLinearizationTableCount, 12136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim static_cast<uint32> (sizeof (uint16))); 12146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fLinearizationTable.Reset (host.Allocate (size)); 12166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint16 *table = fLinearizationTable->Buffer_uint16 (); 12186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim stream.SetReadPosition (rawIFD.fLinearizationTableOffset); 12206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < rawIFD.fLinearizationTableCount; j++) 12226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim table [j] = stream.Get_uint16 (); 12246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Copy black level pattern. 12296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackLevelRepeatRows = rawIFD.fBlackLevelRepeatRows; 12316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackLevelRepeatCols = rawIFD.fBlackLevelRepeatCols; 12326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < kMaxBlackPattern; j++) 12346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (k = 0; k < kMaxBlackPattern; k++) 12356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (n = 0; n < kMaxSamplesPerPixel; n++) 12366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackLevel [j] [k] [n] = rawIFD.fBlackLevel [j] [k] [n]; 12386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Read BlackDeltaH. 12416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (rawIFD.fBlackLevelDeltaHCount) 12436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 size = SafeUint32Mult (rawIFD.fBlackLevelDeltaHCount, 12466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim static_cast<uint32> (sizeof (real64))); 12476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackDeltaH.Reset (host.Allocate (size)); 12496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 *blacks = fBlackDeltaH->Buffer_real64 (); 12516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim stream.SetReadPosition (rawIFD.fBlackLevelDeltaHOffset); 12536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < rawIFD.fBlackLevelDeltaHCount; j++) 12556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim blacks [j] = stream.TagValue_real64 (rawIFD.fBlackLevelDeltaHType); 12576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Read BlackDeltaV. 12626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (rawIFD.fBlackLevelDeltaVCount) 12646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 size = SafeUint32Mult (rawIFD.fBlackLevelDeltaVCount, 12676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim static_cast<uint32> (sizeof (real64))); 12686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fBlackDeltaV.Reset (host.Allocate (size)); 12706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 *blacks = fBlackDeltaV->Buffer_real64 (); 12726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim stream.SetReadPosition (rawIFD.fBlackLevelDeltaVOffset); 12746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < rawIFD.fBlackLevelDeltaVCount; j++) 12766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim blacks [j] = stream.TagValue_real64 (rawIFD.fBlackLevelDeltaVType); 12786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Copy white level. 12836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (n = 0; n < kMaxSamplesPerPixel; n++) 12856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 12866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fWhiteLevel [n] = rawIFD.fWhiteLevel [n]; 12876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Round off black levels. 12906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim RoundBlacks (); 12926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 12946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 12966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 12976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::PostParse (dng_host & /* host */, 12986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_negative &negative) 12996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fActiveArea.IsEmpty ()) 13026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fActiveArea = negative.Stage1Image ()->Bounds (); 13056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 13116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimreal64 dng_linearization_info::MaxBlackLevel (uint32 plane) const 13136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 j; 13166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 k; 13176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Find maximum value of fBlackDeltaH for each phase of black pattern. 13196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 maxDeltaH [kMaxBlackPattern]; 13216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fBlackLevelRepeatCols; j++) 13236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim maxDeltaH [j] = 0.0; 13256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlackDeltaH.Get ()) 13286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 *table = fBlackDeltaH->Buffer_real64 (); 13316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 entries = fBlackDeltaH->LogicalSize () / (uint32) sizeof (table [0]); 13336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < entries; j++) 13356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 &entry = maxDeltaH [j % fBlackLevelRepeatCols]; 13386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (j < fBlackLevelRepeatCols) 13406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim entry = table [j]; 13426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 13446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim entry = Max_real64 (entry, table [j]); 13466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Find maximum value of fBlackDeltaV for each phase of black pattern. 13536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 maxDeltaV [kMaxBlackPattern]; 13556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fBlackLevelRepeatRows; j++) 13576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim maxDeltaV [j] = 0.0; 13596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlackDeltaV.Get ()) 13626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 *table = fBlackDeltaV->Buffer_real64 (); 13656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 entries = fBlackDeltaV->LogicalSize () / (uint32) sizeof (table [0]); 13676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < entries; j++) 13696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 &entry = maxDeltaV [j % fBlackLevelRepeatRows]; 13726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (j < fBlackLevelRepeatRows) 13746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim entry = table [j]; 13766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 13786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim entry = Max_real64 (entry, table [j]); 13806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 13856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // Now scan the pattern and find the maximum value after row and column 13876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim // deltas. 13886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 maxBlack = 0.0; 13906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (j = 0; j < fBlackLevelRepeatRows; j++) 13926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim for (k = 0; k < fBlackLevelRepeatCols; k++) 13956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 13966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim real64 black = fBlackLevel [j] [k] [plane]; 13986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 13996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim black += maxDeltaH [k]; 14006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim black += maxDeltaV [j]; 14016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (j == 0 && k == 0) 14036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim maxBlack = black; 14056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim else 14076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim maxBlack = Max_real64 (maxBlack, black); 14096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return maxBlack; 14166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 14206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid dng_linearization_info::Linearize (dng_host &host, 14226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim const dng_image &srcImage, 14236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_image &dstImage) 14246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_linearize_image processor (host, 14276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim *this, 14286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim srcImage, 14296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dstImage); 14306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim host.PerformAreaTask (processor, 14326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim fActiveArea); 14336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 14376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_urational dng_linearization_info::BlackLevel (uint32 row, 14396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 col, 14406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim uint32 plane) const 14416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_urational r; 14446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim r.Set_real64 (fBlackLevel [row] [col] [plane], fBlackDenom); 14466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return r; 14486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 14526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimuint32 dng_linearization_info::RowBlackCount () const 14546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlackDeltaV.Get ()) 14576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fBlackDeltaV->LogicalSize () >> 3; 14606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return 0; 14646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 14686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_srational dng_linearization_info::RowBlack (uint32 row) const 14706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlackDeltaV.Get ()) 14736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_srational r; 14766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim r.Set_real64 (fBlackDeltaV->Buffer_real64 () [row], fBlackDenom); 14786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return r; 14806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return dng_srational (0, 1); 14846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 14886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimuint32 dng_linearization_info::ColumnBlackCount () const 14906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlackDeltaH.Get ()) 14936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 14946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return fBlackDeltaH->LogicalSize () >> 3; 14966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 14986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 14996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return 0; 15006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 15026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 15046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimdng_srational dng_linearization_info::ColumnBlack (uint32 col) const 15066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 15076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim if (fBlackDeltaH.Get ()) 15096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim { 15106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim dng_srational r; 15126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim r.Set_real64 (fBlackDeltaH->Buffer_real64 () [col], fBlackDenom); 15146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return r; 15166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 15186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim return dng_srational (0, 1); 15206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim } 15226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim 15236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/ 1524