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