IccMAX 2.1.27
Color Profile Tools
Loading...
Searching...
No Matches
CIccSampledCurveSegment Class Reference

#include <IccMpeBasic.h>

+ Inheritance diagram for CIccSampledCurveSegment:
+ Collaboration diagram for CIccSampledCurveSegment:

Public Member Functions

 CIccSampledCurveSegment (const CIccSampledCurveSegment &ITPC)
 
 CIccSampledCurveSegment (icFloatNumber start, icFloatNumber end)
 
virtual ~CIccSampledCurveSegment ()
 
virtual icFloatNumber Apply (icFloatNumber v) const
 
virtual bool Begin (CIccCurveSegment *pPrevSeg)
 
virtual void Describe (std::string &sDescription, int nVerboseness)
 
icFloatNumber EndPoint ()
 
virtual const icCharGetClassName () const
 
virtual icFloatNumberGetSamples ()
 
virtual icUInt32Number GetSize ()
 
virtual icCurveSegSignature GetType () const
 
virtual CIccCurveSegmentNewCopy () const
 
CIccSampledCurveSegmentoperator= (const CIccSampledCurveSegment &ParamCurveTag)
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 
virtual bool SetSize (icUInt32Number nSize, bool bZeroAlloc=true)
 
icFloatNumber StartPoint ()
 
virtual icValidateStatus Validate (std::string sigPath, std::string &sReport, const CIccTagMultiProcessElement *pMPE=NULL, const CIccProfile *pProfile=NULL) const
 
virtual bool Write (CIccIO *pIO)
 

Static Public Member Functions

static CIccCurveSegmentCreate (icCurveSegSignature sig, icFloatNumber start, icFloatNumber end)
 

Protected Attributes

icFloatNumber m_endPoint
 
icFloatNumber m_last
 
icUInt32Number m_nCount
 
icUInt32Number m_nReserved
 
icFloatNumberm_pSamples
 
icFloatNumber m_range
 
icFloatNumber m_startPoint
 

Detailed Description

Class: CIccSampledCurveSegment

Purpose: The sampled curve segment

Constructor & Destructor Documentation

◆ CIccSampledCurveSegment() [1/2]

CIccSampledCurveSegment::CIccSampledCurveSegment ( icFloatNumber  start,
icFloatNumber  end 
)

Name: CIccSampledCurveSegment::CIccSampledCurveSegment

Purpose:

Args:

Return:

872{
873 m_nReserved = 0;
874 m_startPoint = start;
875 m_endPoint = end;
876 m_range = end - start;
877 m_nCount = 0;
878 m_pSamples = 0;
879 m_last = 0;
880}
icFloatNumber m_startPoint
Definition IccMpeBasic.h:119
icFloatNumber m_endPoint
Definition IccMpeBasic.h:120
icUInt32Number m_nReserved
Definition IccMpeBasic.h:121
icFloatNumber * m_pSamples
Definition IccMpeBasic.h:199
icFloatNumber m_last
Definition IccMpeBasic.h:202
icFloatNumber m_range
Definition IccMpeBasic.h:201
icUInt32Number m_nCount
Definition IccMpeBasic.h:198

References CIccCurveSegment::m_endPoint, m_last, m_nCount, CIccCurveSegment::m_nReserved, m_pSamples, m_range, and CIccCurveSegment::m_startPoint.

Referenced by CIccSampledCurveSegmentXml::CIccSampledCurveSegmentXml(), and CIccCurveSegment::Create().

+ Here is the caller graph for this function:

◆ CIccSampledCurveSegment() [2/2]

CIccSampledCurveSegment::CIccSampledCurveSegment ( const CIccSampledCurveSegment curve)

Name: CIccSampledCurveSegment::CIccSampledCurveSegment

Purpose:

Args:

Return:

