| /*****************************************************************************/ |
| // 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 |
| |
| /*****************************************************************************/ |