summaryrefslogtreecommitdiff
path: root/gpr/source/lib/dng_sdk/dng_misc_opcodes.h
diff options
context:
space:
mode:
Diffstat (limited to 'gpr/source/lib/dng_sdk/dng_misc_opcodes.h')
-rw-r--r--gpr/source/lib/dng_sdk/dng_misc_opcodes.h417
1 files changed, 417 insertions, 0 deletions
diff --git a/gpr/source/lib/dng_sdk/dng_misc_opcodes.h b/gpr/source/lib/dng_sdk/dng_misc_opcodes.h
new file mode 100644
index 0000000..7a1268a
--- /dev/null
+++ b/gpr/source/lib/dng_sdk/dng_misc_opcodes.h
@@ -0,0 +1,417 @@
+/*****************************************************************************/
+// 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.
+
+ uint32 Plane () const
+ {
+ return fPlane;
+ }
+
+ /// The total number of planes.
+
+ uint32 Planes () const
+ {
+ return fPlanes;
+ }
+
+ /// The row pitch (i.e., stride). A pitch of 1 means all rows.
+
+ uint32 RowPitch () const
+ {
+ return fRowPitch;
+ }
+
+ /// The column pitch (i.e., stride). A pitch of 1 means all columns.
+
+ 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
+
+/*****************************************************************************/