893{
894 m_nReserved = curve.m_nReserved;
896 m_endPoint = curve.m_endPoint;
898 m_nCount = curve.m_nCount;
899 m_last = curve.m_last;
900
901 if (m_nCount) {
902 m_pSamples = (icFloatNumber*)malloc(m_nCount * sizeof(icFloatNumber));
903 if (m_pSamples)
904 memcpy(m_pSamples, curve.m_pSamples, m_nCount * sizeof(icFloatNumber));
905 else
906 m_nCount = 0;
907 }
908 else{
909 m_pSamples = NULL;
910 }
911}
float icFloatNumber
Definition IccDefs.h:101

References CIccCurveSegment::m_endPoint, m_last, m_nCount, CIccCurveSegment::m_nReserved, m_pSamples, m_range, and CIccCurveSegment::m_startPoint.

Referenced by NewCopy().

+ Here is the caller graph for this function:

◆ ~CIccSampledCurveSegment()

CIccSampledCurveSegment::~CIccSampledCurveSegment ( )
virtual

Name: CIccSampledCurveSegment::~CIccSampledCurveSegment

Purpose:

Args:

Return:

957{
958 if (m_pSamples)
959 free(m_pSamples);
960}

References m_pSamples.

Member Function Documentation

◆ Apply()

icFloatNumber CIccSampledCurveSegment::Apply ( icFloatNumber  v) const
virtual

Name: CIccSampledCurveSegment::Apply

Purpose:

Args:

Return:

Implements CIccCurveSegment.

1207{
1208 if (v<m_startPoint)
1209 v=m_startPoint;
1210 else if (v>m_endPoint)
1211 v=m_endPoint;
1212
1214 icUInt32Number index = (icUInt32Number) pos;
1215 icFloatNumber remainder = pos - (icFloatNumber)index;
1216
1217 if (remainder==0.0)
1218 return m_pSamples[index];
1219
1220 return (icFloatNumber)((1.0-remainder)*m_pSamples[index] + remainder*m_pSamples[index+1]);
1221}
unsigned long icUInt32Number
Definition icProfileHeader.h:262

References CIccCurveSegment::m_endPoint, m_last, m_pSamples, m_range, and CIccCurveSegment::m_startPoint.

◆ Begin()

bool CIccSampledCurveSegment::Begin ( CIccCurveSegment pPrevSeg = NULL)
virtual

Name: CIccSampledCurveSegment::Begin

Purpose:

Args:

Return:

Implements CIccCurveSegment.

1177{
1178 if (m_nCount<2)
1179 return false;
1180
1182 m_last = (icFloatNumber)(m_nCount - 1);
1183
1184 if (m_endPoint-m_startPoint == 0.0)
1185 return false;
1186
1187 if (!pPrevSeg)
1188 return false;
1189
1190 //Set up interpolation from Application of last segment
1191 m_pSamples[0] = pPrevSeg->Apply(m_startPoint);
1192
1193 return true;
1194}
virtual icFloatNumber Apply(icFloatNumber v) const =0

References CIccCurveSegment::Apply(), CIccCurveSegment::m_endPoint, m_last, m_nCount, m_pSamples, m_range, and CIccCurveSegment::m_startPoint.

+ Here is the call graph for this function:

◆ Create()

CIccCurveSegment * CIccCurveSegment::Create ( icCurveSegSignature  sig,
icFloatNumber  start,
icFloatNumber  end 
)
staticinherited

Name: CIccCurveSegment::Create

Purpose:

Args:

Return:

2518{
2519 switch(sig) {
2521 return new CIccFormulaCurveSegment(start, end);
2523 return new CIccSampledCurveSegment(start, end);
2524 default:
2525 return NULL;
2526 }
2527
2528}
@ icSigSampledCurveSeg
Definition icProfileHeader.h:1047
@ icSigFormulaCurveSeg
Definition icProfileHeader.h:1046
Definition IccMpeBasic.h:133
Definition IccMpeBasic.h:172

References CIccFormulaCurveSegment::CIccFormulaCurveSegment(), CIccSampledCurveSegment(), icSigFormulaCurveSeg, and icSigSampledCurveSeg.

Referenced by CIccSegmentedCurve::Read().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Describe()

void CIccSampledCurveSegment::Describe ( std::string &  sDescription,
int  nVerboseness 
)
virtual

Name: CIccSampledCurveSegment::Describe

Purpose:

