/*****************************************************************************/ // Copyright 2008 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_opcodes.h#2 $ */ /* $DateTime: 2012/08/02 06:09:06 $ */ /* $Change: 841096 $ */ /* $Author: erichan $ */ /** \file * Base class and common data structures for opcodes (introduced in DNG 1.3). */ /*****************************************************************************/ #ifndef __dng_opcodes__ #define __dng_opcodes__ /*****************************************************************************/ #include "dng_auto_ptr.h" #include "dng_classes.h" #include "dng_rect.h" #include "dng_types.h" /*****************************************************************************/ /// \brief List of supported opcodes (by ID). enum dng_opcode_id { // Internal use only opcode. Never written to DNGs. dngOpcode_Private = 0, // Warp image to correct distortion and lateral chromatic aberration for // rectilinear lenses. dngOpcode_WarpRectilinear = 1, // Warp image to correction distortion for fisheye lenses (i.e., map the // fisheye projection to a perspective projection). dngOpcode_WarpFisheye = 2, // Radial vignette correction. dngOpcode_FixVignetteRadial = 3, // Patch bad Bayer pixels which are marked with a special value in the image. dngOpcode_FixBadPixelsConstant = 4, // Patch bad Bayer pixels/rectangles at a list of specified coordinates. dngOpcode_FixBadPixelsList = 5, // Trim image to specified bounds. dngOpcode_TrimBounds = 6, // Map an area through a 16-bit LUT. dngOpcode_MapTable = 7, // Map an area using a polynomial function. dngOpcode_MapPolynomial = 8, // Apply a gain map to an area. dngOpcode_GainMap = 9, // Apply a per-row delta to an area. dngOpcode_DeltaPerRow = 10, // Apply a per-column delta to an area. dngOpcode_DeltaPerColumn = 11, // Apply a per-row scale to an area. dngOpcode_ScalePerRow = 12, // Apply a per-column scale to an area. dngOpcode_ScalePerColumn = 13 }; /*****************************************************************************/ /// \brief Virtual base class for opcode. class dng_opcode { public: /// Opcode flags. enum { kFlag_None = 0, //!< No flag. kFlag_Optional = 1, //!< This opcode is optional. kFlag_SkipIfPreview = 2 //!< May skip opcode for preview images. }; private: uint32 fOpcodeID; uint32 fMinVersion; uint32 fFlags; bool fWasReadFromStream; uint32 fStage; protected: dng_opcode (uint32 opcodeID, uint32 minVersion, uint32 flags); dng_opcode (uint32 opcodeID, dng_stream &stream, const char *name); public: virtual ~dng_opcode (); /// The ID of this opcode. uint32 OpcodeID () const { return fOpcodeID; } /// The first DNG version that supports this opcode. uint32 MinVersion () const { return fMinVersion; } /// The flags for this opcode. uint32 Flags () const { return fFlags; } /// Is this opcode optional? bool Optional () const { return (Flags () & kFlag_Optional) != 0; } /// Should the opcode be skipped when rendering preview images? bool SkipIfPreview () const { return (Flags () & kFlag_SkipIfPreview) != 0; } /// Was this opcode read from a data stream? bool WasReadFromStream () const { return fWasReadFromStream; } /// Which image processing stage (1, 2, 3) is associated with this /// opcode? uint32 Stage () const { return fStage; } /// Set the image processing stage (1, 2, 3) for this opcode. Stage 1 is /// the original image data, including masked areas. Stage 2 is /// linearized image data and trimmed to the active area. Stage 3 is /// demosaiced and trimmed to the active area. void SetStage (uint32 stage) { fStage = stage; } /// Is the opcode a NOP (i.e., does nothing)? An opcode could be a NOP /// for some specific parameters. virtual bool IsNOP () const { return false; } /// Is this opcode valid for the specified negative? virtual bool IsValidForNegative (const dng_negative & /* negative */) const { return true; } /// Write opcode to a stream. /// \param stream The stream to which to write the opcode data. virtual void PutData (dng_stream &stream) const; /// Perform error checking prior to applying this opcode to the /// specified negative. Returns true if this opcode should be applied to /// the negative, false otherwise. bool AboutToApply (dng_host &host, dng_negative &negative); /// Apply this opcode to the specified image with associated negative. virtual void Apply (dng_host &host, dng_negative &negative, AutoPtr<dng_image> &image) = 0; }; /*****************************************************************************/ /// \brief Class to represent unknown opcodes (e.g, opcodes defined in future /// DNG versions). class dng_opcode_Unknown: public dng_opcode { private: AutoPtr<dng_memory_block> fData; public: dng_opcode_Unknown (dng_host &host, uint32 opcodeID, dng_stream &stream); virtual void PutData (dng_stream &stream) const; virtual void Apply (dng_host &host, dng_negative &negative, AutoPtr<dng_image> &image); }; /*****************************************************************************/ /// \brief Class to represent a filter opcode, such as a convolution. class dng_filter_opcode: public dng_opcode { protected: dng_filter_opcode (uint32 opcodeID, uint32 minVersion, uint32 flags); dng_filter_opcode (uint32 opcodeID, dng_stream &stream, const char *name); public: /// The pixel data type of this opcode. virtual uint32 BufferPixelType (uint32 imagePixelType) { return imagePixelType; } /// 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 imageBounds; } /// Returns the width and height (in pixels) of the repeating mosaic pattern. virtual dng_point SrcRepeat () { return dng_point (1, 1); } /// Returns the source pixel area needed to process a destination pixel area /// that lies within the specified bounds. /// \param dstArea The destination pixel area to be computed. /// \param imageBounds The overall image area (dstArea will lie within these /// bounds). /// \retval The source pixel area needed to process the specified dstArea. virtual dng_rect SrcArea (const dng_rect &dstArea, const dng_rect & /* imageBounds */) { return dstArea; } /// Given a destination tile size, calculate input tile size. Simlar to /// SrcArea, and should seldom be overridden. /// /// \param dstTileSize The destination tile size that is targeted for output. /// /// \param imageBounds The image bounds (the destination tile will /// always lie within these bounds). /// /// \retval The source tile size needed to compute a tile of the destination /// size. virtual dng_point SrcTileSize (const dng_point &dstTileSize, const dng_rect &imageBounds) { return SrcArea (dng_rect (dstTileSize), imageBounds).Size (); } /// Startup method called before any processing is performed on pixel areas. /// It can be used to allocate (per-thread) memory and setup tasks. /// /// \param negative The negative object to be processed. /// /// \param threadCount The number of threads to be used to perform the /// processing. /// /// \param threadCount Total number of threads that will be used for /// processing. Less than or equal to MaxThreads. /// /// \param tileSize Size of source tiles which will be processed. (Not all /// tiles will be this size due to edge conditions.) /// /// \param imageBounds Total size of image to be processed. /// /// \param imagePlanes Number of planes in the image. Less than or equal to /// kMaxColorPlanes. /// /// \param bufferPixelType Pixel type of image buffer (see dng_tag_types.h). /// /// \param allocator dng_memory_allocator to use for allocating temporary /// buffers, etc. virtual void Prepare (dng_negative & /* negative */, uint32 /* threadCount */, const dng_point & /* tileSize */, const dng_rect & /* imageBounds */, uint32 /* imagePlanes */, uint32 /* bufferPixelType */, dng_memory_allocator & /* allocator */) { } /// Implements filtering operation from one buffer to another. Source /// and destination pixels are set up in member fields of this class. /// Ideally, no allocation should be done in this routine. /// /// \param negative The negative associated with the pixels to be /// processed. /// /// \param threadIndex The thread on which this routine is being called, /// between 0 and threadCount - 1 for the threadCount passed to Prepare /// method. /// /// \param srcBuffer Input area and source pixels. /// /// \param dstBuffer Destination pixels. /// /// \param dstArea Destination pixel processing area. /// /// \param imageBounds Total image area to be processed; dstArea will /// always lie within these bounds. virtual void ProcessArea (dng_negative &negative, uint32 threadIndex, dng_pixel_buffer &srcBuffer, dng_pixel_buffer &dstBuffer, const dng_rect &dstArea, const dng_rect &imageBounds) = 0; virtual void Apply (dng_host &host, dng_negative &negative, AutoPtr<dng_image> &image); }; /*****************************************************************************/ /// \brief Class to represent an in-place (i.e., pointwise, per-pixel) opcode, /// such as a global tone curve. class dng_inplace_opcode: public dng_opcode { protected: dng_inplace_opcode (uint32 opcodeID, uint32 minVersion, uint32 flags); dng_inplace_opcode (uint32 opcodeID, dng_stream &stream, const char *name); public: /// The pixel data type of this opcode. virtual uint32 BufferPixelType (uint32 imagePixelType) { return imagePixelType; } /// 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 imageBounds; } /// Startup method called before any processing is performed on pixel areas. /// It can be used to allocate (per-thread) memory and setup tasks. /// /// \param negative The negative object to be processed. /// /// \param threadCount The number of threads to be used to perform the /// processing. /// /// \param threadCount Total number of threads that will be used for /// processing. Less than or equal to MaxThreads. /// /// \param tileSize Size of source tiles which will be processed. (Not all /// tiles will be this size due to edge conditions.) /// /// \param imageBounds Total size of image to be processed. /// /// \param imagePlanes Number of planes in the image. Less than or equal to /// kMaxColorPlanes. /// /// \param bufferPixelType Pixel type of image buffer (see dng_tag_types.h). /// /// \param allocator dng_memory_allocator to use for allocating temporary /// buffers, etc. virtual void Prepare (dng_negative & /* negative */, uint32 /* threadCount */, const dng_point & /* tileSize */, const dng_rect & /* imageBounds */, uint32 /* imagePlanes */, uint32 /* bufferPixelType */, dng_memory_allocator & /* allocator */) { } /// Implements image processing operation in a single buffer. The source /// pixels are provided as input to the buffer, and this routine /// calculates and writes the destination pixels to the same buffer. /// Ideally, no allocation should be done in this routine. /// /// \param negative The negative associated with the pixels to be /// processed. /// /// \param threadIndex The thread on which this routine is being called, /// between 0 and threadCount - 1 for the threadCount passed to Prepare /// method. /// /// \param srcBuffer Input area and source pixels. /// /// \param dstBuffer Destination pixels. /// /// \param dstArea Destination pixel processing area. /// /// \param imageBounds Total image area to be processed; dstArea will /// always lie within these bounds. virtual void ProcessArea (dng_negative &negative, uint32 threadIndex, dng_pixel_buffer &buffer, const dng_rect &dstArea, const dng_rect &imageBounds) = 0; virtual void Apply (dng_host &host, dng_negative &negative, AutoPtr<dng_image> &image); }; /*****************************************************************************/ #endif /*****************************************************************************/