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.
236 lines
5.7 KiB
236 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 |
|
|
|
/*****************************************************************************/
|
|
|