Args:

Return:

Implements CIccCurveSegment.

1018{
1019 icChar buf[128];
1020
1021 if (m_nCount<2) {
1022 sDescription += "Empty Segment [";
1024 sDescription += "-Infinity, ";
1025 else {
1026 sprintf(buf, "%.8f, ", m_startPoint);
1027 sDescription += buf;
1028 }
1030 sDescription += "+Infinity";
1031 else {
1032 sprintf(buf, "%.8f", m_endPoint);
1033 sDescription += buf;
1034 }
1035
1036 sprintf(buf, "]\n");
1037 sDescription += buf;
1038 }
1039 else {
1040 sDescription += "Sampled Segment [";
1042 sDescription += "-Infinity, ";
1043 else {
1044 sprintf(buf, "%.8f, ", m_startPoint);
1045 sDescription += buf;
1046 }
1048 sDescription += "+Infinity";
1049 else {
1050 sprintf(buf, "%.8f", m_endPoint);
1051 sDescription += buf;
1052 }
1053 sprintf(buf, "]\n");
1054 sDescription += buf;
1055 sDescription += "IN OUT\n";
1056
1058
1061
1062 for (i=1; i<m_nCount; i++) {
1063 sprintf(buf, "%.8f %.8f\n", m_startPoint + (icFloatNumber)i*range/last, m_pSamples[i]);
1064 sDescription += buf;
1065 }
1066 }
1067 sDescription += "\n";
1068}
#define icMinFloat32Number
Definition icProfileHeader.h:318
#define icMaxFloat32Number
Definition icProfileHeader.h:317
char icChar
Definition IccDefs.h:110

References CIccCurveSegment::m_endPoint, m_nCount, m_pSamples, and CIccCurveSegment::m_startPoint.

◆ EndPoint()

icFloatNumber CIccCurveSegment::EndPoint ( )
inlineinherited
116{ return m_endPoint;}

References CIccCurveSegment::m_endPoint.

Referenced by CIccSegmentedCurve::Apply(), and CIccSegmentedCurve::Insert().

+ Here is the caller graph for this function:

◆ GetClassName()

virtual const icChar * CIccSampledCurveSegment::GetClassName ( ) const
inlinevirtual

Implements CIccCurveSegment.

181{ return "CIccSampledCurveSegment"; }

◆ GetSamples()

virtual icFloatNumber * CIccSampledCurveSegment::GetSamples ( )
inlinevirtual
186{ return m_pSamples; }

References m_pSamples.

◆ GetSize()

virtual icUInt32Number CIccSampledCurveSegment::GetSize ( )
inlinevirtual
184{ return m_nCount; }

References m_nCount.

◆ GetType()

virtual icCurveSegSignature CIccSampledCurveSegment::GetType ( ) const
inlinevirtual

Implements CIccCurveSegment.

180{ return icSigSampledCurveSeg; }

References icSigSampledCurveSeg.

Referenced by Write().

+ Here is the caller graph for this function:

◆ NewCopy()

virtual CIccCurveSegment * CIccSampledCurveSegment::NewCopy ( ) const
inlinevirtual

Implements CIccCurveSegment.

177{ return new CIccSampledCurveSegment(*this);}

References CIccSampledCurveSegment().

+ Here is the call graph for this function:

◆ operator=()

CIccSampledCurveSegment & CIccSampledCurveSegment::operator= ( const CIccSampledCurveSegment curve)

Name: &CIccSampledCurveSegment::operator=

Purpose:

Args:

Return:

924{
925 if (m_pSamples)
926 free(m_pSamples);
927
928 m_nReserved = curve.m_nReserved;
930 m_endPoint = curve.m_endPoint;
931 m_nCount = curve.m_nCount;
932
933 if (m_nCount) {
934 m_pSamples = (icFloatNumber*)malloc(m_nCount * sizeof(icFloatNumber));
935 if (m_pSamples)
936 memcpy(m_pSamples, curve.m_pSamples, m_nCount * sizeof(icFloatNumber));
937 else
938 m_nCount = 0;
939 }
940 else {
941 m_pSamples = NULL;
942 }
943 return (*this);
944}

