10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2008-2009 Adobe Systems Incorporated 30b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// All Rights Reserved. 40b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// 50b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// NOTICE: Adobe permits you to use, modify, and distribute this file in 60b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it. 70b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 80b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 90b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_gain_map.h#2 $ */ 100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/07/31 22:04:34 $ */ 110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 840853 $ */ 120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */ 130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file 150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * Opcode to fix 2D uniformity defects, such as shading. 160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */ 170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_gain_map__ 210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_gain_map__ 220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_memory.h" 260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_misc_opcodes.h" 270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_tag_types.h" 280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Holds a discrete (i.e., sampled) 2D representation of a gain map. This is 320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// effectively an image containing scale factors. 330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_gain_map 350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_point fPoints; 400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_point_real64 fSpacing; 420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_point_real64 fOrigin; 440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 fPlanes; 460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 fRowStep; 480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener AutoPtr<dng_memory_block> fBuffer; 500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Construct a gain map with the specified memory allocator, number of 540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// samples (points), sample spacing, origin, and number of color planes. 550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_gain_map (dng_memory_allocator &allocator, 570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point &points, 580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point_real64 &spacing, 590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point_real64 &origin, 600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 planes); 610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// The number of samples in the horizontal and vertical directions. 630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point & Points () const 650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fPoints; 670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// The space between adjacent samples in the horizontal and vertical 700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// directions. 710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point_real64 & Spacing () const 730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fSpacing; 750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// The 2D coordinate for the first (i.e., top-left-most) sample. 780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point_real64 & Origin () const 800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fOrigin; 820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// The number of color planes. 850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 Planes () const 870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fPlanes; 890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Getter for a gain map sample (specified by row, column, and plane). 920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 & Entry (uint32 rowIndex, 940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 colIndex, 950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 plane) 960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return *(fBuffer->Buffer_real32 () + 990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener rowIndex * fRowStep + 1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener colIndex * fPlanes + 1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener plane); 1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Getter for a gain map sample (specified by row index, column index, and 1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// plane index). 1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const real32 & Entry (uint32 rowIndex, 1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 colIndex, 1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 plane) const 1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return *(fBuffer->Buffer_real32 () + 1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener rowIndex * fRowStep + 1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener colIndex * fPlanes + 1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener plane); 1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Compute the interpolated gain (i.e., scale factor) at the specified pixel 1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// position and color plane, within the specified image bounds (in pixels). 1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener real32 Interpolate (int32 row, 1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener int32 col, 1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 plane, 1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &bounds) const; 1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// The number of bytes needed to hold the gain map data. 1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 PutStreamSize () const; 1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Write the gain map to the specified stream. 1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener void PutStream (dng_stream &stream) const; 1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Read a gain map from the specified stream. 1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener static dng_gain_map * GetStream (dng_host &host, 1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_stream &stream); 1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener // Hidden copy constructor and assignment operator. 1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_gain_map (const dng_gain_map &map); 1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_gain_map & operator= (const dng_gain_map &map); 1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to fix 2D spatially-varying light falloff or color casts (i.e., 1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// uniformity issues). This is commonly due to shading. 1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_GainMap: public dng_inplace_opcode 1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_area_spec fAreaSpec; 1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener AutoPtr<dng_gain_map> fGainMap; 1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Construct a GainMap opcode for the specified image area and the specified 1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// gain map. 1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_GainMap (const dng_area_spec &areaSpec, 1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener AutoPtr<dng_gain_map> &gainMap); 1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Construct a GainMap opcode from the specified stream. 1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_GainMap (dng_host &host, 1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_stream &stream); 1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Write the opcode to the specified stream. 1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void PutData (dng_stream &stream) const; 1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// The pixel data type of this opcode. 1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual uint32 BufferPixelType (uint32 /* imagePixelType */) 1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return ttFloat; 1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// The adjusted bounds (processing area) of this opcode. It is limited to 1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// the intersection of the specified image area and the GainMap area. 1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual dng_rect ModifiedBounds (const dng_rect &imageBounds) 1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fAreaSpec.Overlap (imageBounds); 1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Apply the gain map. 1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void ProcessArea (dng_negative &negative, 2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 threadIndex, 2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_pixel_buffer &buffer, 2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &dstArea, 2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds); 2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener // Hidden copy constructor and assignment operator. 2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_GainMap (const dng_opcode_GainMap &opcode); 2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_GainMap & operator= (const dng_opcode_GainMap &opcode); 2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif 2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 220