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.
219 lines
5.3 KiB
219 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 |
|
|
|
/*****************************************************************************/
|
|
|