References CIccCurveSegment::m_endPoint, m_nCount, CIccCurveSegment::m_nReserved, m_pSamples, and CIccCurveSegment::m_startPoint.

◆ Read()

bool CIccSampledCurveSegment::Read ( icUInt32Number  size,
CIccIO pIO 
)
virtual

Name: CIccSampledCurveSegment::Read

Purpose:

Args:

Return:

Implements CIccCurveSegment.

1081{
1083
1084 icUInt32Number headerSize = sizeof(icTagTypeSignature) +
1085 sizeof(icUInt32Number) +
1086 sizeof(icUInt32Number);
1087
1088 if (headerSize > size)
1089 return false;
1090
1091 if (!pIO) {
1092 return false;
1093 }
1094
1095 if (!pIO->Read32(&sig))
1096 return false;
1097
1098 if (!pIO->Read32(&m_nReserved))
1099 return false;
1100
1101 if (!pIO->Read32(&m_nCount))
1102 return false;
1103
1104 if (m_nCount > size - headerSize || m_nCount * sizeof(icFloat32Number) > size - headerSize)
1105 return false;
1106
1107 //Reserve room for first point who's value comes from previous segment
1108 m_nCount++;
1109
1110 if (!SetSize(m_nCount, false))
1111 return false;
1112
1113 if (m_nCount) {
1115 return false;
1116 }
1117
1118 //Initialize first point with zero. Properly initialized during Begin()
1119 m_pSamples[0] = 0;
1120
1121 return true;
1122}
float icFloat32Number
Definition icProfileHeader.h:313
long icInt32Number
Definition icProfileHeader.h:291
icCurveSegSignature
Definition icProfileHeader.h:1045
icTagTypeSignature
Definition icProfileHeader.h:526
virtual bool SetSize(icUInt32Number nSize, bool bZeroAlloc=true)
Definition IccMpeBasic.cpp:980
icInt32Number ReadFloat32Float(void *pBufFloat, icInt32Number nNum=1)
Definition IccIO.cpp:302
icInt32Number Read32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:143

References m_nCount, CIccCurveSegment::m_nReserved, m_pSamples, CIccIO::Read32(), CIccIO::ReadFloat32Float(), and SetSize().

+ Here is the call graph for this function:

◆ SetSize()

bool CIccSampledCurveSegment::SetSize ( icUInt32Number  nCount,
bool  bZeroAlloc = true 
)
virtual

Name: CIccSampledCurveSegment::SetSize

Purpose: Sets size of sampled lookup table. Previous data (if exists) is lost.

Args: nCount = number of elements in lut (must be >= 2). Note: the m_pSample[0] is initialized from the the previous segment. It is not saved as part of Write(), or loaded as part of Read(). It will be initialized during the call to Begin(), The actual count of elements written to the file will be nCount-1 bZeroAlloc = flag to decide if memory should be set to zero.

Return: true if allocation successful.

981{
982 if (!nCount) {
983 if (m_pSamples)
984 free(m_pSamples);
985 m_pSamples = NULL;
986 m_nCount = nCount;
987 return true;
988 }
989
990 if (m_pSamples) {
991 free(m_pSamples);
992 }
993
994 if (bZeroAlloc)
995 m_pSamples = (icFloatNumber*)calloc(nCount, sizeof(icFloatNumber));
996 else
997 m_pSamples = (icFloatNumber*)malloc(nCount * sizeof(icFloatNumber));
998
999 if (m_pSamples)
1000 m_nCount = nCount;
1001 else
1002 m_nCount = 0;
1003
1004 return (m_pSamples != NULL);
1005}

References m_nCount, and m_pSamples.

Referenced by CIccSampledCurveSegmentXml::ParseXml(), and Read().

+ Here is the caller graph for this function:

◆ StartPoint()

icFloatNumber CIccCurveSegment::StartPoint ( )
inlineinherited
115{ return m_startPoint; }

References CIccCurveSegment::m_startPoint.

Referenced by CIccSegmentedCurve::Insert(), and CIccSegmentedCurve::Write().

