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.
418 lines
10 KiB
418 lines
10 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_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
|
|
|
|
/*****************************************************************************/
|