blob: 970e8b4648006f95ef145186a3a3e78a59fceea0 [file] [log] [blame]
/*****************************************************************************/
// 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_misc_opcodes.h#2 $ */
/* $DateTime: 2012/08/02 06:09:06 $ */
/* $Change: 841096 $ */
/* $Author: erichan $ */
/** \file
* Miscellaneous DNG opcodes.
*/
/*****************************************************************************/
#ifndef __dng_misc_opcodes__
#define __dng_misc_opcodes__
/*****************************************************************************/
#include "dng_opcodes.h"
/*****************************************************************************/
/// \brief Opcode to trim image to a specified rectangle.
class dng_opcode_TrimBounds: public dng_opcode
{
private:
dng_rect fBounds;
public:
/// Create opcode to trim image to the specified bounds.
dng_opcode_TrimBounds (const dng_rect &bounds);
dng_opcode_TrimBounds (dng_stream &stream);
virtual void PutData (dng_stream &stream) const;
virtual void Apply (dng_host &host,
dng_negative &negative,
AutoPtr<dng_image> &image);
};
/*****************************************************************************/
/// \brief A class to describe an area of an image, including a pixel subrectangle,
/// plane range, and row/column pitch (e.g., for mosaic images). Useful for
/// specifying opcodes that only apply to specific color planes or pixel types (e.g.,
/// only one of the two green Bayer pixels).
class dng_area_spec
{
public:
enum
{
kDataSize = 32
};
private:
dng_rect fArea;
uint32 fPlane;
uint32 fPlanes;
uint32 fRowPitch;
uint32 fColPitch;
public:
/// Create an empty area.
dng_area_spec (const dng_rect &area = dng_rect (),
uint32 plane = 0,
uint32 planes = 1,
uint32 rowPitch = 1,
uint32 colPitch = 1)
: fArea (area)
, fPlane (plane)
, fPlanes (planes)
, fRowPitch (rowPitch)
, fColPitch (colPitch)
{
}
/// The pixel area.
const dng_rect & Area () const
{
return fArea;
}
/// The first plane.
const uint32 Plane () const
{
return fPlane;
}
/// The total number of planes.
const uint32 Planes () const
{
return fPlanes;
}
/// The row pitch (i.e., stride). A pitch of 1 means all rows.
const uint32 RowPitch () const
{
return fRowPitch;
}
/// The column pitch (i.e., stride). A pitch of 1 means all columns.
const uint32 ColPitch () const
{
return fColPitch;
}
/// Read area data from the specified stream.
void GetData (dng_stream &stream);
/// Write area data to the specified stream.
void PutData (dng_stream &stream) const;
/// Compute and return pixel area overlap (i.e., intersection) between this
/// area and the specified tile.
dng_rect Overlap (const dng_rect &tile) const;
};
/*****************************************************************************/
/// \brief An opcode to apply a 1D function (represented as a 16-bit table) to an
/// image area.
class dng_opcode_MapTable: public dng_inplace_opcode
{
private:
dng_area_spec fAreaSpec;
AutoPtr<dng_memory_block> fTable;
uint32 fCount;
public:
/// Create a MapTable opcode with the specified area, table, and number of
/// table entries.
dng_opcode_MapTable (dng_host &host,
const dng_area_spec &areaSpec,
const uint16 *table,
uint32 count = 0x10000);
dng_opcode_MapTable (dng_host &host,
dng_stream &stream);
virtual void PutData (dng_stream &stream) const;
virtual uint32 BufferPixelType (uint32 imagePixelType);
virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
virtual void ProcessArea (dng_negative &negative,
uint32 threadIndex,
dng_pixel_buffer &buffer,
const dng_rect &dstArea,
const dng_rect &imageBounds);
private:
void ReplicateLastEntry ();
};
/*****************************************************************************/
/// \brief An opcode to apply a 1D function (represented as a polynomial) to an
/// image area.
class dng_opcode_MapPolynomial: public dng_inplace_opcode
{
public:
enum
{
kMaxDegree = 8
};
private:
dng_area_spec fAreaSpec;
uint32 fDegree;
real64 fCoefficient [kMaxDegree + 1];
real32 fCoefficient32 [kMaxDegree + 1];
public:
/// Create a MapPolynomial opcode with the specified area, polynomial
/// degree, and polynomial coefficients. The function that will be
/// applied to each pixel x is:
///
/// f (x) = coefficient [0] + ((x * coefficient [1]) +
/// (x^2 * coefficient [2]) +
/// (x^3 * coefficient [3]) +
/// (x^4 * coefficient [4]) ...
dng_opcode_MapPolynomial (const dng_area_spec &areaSpec,
uint32 degree,
const real64 *coefficient);
dng_opcode_MapPolynomial (dng_stream &stream);
virtual void PutData (dng_stream &stream) const;
virtual uint32 BufferPixelType (uint32 imagePixelType);
virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
virtual void ProcessArea (dng_negative &negative,
uint32 threadIndex,
dng_pixel_buffer &buffer,
const dng_rect &dstArea,
const dng_rect &imageBounds);
};
/*****************************************************************************/
/// \brief An opcode to apply a delta (i.e., offset) that varies per row. Within
/// a row, the same delta value is applied to all specified pixels.
class dng_opcode_DeltaPerRow: public dng_inplace_opcode
{
private:
dng_area_spec fAreaSpec;
AutoPtr<dng_memory_block> fTable;
real32 fScale;
public:
/// Create a DeltaPerRow opcode with the specified area and row deltas
/// (specified as a table of 32-bit floats).
dng_opcode_DeltaPerRow (const dng_area_spec &areaSpec,
AutoPtr<dng_memory_block> &table);
dng_opcode_DeltaPerRow (dng_host &host,
dng_stream &stream);
virtual void PutData (dng_stream &stream) const;
virtual uint32 BufferPixelType (uint32 imagePixelType);
virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
virtual void ProcessArea (dng_negative &negative,
uint32 threadIndex,
dng_pixel_buffer &buffer,
const dng_rect &dstArea,
const dng_rect &imageBounds);
};
/*****************************************************************************/
/// \brief An opcode to apply a delta (i.e., offset) that varies per column.
/// Within a column, the same delta value is applied to all specified pixels.
class dng_opcode_DeltaPerColumn: public dng_inplace_opcode
{
private:
dng_area_spec fAreaSpec;
AutoPtr<dng_memory_block> fTable;
real32 fScale;
public:
/// Create a DeltaPerColumn opcode with the specified area and column
/// deltas (specified as a table of 32-bit floats).
dng_opcode_DeltaPerColumn (const dng_area_spec &areaSpec,
AutoPtr<dng_memory_block> &table);
dng_opcode_DeltaPerColumn (dng_host &host,
dng_stream &stream);
virtual void PutData (dng_stream &stream) const;
virtual uint32 BufferPixelType (uint32 imagePixelType);
virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
virtual void ProcessArea (dng_negative &negative,
uint32 threadIndex,
dng_pixel_buffer &buffer,
const dng_rect &dstArea,
const dng_rect &imageBounds);
};
/*****************************************************************************/
/// \brief An opcode to apply a scale factor that varies per row. Within a row,
/// the same scale factor is applied to all specified pixels.
class dng_opcode_ScalePerRow: public dng_inplace_opcode
{
private:
dng_area_spec fAreaSpec;
AutoPtr<dng_memory_block> fTable;
public:
/// Create a ScalePerRow opcode with the specified area and row scale
/// factors (specified as a table of 32-bit floats).
dng_opcode_ScalePerRow (const dng_area_spec &areaSpec,
AutoPtr<dng_memory_block> &table);
dng_opcode_ScalePerRow (dng_host &host,
dng_stream &stream);
virtual void PutData (dng_stream &stream) const;
virtual uint32 BufferPixelType (uint32 imagePixelType);
virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
virtual void ProcessArea (dng_negative &negative,
uint32 threadIndex,
dng_pixel_buffer &buffer,
const dng_rect &dstArea,
const dng_rect &imageBounds);
};
/*****************************************************************************/
/// \brief An opcode to apply a scale factor that varies per column. Within a
/// column, the same scale factor is applied to all specified pixels.
class dng_opcode_ScalePerColumn: public dng_inplace_opcode
{
private:
dng_area_spec fAreaSpec;
AutoPtr<dng_memory_block> fTable;
public:
/// Create a ScalePerColumn opcode with the specified area and column
/// scale factors (specified as a table of 32-bit floats).
dng_opcode_ScalePerColumn (const dng_area_spec &areaSpec,
AutoPtr<dng_memory_block> &table);
dng_opcode_ScalePerColumn (dng_host &host,
dng_stream &stream);
virtual void PutData (dng_stream &stream) const;
virtual uint32 BufferPixelType (uint32 imagePixelType);
virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
virtual void ProcessArea (dng_negative &negative,
uint32 threadIndex,
dng_pixel_buffer &buffer,
const dng_rect &dstArea,
const dng_rect &imageBounds);
};
/*****************************************************************************/
#endif
/*****************************************************************************/