| /*****************************************************************************/ |
| // Copyright 2007 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_hue_sat_map.h#2 $ */ |
| /* $DateTime: 2012/07/31 22:04:34 $ */ |
| /* $Change: 840853 $ */ |
| /* $Author: tknoll $ */ |
| |
| /** \file |
| * Table-based color correction data structure. |
| */ |
| |
| /*****************************************************************************/ |
| |
| #ifndef __dng_hue_sat_map__ |
| #define __dng_hue_sat_map__ |
| |
| /*****************************************************************************/ |
| |
| #include "dng_classes.h" |
| #include "dng_exceptions.h" |
| #include "dng_ref_counted_block.h" |
| #include "dng_safe_arithmetic.h" |
| #include "dng_types.h" |
| |
| /*****************************************************************************/ |
| |
| /// \brief A 3D table that maps HSV (hue, saturation, and value) floating-point |
| /// input coordinates in the range [0,1] to delta signals. The table must have at |
| /// least 1 sample in the hue dimension, at least 2 samples in the saturation |
| /// dimension, and at least 1 sample in the value dimension. Tables are stored in |
| /// value-hue-saturation order. |
| |
| class dng_hue_sat_map |
| { |
| |
| public: |
| |
| /// HSV delta signal. \param fHueShift is a delta value specified in degrees. |
| /// This parameter, added to the original hue, determines the output hue. A |
| /// value of 0 means no change. \param fSatScale and \param fValScale are |
| /// scale factors that are applied to saturation and value components, |
| /// respectively. These scale factors, multiplied by the original saturation |
| /// and value, determine the output saturation and value. A scale factor of |
| /// 1.0 means no change. |
| |
| struct HSBModify |
| { |
| real32 fHueShift; |
| real32 fSatScale; |
| real32 fValScale; |
| }; |
| |
| private: |
| |
| uint32 fHueDivisions; |
| uint32 fSatDivisions; |
| uint32 fValDivisions; |
| |
| uint32 fHueStep; |
| uint32 fValStep; |
| |
| dng_ref_counted_block fDeltas; |
| |
| HSBModify *SafeGetDeltas () |
| { |
| return (HSBModify *) fDeltas.Buffer_real32 (); |
| } |
| |
| public: |
| |
| /// Construct an empty (and invalid) hue sat map. |
| |
| dng_hue_sat_map (); |
| |
| /// Copy an existing hue sat map. |
| |
| dng_hue_sat_map (const dng_hue_sat_map &src); |
| |
| /// Copy an existing hue sat map. |
| |
| dng_hue_sat_map & operator= (const dng_hue_sat_map &rhs); |
| |
| /// Destructor. |
| |
| virtual ~dng_hue_sat_map (); |
| |
| /// Is this hue sat map invalid? |
| |
| bool IsNull () const |
| { |
| return !IsValid (); |
| } |
| |
| /// Is this hue sat map valid? |
| |
| bool IsValid () const |
| { |
| |
| return fHueDivisions > 0 && |
| fSatDivisions > 1 && |
| fValDivisions > 0 && |
| fDeltas.Buffer (); |
| |
| } |
| |
| /// Clear the hue sat map, making it invalid. |
| |
| void SetInvalid () |
| { |
| |
| fHueDivisions = 0; |
| fSatDivisions = 0; |
| fValDivisions = 0; |
| |
| fHueStep = 0; |
| fValStep = 0; |
| |
| fDeltas.Clear (); |
| |
| } |
| |
| /// Get the table dimensions (number of samples in each dimension). |
| |
| void GetDivisions (uint32 &hueDivisions, |
| uint32 &satDivisions, |
| uint32 &valDivisions) const |
| { |
| hueDivisions = fHueDivisions; |
| satDivisions = fSatDivisions; |
| valDivisions = fValDivisions; |
| } |
| |
| /// Set the table dimensions (number of samples in each dimension). This |
| /// erases any existing table data. |
| |
| void SetDivisions (uint32 hueDivisions, |
| uint32 satDivisions, |
| uint32 valDivisions = 1); |
| |
| /// Get a specific table entry, specified by table indices. |
| |
| void GetDelta (uint32 hueDiv, |
| uint32 satDiv, |
| uint32 valDiv, |
| HSBModify &modify) const; |
| |
| /// Make sure the table is writeable. |
| |
| void EnsureWriteable () |
| { |
| fDeltas.EnsureWriteable (); |
| } |
| |
| /// Set a specific table entry, specified by table indices. |
| |
| void SetDelta (uint32 hueDiv, |
| uint32 satDiv, |
| uint32 valDiv, |
| const HSBModify &modify) |
| { |
| |
| EnsureWriteable (); |
| |
| SetDeltaKnownWriteable (hueDiv, |
| satDiv, |
| valDiv, |
| modify); |
| |
| } |
| |
| /// Same as SetDelta, without checking that the table is writeable. |
| |
| void SetDeltaKnownWriteable (uint32 hueDiv, |
| uint32 satDiv, |
| uint32 valDiv, |
| const HSBModify &modify); |
| |
| /// Get the total number of samples (across all dimensions). |
| |
| uint32 DeltasCount () const |
| { |
| uint32 deltaCount; |
| if (!SafeUint32Mult(fValDivisions, fHueDivisions, &deltaCount) || |
| !SafeUint32Mult(deltaCount, fSatDivisions, &deltaCount)) |
| { |
| ThrowMemoryFull("Arithmetic overflow computing delta count"); |
| } |
| |
| return deltaCount; |
| } |
| |
| /// Direct read/write access to table entries. The entries are stored in |
| /// value-hue-saturation order (outer to inner). |
| |
| HSBModify *GetDeltas () |
| { |
| |
| EnsureWriteable (); |
| |
| return (HSBModify *) fDeltas.Buffer_real32 (); |
| |
| } |
| |
| /// Direct read-only access to table entries. The entries are stored in |
| /// value-hue-saturation order (outer to inner). |
| |
| const HSBModify *GetConstDeltas () const |
| { |
| return (const HSBModify *) fDeltas.Buffer_real32 (); |
| } |
| |
| /// Equality test. |
| |
| bool operator== (const dng_hue_sat_map &rhs) const; |
| |
| /// Compute a linearly-interpolated hue sat map (i.e., delta and scale factors) |
| /// from the specified tables, with the specified weight. map1 and map2 must |
| /// have the same dimensions. |
| |
| static dng_hue_sat_map * Interpolate (const dng_hue_sat_map &map1, |
| const dng_hue_sat_map &map2, |
| real64 weight1); |
| |
| }; |
| |
| /*****************************************************************************/ |
| |
| #endif |
| |
| /*****************************************************************************/ |