You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
5.7 KiB
237 lines
5.7 KiB
/*****************************************************************************/
|
|
// 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
|
|
|
|
/*****************************************************************************/
|