summaryrefslogtreecommitdiff
path: root/gpr/source/lib/dng_sdk/dng_hue_sat_map.h
diff options
context:
space:
mode:
Diffstat (limited to 'gpr/source/lib/dng_sdk/dng_hue_sat_map.h')
-rw-r--r--gpr/source/lib/dng_sdk/dng_hue_sat_map.h229
1 files changed, 229 insertions, 0 deletions
diff --git a/gpr/source/lib/dng_sdk/dng_hue_sat_map.h b/gpr/source/lib/dng_sdk/dng_hue_sat_map.h
new file mode 100644
index 0000000..c0816e2
--- /dev/null
+++ b/gpr/source/lib/dng_sdk/dng_hue_sat_map.h
@@ -0,0 +1,229 @@
+/*****************************************************************************/
+// 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_ref_counted_block.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
+ {
+ return fValDivisions *
+ fHueDivisions *
+ fSatDivisions;
+ }
+
+ /// 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
+
+/*****************************************************************************/