You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
5.3 KiB
220 lines
5.3 KiB
/*****************************************************************************/
|
|
// Copyright 2008-2009 Adobe Systems Incorporated
|
|
// All Rights Reserved.
|
|
//
|
|
// NOTICE: Adobe permits you to use, modify, and distribute this file in
|
|
// accordance with the terms of the Adobe license agreement accompanying it.
|
|
/*****************************************************************************/
|
|
|
|
/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_gain_map.h#2 $ */
|
|
/* $DateTime: 2012/07/31 22:04:34 $ */
|
|
/* $Change: 840853 $ */
|
|
/* $Author: tknoll $ */
|
|
|
|
/** \file
|
|
* Opcode to fix 2D uniformity defects, such as shading.
|
|
*/
|
|
|
|
/*****************************************************************************/
|
|
|
|
#ifndef __dng_gain_map__
|
|
#define __dng_gain_map__
|
|
|
|
/*****************************************************************************/
|
|
|
|
#include "dng_memory.h"
|
|
#include "dng_misc_opcodes.h"
|
|
#include "dng_tag_types.h"
|
|
|
|
/*****************************************************************************/
|
|
|
|
/// \brief Holds a discrete (i.e., sampled) 2D representation of a gain map. This is
|
|
/// effectively an image containing scale factors.
|
|
|
|
class dng_gain_map
|
|
{
|
|
|
|
private:
|
|
|
|
dng_point fPoints;
|
|
|
|
dng_point_real64 fSpacing;
|
|
|
|
dng_point_real64 fOrigin;
|
|
|
|
uint32 fPlanes;
|
|
|
|
uint32 fRowStep;
|
|
|
|
AutoPtr<dng_memory_block> fBuffer;
|
|
|
|
public:
|
|
|
|
/// Construct a gain map with the specified memory allocator, number of
|
|
/// samples (points), sample spacing, origin, and number of color planes.
|
|
|
|
dng_gain_map (dng_memory_allocator &allocator,
|
|
const dng_point &points,
|
|
const dng_point_real64 &spacing,
|
|
const dng_point_real64 &origin,
|
|
uint32 planes);
|
|
|
|
/// The number of samples in the horizontal and vertical directions.
|
|
|
|
const dng_point & Points () const
|
|
{
|
|
return fPoints;
|
|
}
|
|
|
|
/// The space between adjacent samples in the horizontal and vertical
|
|
/// directions.
|
|
|
|
const dng_point_real64 & Spacing () const
|
|
{
|
|
return fSpacing;
|
|
}
|
|
|
|
/// The 2D coordinate for the first (i.e., top-left-most) sample.
|
|
|
|
const dng_point_real64 & Origin () const
|
|
{
|
|
return fOrigin;
|
|
}
|
|
|
|
/// The number of color planes.
|
|
|
|
uint32 Planes () const
|
|
{
|
|
return fPlanes;
|
|
}
|
|
|
|
/// Getter for a gain map sample (specified by row, column, and plane).
|
|
|
|
real32 & Entry (uint32 rowIndex,
|
|
uint32 colIndex,
|
|
uint32 plane)
|
|
{
|
|
|
|
return *(fBuffer->Buffer_real32 () +
|
|
rowIndex * fRowStep +
|
|
colIndex * fPlanes +
|
|
plane);
|
|
|
|
}
|
|
|
|
/// Getter for a gain map sample (specified by row index, column index, and
|
|
/// plane index).
|
|
|
|
const real32 & Entry (uint32 rowIndex,
|
|
uint32 colIndex,
|
|
uint32 plane) const
|
|
{
|
|
|
|
return *(fBuffer->Buffer_real32 () +
|
|
rowIndex * fRowStep +
|
|
colIndex * fPlanes +
|
|
plane);
|
|
|
|
}
|
|
|
|
/// Compute the interpolated gain (i.e., scale factor) at the specified pixel
|
|
/// position and color plane, within the specified image bounds (in pixels).
|
|
|
|
real32 Interpolate (int32 row,
|
|
int32 col,
|
|
uint32 plane,
|
|
const dng_rect &bounds) const;
|
|
|
|
/// The number of bytes needed to hold the gain map data.
|
|
|
|
uint32 PutStreamSize () const;
|
|
|
|
/// Write the gain map to the specified stream.
|
|
|
|
void PutStream (dng_stream &stream) const;
|
|
|
|
/// Read a gain map from the specified stream.
|
|
|
|
static dng_gain_map * GetStream (dng_host &host,
|
|
dng_stream &stream);
|
|
|
|
private:
|
|
|
|
// Hidden copy constructor and assignment operator.
|
|
|
|
dng_gain_map (const dng_gain_map &map);
|
|
|
|
dng_gain_map & operator= (const dng_gain_map &map);
|
|
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
|
|
/// \brief An opcode to fix 2D spatially-varying light falloff or color casts (i.e.,
|
|
/// uniformity issues). This is commonly due to shading.
|
|
|
|
class dng_opcode_GainMap: public dng_inplace_opcode
|
|
{
|
|
|
|
private:
|
|
|
|
dng_area_spec fAreaSpec;
|
|
|
|
AutoPtr<dng_gain_map> fGainMap;
|
|
|
|
public:
|
|
|
|
/// Construct a GainMap opcode for the specified image area and the specified
|
|
/// gain map.
|
|
|
|
dng_opcode_GainMap (const dng_area_spec &areaSpec,
|
|
AutoPtr<dng_gain_map> &gainMap);
|
|
|
|
/// Construct a GainMap opcode from the specified stream.
|
|
|
|
dng_opcode_GainMap (dng_host &host,
|
|
dng_stream &stream);
|
|
|
|
/// Write the opcode to the specified stream.
|
|
|
|
virtual void PutData (dng_stream &stream) const;
|
|
|
|
/// The pixel data type of this opcode.
|
|
|
|
virtual uint32 BufferPixelType (uint32 /* imagePixelType */)
|
|
{
|
|
return ttFloat;
|
|
}
|
|
|
|
/// The adjusted bounds (processing area) of this opcode. It is limited to
|
|
/// the intersection of the specified image area and the GainMap area.
|
|
|
|
virtual dng_rect ModifiedBounds (const dng_rect &imageBounds)
|
|
{
|
|
return fAreaSpec.Overlap (imageBounds);
|
|
}
|
|
|
|
/// Apply the gain map.
|
|
|
|
virtual void ProcessArea (dng_negative &negative,
|
|
uint32 threadIndex,
|
|
dng_pixel_buffer &buffer,
|
|
const dng_rect &dstArea,
|
|
const dng_rect &imageBounds);
|
|
|
|
private:
|
|
|
|
// Hidden copy constructor and assignment operator.
|
|
|
|
dng_opcode_GainMap (const dng_opcode_GainMap &opcode);
|
|
|
|
dng_opcode_GainMap & operator= (const dng_opcode_GainMap &opcode);
|
|
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
|
|
#endif
|
|
|
|
/*****************************************************************************/
|