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