+ Here is the caller graph for this function:

◆ Validate()

icValidateStatus CIccSampledCurveSegment::Validate ( std::string  sigPath,
std::string &  sReport,
const CIccTagMultiProcessElement pMPE = NULL,
const CIccProfile pProfile = NULL 
) const
virtual

Name: CIccSampledCurveSegment::Validate

Purpose:

Args:

Return:

Implements CIccCurveSegment.

1234{
1235 CIccInfo Info;
1236 std::string sSigPathName = Info.GetSigPathName(sigPath);
1237
1239 if (m_nReserved) {
1240 sReport += icMsgValidateWarning;
1241 sReport += sSigPathName;
1242 sReport += " sampled curve has non zero reserved data.\n";
1243 rv = icValidateWarning;
1244 }
1245
1246 if (m_nCount<1) {
1247 sReport += icMsgValidateCriticalError;
1248 sReport += sSigPathName;
1249 sReport += " sampled curve has too few sample points.\n";
1251 }
1252 else if (m_endPoint-m_startPoint == 0.0) {
1253 sReport += icMsgValidateWarning;
1254 sReport += sSigPathName;
1255 sReport += " sampled curve has a range of zero.\n";
1257 }
1258
1259 return rv;
1260}
icValidateStatus
Definition IccDefs.h:119
@ icValidateOK
Definition IccDefs.h:120
@ icValidateWarning
Definition IccDefs.h:121
@ icValidateCriticalError
Definition IccDefs.h:123
ICCPROFLIB_API const char * icMsgValidateWarning
Definition IccUtil.cpp:90
ICCPROFLIB_API const char * icMsgValidateCriticalError
Definition IccUtil.cpp:92
ICCPROFLIB_API icValidateStatus icMaxStatus(icValidateStatus s1, icValidateStatus s2)
Definition IccUtil.cpp:244
Definition IccUtil.h:303
std::string GetSigPathName(std::string sigPath)
Definition IccUtil.cpp:1614

References CIccInfo::GetSigPathName(), icMaxStatus(), icMsgValidateCriticalError, icMsgValidateWarning, icValidateCriticalError, icValidateOK, icValidateWarning, CIccCurveSegment::m_endPoint, m_nCount, CIccCurveSegment::m_nReserved, and CIccCurveSegment::m_startPoint.

+ Here is the call graph for this function:

◆ Write()

bool CIccSampledCurveSegment::Write ( CIccIO pIO)
virtual

Name: CIccSampledCurveSegment::Write

Purpose:

Args:

Return:

Implements CIccCurveSegment.

1135{
1137
1138 if (!pIO)
1139 return false;
1140
1141 if (!pIO->Write32(&sig))
1142 return false;
1143
1144 if (!pIO->Write32(&m_nReserved))
1145 return false;
1146
1147 icUInt32Number nCount;
1148
1149 if (m_nCount)
1150 nCount = m_nCount -1;
1151 else
1152 nCount = 0;
1153
1154 if (!pIO->Write32(&nCount))
1155 return false;
1156
1157 //First point in samples is ONLY for interpolation (not saved)
1158 if (nCount) {
1159 if (pIO->WriteFloat32Float(m_pSamples+1, nCount)!=(icInt32Number)nCount)
1160 return false;
1161 }
1162
1163 return true;
1164}
virtual icCurveSegSignature GetType() const
Definition IccMpeBasic.h:180
icInt32Number Write32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:152
icInt32Number WriteFloat32Float(void *pBufFloat, icInt32Number nNum=1)
Definition IccIO.cpp:321

References GetType(), m_nCount, CIccCurveSegment::m_nReserved, m_pSamples, CIccIO::Write32(), and CIccIO::WriteFloat32Float().

+ Here is the call graph for this function:

Field Documentation

◆ m_endPoint

◆ m_last

icFloatNumber CIccSampledCurveSegment::m_last
protected

◆ m_nCount

◆ m_nReserved

◆ m_pSamples

◆ m_range

icFloatNumber CIccSampledCurveSegment::m_range
protected

◆ m_startPoint


The documentation for this class was generated from the following files: