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

#include <IccTagXml.h>

+ Inheritance diagram for CIccTagXmlMultiProcessElement:
+ Collaboration diagram for CIccTagXmlMultiProcessElement:

Public Member Functions

virtual ~CIccTagXmlMultiProcessElement ()
 
virtual void Apply (CIccApplyTagMpe *pApply, icFloatNumber *pDestPixel, const icFloatNumber *pSrcPixel) const
 
virtual void Attach (CIccMultiProcessElement *pElement)
 
virtual bool Begin (icElemInterp nInterp=icElemInterpLinear, IIccProfileConnectionConditions *pProfilePCC=NULL, IIccProfileConnectionConditions *pAppliedPCC=NULL, IIccCmmEnvVarLookup *pCmmEnvVarLookup=NULL)
 
void DeleteElement (int nIndex)
 
virtual void Describe (std::string &sDescription, int nVerboseness)
 
virtual void DetachIO ()
 
IIccProfileConnectionConditionsGetAppliedPCC ()
 
virtual const char * GetClassName () const
 
IIccCmmEnvVarLookupGetCmmEnvLookup ()
 
CIccMultiProcessElementGetElement (int nIndex)
 
virtual const char * GetExtClassName () const
 
virtual const char * GetExtDerivedClassName () const
 
virtual IIccExtensionTagGetExtension ()
 
virtual CIccApplyTagMpeGetNewApply ()
 
IIccProfileConnectionConditionsGetProfilePCC ()
 
virtual icArraySignature GetTagArrayType () const
 
virtual icStructSignature GetTagStructType () const
 
virtual icTagTypeSignature GetType () const
 
virtual void Insert (CIccMultiProcessElement *pElement)
 
virtual bool IsArrayType ()
 
bool IsLateBinding () const
 
bool IsLateBindingReflectance () const
 
virtual bool IsMBBType ()
 
virtual bool IsNumArrayType () const
 
virtual bool IsSupported ()
 
virtual CIccTagNewCopy () const
 
icUInt32Number NumElements () const
 
icUInt16Number NumInputChannels () const
 
icUInt16Number NumOutputChannels () const
 
virtual bool ParseXml (xmlNode *pNode, std::string &parseStr)
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 
virtual bool Read (icUInt32Number size, CIccIO *pIO, CIccProfile *pProfile)
 
virtual bool ReadAll ()
 
void SetChannels (icUInt16Number nInputChannels, icUInt16Number nOutputChannels)
 
virtual bool ToXml (std::string &xml, std::string blanks="")
 
virtual icValidateStatus Validate (std::string sigPath, std::string &sReport, const CIccProfile *pProfile=NULL) const
 
virtual bool Write (CIccIO *pIO)
 

Static Public Member Functions

static CIccTagCreate (icTagTypeSignature sig)
 
static CIccMultiProcessElementCreateElement (const icChar *szElementNodeName)
 

Data Fields

icUInt32Number m_nReserved
 

Protected Member Functions

virtual void Clean ()
 
virtual icInt32Number ElementIndex (CIccMultiProcessElement *pElem)
 
virtual CIccMultiProcessElementList::iterator GetFirstElem ()
 
virtual CIccMultiProcessElementList::iterator GetLastElem ()
 
virtual void GetNextElemIterator (CIccMultiProcessElementList::iterator &itr)
 
bool ParseElement (xmlNode *pNode, std::string &parseStr)
 

Protected Attributes

CIccMultiProcessElementListm_list
 
icUInt16Number m_nBufChannels
 
icUInt16Number m_nInputChannels
 
icUInt16Number m_nOutputChannels
 
icUInt32Number m_nProcElements
 
IIccProfileConnectionConditionsm_pAppliedPCC
 
IIccCmmEnvVarLookupm_pCmmEnvVarLookup
 
icPositionNumberm_position
 
IIccProfileConnectionConditionsm_pProfilePCC
 

Detailed Description

Constructor & Destructor Documentation

◆ ~CIccTagXmlMultiProcessElement()

virtual CIccTagXmlMultiProcessElement::~CIccTagXmlMultiProcessElement ( )
inlinevirtual
598{}

Member Function Documentation

◆ Apply()

void CIccTagMultiProcessElement::Apply ( CIccApplyTagMpe pApply,
icFloatNumber pDestPixel,
const icFloatNumber pSrcPixel 
) const
virtualinherited

Name: CIccTagMultiProcessElement::Apply

Purpose:

Args:

Return:

1441{
1442 if (!pApply || !pApply->GetList() || !pApply->GetList()->size()) {
1443 memcpy(pDestPixel, pSrcPixel, m_nInputChannels*sizeof(icFloatNumber));
1444 return;
1445 }
1446
1447#ifdef DEBUG_MPE_APPLY
1448 int nCount = 0;
1449 printf("Start of MPE APPLY\n");
1450 DumpMpeApplyPixe(nCount++, pSrcPixel, m_nInputChannels);
1451#endif
1452
1453 CIccDblPixelBuffer *pApplyBuf = pApply->GetBuf();
1454 CIccApplyMpeIter i = pApply->begin();
1455 CIccApplyMpeIter next;
1456
1457 next = i;
1458 next++;
1459
1460 if (next==pApply->end()) {
1461 //Elements rely on pDestPixel != pSrcPixel
1462 if (pSrcPixel==pDestPixel) {
1463 i->ptr->Apply(pApplyBuf->GetDstBuf(), pSrcPixel);
1464 memcpy(pDestPixel, pApplyBuf->GetDstBuf(), m_nOutputChannels*sizeof(icFloatNumber));
1465 }
1466 else {
1467 i->ptr->Apply(pDestPixel, pSrcPixel);
1468 }
1469#ifdef DEBUG_MPE_APPLY
1470 DumpMpeApplyPixe(nCount++, pSrcPixel, m_nInputChannels);
1471#endif
1472 }
1473 else {
1474 i->ptr->Apply(pApplyBuf->GetDstBuf(), pSrcPixel);
1475
1476#ifdef DEBUG_MPE_APPLY
1477 DumpMpeApplyPixe(nCount++, pApplyBuf->GetDstBuf(), m_nInputChannels);
1478#endif
1479
1480 i++;
1481 next++;
1482 pApplyBuf->Switch();
1483
1484 while (next != pApply->end()) {
1485 CIccMultiProcessElement *pElem = i->ptr->GetElem();
1486
1487 if (!pElem->IsAcs()) {
1488 i->ptr->Apply(pApplyBuf->GetDstBuf(), pApplyBuf->GetSrcBuf());
1489
1490#ifdef DEBUG_MPE_APPLY
1491 DumpMpeApplyPixe(nCount++, pApplyBuf->GetDstBuf(), m_nInputChannels);
1492#endif
1493
1494 pApplyBuf->Switch();
1495 }
1496
1497 i++;
1498 next++;
1499 }
1500
1501 i->ptr->Apply(pDestPixel, pApplyBuf->GetSrcBuf());
1502
1503#ifdef DEBUG_MPE_APPLY
1504 DumpMpeApplyPixe(nCount++, pDestPixel, m_nInputChannels);
1505#endif
1506
1507 }
1508
1509#ifdef DEBUG_MPE_APPLY
1510 printf("End MPE Apply\n\n");
1511#endif
1512
1513}
float icFloatNumber
Definition IccDefs.h:101
CIccApplyMpeList::iterator CIccApplyMpeIter
Definition IccTagMPE.h:130
Definition IccTagMPE.h:146
virtual void Apply(CIccApplyMpe *pApply, icFloatNumber *pDestPixel, const icFloatNumber *pSrcPixel) const =0
virtual bool IsAcs()
Definition IccTagMPE.h:177
Definition IccTagMPE.h:278
void Switch()
Definition IccTagMPE.h:300
icFloatNumber * GetSrcBuf()
Definition IccTagMPE.h:297
icFloatNumber * GetDstBuf()
Definition IccTagMPE.h:298
CIccDblPixelBuffer * GetBuf()
Definition IccTagMPE.h:330
CIccApplyMpeIter end()
Definition IccTagMPE.h:334
CIccApplyMpeList * GetList()
Definition IccTagMPE.h:331
CIccApplyMpeIter begin()
Definition IccTagMPE.h:333
icUInt16Number m_nInputChannels
Definition IccTagMPE.h:415
icUInt16Number m_nOutputChannels
Definition IccTagMPE.h:416

References CIccApplyMpe::Apply(), CIccApplyTagMpe::begin(), CIccApplyTagMpe::end(), CIccApplyTagMpe::GetBuf(), CIccDblPixelBuffer::GetDstBuf(), CIccApplyMpe::GetElem(), CIccApplyTagMpe::GetList(), CIccDblPixelBuffer::GetSrcBuf(), CIccMultiProcessElement::IsAcs(), CIccTagMultiProcessElement::m_nInputChannels, CIccTagMultiProcessElement::m_nOutputChannels, CIccApplyMpePtr::ptr, and CIccDblPixelBuffer::Switch().

Referenced by main().

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

◆ Attach()

void CIccTagMultiProcessElement::Attach ( CIccMultiProcessElement pElement)
virtualinherited

Name: CIccTagMultiProcessElement::Attach

Purpose:

Args:

Return:

923{
924 if (!m_list) {
926 }
927
929
930 ptr.ptr = pElement;
931
932 m_list->push_back(ptr);
933}
std::list< CIccMultiProcessElementPtr > CIccMultiProcessElementList
Definition IccTagMPE.h:120
CIccMultiProcessElement * ptr
Definition IccTagMPE.h:117
Definition IccTagMPE.h:115
CIccMultiProcessElementList * m_list
Definition IccTagMPE.h:419

References CIccTagMultiProcessElement::m_list, and CIccMultiProcessElementPtr::ptr.

Referenced by CDevLinkWriter::begin(), CIccDefaultEncProfileConverter::ConvertFromParams(), and main().

+ Here is the caller graph for this function:

◆ Begin()

bool CIccTagMultiProcessElement::Begin ( icElemInterp  nInterp = icElemInterpLinear,
IIccProfileConnectionConditions pProfilePCC = NULL,
IIccProfileConnectionConditions pAppliedPCC = NULL,
IIccCmmEnvVarLookup pCmmEnvVarLookup = NULL 
)
virtualinherited

Name: CIccTagMultiProcessElement::Begin

Purpose: Initialize for application of processing element

Args: nInterp defines interpolation to use for N-Dimensional LUTs pPCC provides Profile Connection Conditions (only expected to be valid during call to Begin)

Return: true if initialization successful, false if not

1290{
1291 if (!m_list || !m_list->size()) {
1293 return false;
1294 else
1295 return true;
1296 }
1297
1298 m_pProfilePCC = pProfilePCC;
1299 m_pAppliedPCC = pAppliedPCC;
1300 m_pCmmEnvVarLookup = pCmmEnvVarLookup;
1301
1302 CIccMultiProcessElementList::iterator i;
1303
1305
1306 //Now we initialize each processing element checking channel matching as we go
1307 CIccMultiProcessElement *last=NULL;
1308 i = m_list->begin();
1309 if (i->ptr->NumInputChannels() != m_nInputChannels)
1310 return false;
1311
1312 for (; i!= m_list->end(); i++) {
1313 if (last) {
1314 if (i->ptr->NumInputChannels() != last->NumOutputChannels())
1315 return false;
1316 }
1317 last = i->ptr;
1318
1319 if (last) {
1320 if (m_nBufChannels < last->NumOutputChannels())
1322
1323 if (!last->Begin(nInterp, this))
1324 return false;
1325 }
1326 }
1327
1328 //The output channels must match
1329 if (last && last->NumOutputChannels() != m_nOutputChannels)
1330 return false;
1331
1332 m_pAppliedPCC = NULL;
1333 m_pProfilePCC = NULL;
1334
1335 return true;
1336}
virtual icUInt16Number NumOutputChannels() const
Definition IccTagMPE.h:160
virtual bool Begin(icElemInterp nIterp=icElemInterpLinear, CIccTagMultiProcessElement *pMPE=NULL)=0
IIccCmmEnvVarLookup * m_pCmmEnvVarLookup
Definition IccTagMPE.h:431
icUInt16Number NumOutputChannels() const
Definition IccTagMPE.h:394
IIccProfileConnectionConditions * m_pAppliedPCC
Definition IccTagMPE.h:429
icUInt16Number m_nBufChannels
Definition IccTagMPE.h:426
IIccProfileConnectionConditions * m_pProfilePCC
Definition IccTagMPE.h:428

References CIccMultiProcessElement::Begin(), CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nBufChannels, CIccTagMultiProcessElement::m_nInputChannels, CIccTagMultiProcessElement::m_nOutputChannels, CIccTagMultiProcessElement::m_pAppliedPCC, CIccTagMultiProcessElement::m_pCmmEnvVarLookup, CIccTagMultiProcessElement::m_pProfilePCC, CIccMultiProcessElement::NumInputChannels(), CIccMultiProcessElement::NumOutputChannels(), and CIccMultiProcessElementPtr::ptr.

Referenced by main().

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

◆ Clean()

void CIccTagMultiProcessElement::Clean ( )
protectedvirtualinherited

Name: CIccTagMultiProcessElement::Clean

Purpose:

Args:

Return:

832{
833 if (m_list) {
834 CIccLutPtrMap map;
835 CIccMultiProcessElementList::iterator i;
836
837 for (i=m_list->begin(); i!=m_list->end(); i++) {
838 if (!map[i->ptr].offset) {
839 map[i->ptr].offset = 1;
840 delete i->ptr;
841 }
842 }
843
844 delete m_list;
845 m_list = NULL;
846 }
847
848 if (m_position) {
849 free(m_position);
850 m_position = NULL;
851 }
852
853 m_nProcElements = 0;
854}
std::map< CIccMultiProcessElement *, icPositionNumber > CIccLutPtrMap
Definition IccTagMPE.cpp:819
icUInt32Number m_nProcElements
Definition IccTagMPE.h:422
icPositionNumber * m_position
Definition IccTagMPE.h:423

References CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nProcElements, CIccTagMultiProcessElement::m_position, icPositionNumber::offset, and CIccMultiProcessElementPtr::ptr.

Referenced by CIccTagMultiProcessElement::~CIccTagMultiProcessElement(), CIccTagMultiProcessElement::operator=(), and CIccTagMultiProcessElement::Read().

+ Here is the caller graph for this function:

◆ Create()

CIccTag * CIccTag::Create ( icTagTypeSignature  sig)
staticinherited

Name: CIccTag::Create

Purpose: This is a static tag creator based upon tag signature type

Args: sig = tag type signature

Return: Pointer to Allocated tag

144{
145 return CIccTagCreator::CreateTag(sig);
146}
static CIccTag * CreateTag(icTagTypeSignature tagTypeSig)
Definition IccTagFactory.h:279

References CIccTagCreator::CreateTag().

Referenced by CIccDefaultEncProfileConverter::ConvertFromParams(), CIccTagStruct::LoadElem(), CIccProfileXml::ParseTag(), CIccTagXmlStruct::ParseTag(), CIccMpeXmlTintArray::ParseXml(), CIccTagXmlArray::ParseXml(), CIccMpeTintArray::Read(), CIccTagLutAtoB::Read(), CIccTagLut8::Read(), CIccTagLut16::Read(), CIccTagLut8::SetColorSpaces(), CIccTagLut16::SetColorSpaces(), and CIccProfileDescText::SetType().

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

◆ CreateElement()

CIccMultiProcessElement * CIccTagXmlMultiProcessElement::CreateElement ( const icChar szElementNodeName)
static
3977{
3978 if (!strcmp(szElementNodeName, "CurveSetElement")) {
3979 return new CIccMpeXmlCurveSet;
3980 }
3981 if (!strcmp(szElementNodeName, "MatrixElement")) {
3982 return new CIccMpeXmlMatrix;
3983 }
3984 if (!strcmp(szElementNodeName, "CLutElement")) {
3985 return new CIccMpeXmlCLUT;
3986 }
3987 if (!strcmp(szElementNodeName, "ExtCLutElement")) {
3988 return new CIccMpeXmlExtCLUT;
3989 }
3990 if (!strcmp(szElementNodeName, "CalculatorElement")) {
3991 return new CIccMpeXmlCalculator;
3992 }
3993 if (!strcmp(szElementNodeName, "TintArrayElement")) {
3994 return new CIccMpeXmlTintArray;
3995 }
3996 if (!strcmp(szElementNodeName, "ToneMapElement")) {
3997 return new CIccMpeXmlToneMap;
3998 }
3999 if (!strcmp(szElementNodeName, "JabToXYZElement")) {
4000 return new CIccMpeXmlJabToXYZ;
4001 }
4002 if (!strcmp(szElementNodeName, "UnknownElement")) {
4003 return new CIccMpeXmlUnknown;
4004 }
4005 if (!strcmp(szElementNodeName, "XYZToJabElement")) {
4006 return new CIccMpeXmlXYZToJab;
4007 }
4008 if (!strcmp(szElementNodeName, "EmissionMatrixElement")) {
4009 return new CIccMpeXmlEmissionMatrix;
4010 }
4011 if (!strcmp(szElementNodeName, "InvEmissionMatrixElement")) {
4012 return new CIccMpeXmlInvEmissionMatrix;
4013 }
4014 if (!strcmp(szElementNodeName, "EmissionCLutElement")) {
4015 return new CIccMpeXmlEmissionCLUT;
4016 }
4017 if (!strcmp(szElementNodeName, "ReflectanceCLutElement")) {
4018 return new CIccMpeXmlReflectanceCLUT;
4019 }
4020 if (!strcmp(szElementNodeName, "EmissionObserverElement")) {
4021 return new CIccMpeXmlEmissionObserver;
4022 }
4023 if (!strcmp(szElementNodeName, "ReflectanceObserverElement")) {
4025 }
4026 if (!strcmp(szElementNodeName, "BAcsElement")) {
4027 return new CIccMpeXmlBAcs;
4028 }
4029 if (!strcmp(szElementNodeName, "EAcsElement")) {
4030 return new CIccMpeXmlEAcs;
4031 }
4032 return NULL;
4033}
Definition IccMpeXml.h:88
Definition IccMpeXml.h:110
Definition IccMpeXml.h:126
Definition IccMpeXml.h:152
Definition IccMpeXml.h:167
Definition IccMpeXml.h:180
Definition IccMpeXml.h:193
Definition IccMpeXml.h:206
Definition IccMpeXml.h:219
Definition IccMpeXml.h:232
Definition IccMpeXml.h:245
Definition IccMpeXml.h:302
Definition IccMpeXml.h:344
Definition IccMpeXml.h:357
Definition IccMpeXml.h:370
Definition IccMpeXml.h:383
Definition IccMpeXml.h:396
Definition IccMpeXml.h:409

Referenced by ParseElement(), and CIccMpeXmlCalculator::ParseImport().

+ Here is the caller graph for this function:

◆ DeleteElement()

void CIccTagMultiProcessElement::DeleteElement ( int  nIndex)
inherited

◆ Describe()

void CIccTagMultiProcessElement::Describe ( std::string &  sDescription,
int  nVerboseness 
)
virtualinherited

Name: CIccTagMultiProcessElement::Describe

Purpose:

Args:

Return:

Reimplemented from CIccTag.

893{
894 icChar buf[128];
895
896 sprintf(buf, "BEGIN MULTI_PROCESS_ELEMENT_TAG %d %d\n", m_nInputChannels, m_nOutputChannels);
897 sDescription += buf;
898 sDescription += "\n";
899
900 CIccMultiProcessElementList::iterator i;
901 int j;
902
903 for (j=0, i=m_list->begin(); i!=m_list->end(); j++, i++) {
904 sprintf(buf, "PROCESS_ELEMENT #%d\n", j+1);
905 sDescription += buf;
906 i->ptr->Describe(sDescription, nVerboseness);
907 sDescription += "\n";
908 }
909 sDescription += "END MULTI_PROCESS_ELEMENT_TAG\n";
910}
char icChar
Definition IccDefs.h:110

References CIccMultiProcessElement::Describe(), CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nInputChannels, CIccTagMultiProcessElement::m_nOutputChannels, and CIccMultiProcessElementPtr::ptr.

+ Here is the call graph for this function:

◆ DetachIO()

virtual void CIccTag::DetachIO ( )
inlinevirtualinherited

Function: ReadAll() - Read All sub data for tag from file. Called by CIccProfile::ReadAll() to read all sub data for tag

Returns true if ReadAll is successful.

183{}

◆ ElementIndex()

icInt32Number CIccTagMultiProcessElement::ElementIndex ( CIccMultiProcessElement pElem)
protectedvirtualinherited

Name: CIccTagMultiProcessElement::ElementIndex

Purpose:

Args:

Return:

1352{
1353 CIccMultiProcessElementList::iterator i;
1354 icInt32Number n;
1355
1356 for (n=0, i=m_list->begin(); i!= m_list->end(); i++, n++) {
1357 if (i->ptr == pElem)
1358 break;
1359 }
1360 if (i==m_list->end())
1361 n=-1;
1362
1363 return n;
1364}
long icInt32Number
Definition icProfileHeader.h:291

References CIccTagMultiProcessElement::m_list, and CIccMultiProcessElementPtr::ptr.

◆ GetAppliedPCC()

IIccProfileConnectionConditions * CIccTagMultiProcessElement::GetAppliedPCC ( )
inlineinherited
403{ return m_pAppliedPCC; }

References CIccTagMultiProcessElement::m_pAppliedPCC.

Referenced by CIccMpeEmissionMatrix::Begin(), CIccMpeInvEmissionMatrix::Begin(), CIccMpeEmissionCLUT::Begin(), CIccMpeReflectanceCLUT::Begin(), CIccMpeEmissionObserver::Begin(), and CIccMpeReflectanceObserver::Begin().

+ Here is the caller graph for this function:

◆ GetClassName()

virtual const char * CIccTagXmlMultiProcessElement::GetClassName ( ) const
inlinevirtual

Reimplemented from CIccTagMultiProcessElement.

600{return "CIccTagXmlMultiProcessElement"; }

◆ GetCmmEnvLookup()

IIccCmmEnvVarLookup * CIccTagMultiProcessElement::GetCmmEnvLookup ( )
inlineinherited
405{ return m_pCmmEnvVarLookup; }

References CIccTagMultiProcessElement::m_pCmmEnvVarLookup.

Referenced by CIccMpeCalculator::Begin().

+ Here is the caller graph for this function:

◆ GetElement()

CIccMultiProcessElement * CIccTagMultiProcessElement::GetElement ( int  nIndex)
inherited

Name: CIccTagMultiProcessElement::GetElement

Purpose:

Args:

Return:

1190{
1191 if (!m_list)
1192 return NULL;
1193
1194 CIccMultiProcessElementList::iterator i;
1195 int j;
1196
1197 for(i=m_list->begin(), j=0; j<nIndex && i!=m_list->end(); i++, j++);
1198
1199 if (i!=m_list->end())
1200 return i->ptr;
1201
1202 return NULL;
1203}

References CIccTagMultiProcessElement::m_list, and CIccMultiProcessElementPtr::ptr.

Referenced by main().

+ Here is the caller graph for this function:

◆ GetExtClassName()

virtual const char * CIccTagXml::GetExtClassName ( ) const
inlinevirtualinherited

Implements IIccExtensionTag.

79{ return "CIccTagXml"; }

Referenced by icProfDescToXml(), and icXmlParseProfDesc().

+ Here is the caller graph for this function:

◆ GetExtDerivedClassName()

virtual const char * CIccTagXml::GetExtDerivedClassName ( ) const
inlinevirtualinherited

Implements IIccExtensionTag.

Reimplemented in CIccCurveXml.

80{ return ""; }

◆ GetExtension()

virtual IIccExtensionTag * CIccTagXmlMultiProcessElement::GetExtension ( )
inlinevirtual

Reimplemented from CIccTag.

602{return this; }

◆ GetFirstElem()

CIccMultiProcessElementList::iterator CIccTagMultiProcessElement::GetFirstElem ( )
protectedvirtualinherited
1367{
1368 return m_list->begin();
1369}

References CIccTagMultiProcessElement::m_list.

Referenced by CIccTagMultiProcessElement::GetNewApply().

+ Here is the caller graph for this function:

◆ GetLastElem()

CIccMultiProcessElementList::iterator CIccTagMultiProcessElement::GetLastElem ( )
protectedvirtualinherited
1372{
1373 return m_list->end();
1374}

References CIccTagMultiProcessElement::m_list.

Referenced by CIccTagMultiProcessElement::GetNewApply().

+ Here is the caller graph for this function:

◆ GetNewApply()

CIccApplyTagMpe * CIccTagMultiProcessElement::GetNewApply ( )
virtualinherited

Name: CIccTagMultiProcessElement::GetNewApply

Purpose:

Args:

Return:

1388{
1389 CIccApplyTagMpe *pApply = new CIccApplyTagMpe(this);
1390
1391 if (!pApply)
1392 return NULL;
1393
1394 CIccDblPixelBuffer *pApplyBuf = pApply->GetBuf();
1395 pApplyBuf->UpdateChannels(m_nBufChannels);
1396 if (!pApplyBuf->Begin()) {
1397 delete pApply;
1398 return NULL;
1399 }
1400
1401 if (!m_list || !m_list->size())
1402 return pApply;
1403
1404 CIccMultiProcessElementList::iterator i, last;
1405 last = GetLastElem();
1406 for (i=GetFirstElem(); i!=last;) {
1407 pApply->AppendElem(i->ptr);
1408
1410 }
1411
1412 return pApply;
1413}
void UpdateChannels(icUInt16Number nNumChannels)
Definition IccTagMPE.h:288
bool Begin()
Definition IccTagMPE.cpp:603
Definition IccTagMPE.h:321
virtual bool AppendElem(CIccMultiProcessElement *pElem)
Definition IccTagMPE.cpp:663
virtual CIccMultiProcessElementList::iterator GetLastElem()
Definition IccTagMPE.cpp:1371
virtual CIccMultiProcessElementList::iterator GetFirstElem()
Definition IccTagMPE.cpp:1366
virtual void GetNextElemIterator(CIccMultiProcessElementList::iterator &itr)
Definition IccTagMPE.cpp:1215

References CIccApplyTagMpe::CIccApplyTagMpe(), CIccApplyTagMpe::AppendElem(), CIccDblPixelBuffer::Begin(), CIccApplyTagMpe::GetBuf(), CIccTagMultiProcessElement::GetFirstElem(), CIccTagMultiProcessElement::GetLastElem(), CIccTagMultiProcessElement::GetNextElemIterator(), CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nBufChannels, CIccMultiProcessElementPtr::ptr, and CIccDblPixelBuffer::UpdateChannels().

Referenced by main().

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

◆ GetNextElemIterator()

void CIccTagMultiProcessElement::GetNextElemIterator ( CIccMultiProcessElementList::iterator &  itr)
protectedvirtualinherited

Name: CIccTagMultiProcessElement::GetNextElemIterator

Purpose:

Args:

Return:

1216{
1217 itr++;
1218}

Referenced by CIccTagMultiProcessElement::GetNewApply().

+ Here is the caller graph for this function:

◆ GetProfilePCC()

IIccProfileConnectionConditions * CIccTagMultiProcessElement::GetProfilePCC ( )
inlineinherited

◆ GetTagArrayType()

virtual icArraySignature CIccTag::GetTagArrayType ( ) const
inlinevirtualinherited

Reimplemented in CIccTagArray.

133{ return icSigUndefinedArray; }
@ icSigUndefinedArray
Definition icProfileHeader.h:617

References icSigUndefinedArray.

Referenced by icGetTagArrayHandlerOfType(), and CIccProfileXml::ParseTag().

+ Here is the caller graph for this function:

◆ GetTagStructType()

virtual icStructSignature CIccTag::GetTagStructType ( ) const
inlinevirtualinherited

Reimplemented in CIccTagStruct.

132{ return icSigUndefinedStruct; }
@ icSigUndefinedStruct
Definition icProfileHeader.h:606

References icSigUndefinedStruct.

Referenced by icGetTagStructHandlerOfType(), CIccArrayColorantInfo::Validate(), and CIccArrayNamedColor::Validate().

+ Here is the caller graph for this function:

◆ GetType()

virtual icTagTypeSignature CIccTagMultiProcessElement::GetType ( ) const
inlinevirtualinherited

Function: GetType()

Purpose: Get Tag Type. Each derived tag will implement it's own GetType() function.

Reimplemented from CIccTag.

@ icSigMultiProcessElementType
Definition icProfileHeader.h:550

References icSigMultiProcessElementType.

Referenced by CIccTagMultiProcessElement::Validate(), and CIccTagMultiProcessElement::Write().

+ Here is the caller graph for this function:

◆ Insert()

void CIccTagMultiProcessElement::Insert ( CIccMultiProcessElement pElement)
virtualinherited

Name: CIccTagMultiProcessElement::Insert

Purpose:

Args:

Return:

946{
947 if (!m_list) {
949 }
950
952
953 ptr.ptr = pElement;
954
955 m_list->push_front(ptr);
956}

References CIccTagMultiProcessElement::m_list, and CIccMultiProcessElementPtr::ptr.

◆ IsArrayType()

virtual bool CIccTag::IsArrayType ( )
inlinevirtualinherited

Reimplemented in CIccTagXYZ, CIccTagChromaticity, CIccTagSparseMatrixArray, CIccTagFixedNum< T, Tsig >, CIccTagNum< T, Tsig >, CIccTagFloatNum< T, Tsig >, and CIccTagData.

135{ return false; }

Referenced by MyTagDialog::MyTagDialog(), and DumpTag().

+ Here is the caller graph for this function:

◆ IsLateBinding()

bool CIccTagMultiProcessElement::IsLateBinding ( ) const
inherited

Name: CIccTagMultiProcessElement::IsLateBinding

Purpose:

Args:

Return:

1231{
1232 if (!m_list)
1233 return false;
1234
1235 CIccMultiProcessElementList::const_iterator i;
1236
1237 for (i = m_list->begin(); i!= m_list->end(); i++) {
1238 if (i->ptr->IsLateBinding()) {
1239 return true;
1240 }
1241 }
1242
1243 return false;
1244}

References CIccMultiProcessElement::IsLateBinding(), CIccTagMultiProcessElement::m_list, and CIccMultiProcessElementPtr::ptr.

+ Here is the call graph for this function:

◆ IsLateBindingReflectance()

bool CIccTagMultiProcessElement::IsLateBindingReflectance ( ) const
inherited

Name: CIccTagMultiProcessElement::IsLateBindingReflectance

Purpose:

Args:

Return:

1257{
1258 if (!m_list)
1259 return false;
1260
1261 CIccMultiProcessElementList::const_iterator i;
1262
1263 for (i = m_list->begin(); i!= m_list->end(); i++) {
1264 if (i->ptr->IsLateBindingReflectance()) {
1265 return true;
1266 }
1267 }
1268
1269 return false;
1270}

References CIccMultiProcessElement::IsLateBindingReflectance(), CIccTagMultiProcessElement::m_list, and CIccMultiProcessElementPtr::ptr.

+ Here is the call graph for this function:

◆ IsMBBType()

virtual bool CIccTag::IsMBBType ( )
inlinevirtualinherited

Reimplemented in CIccMBB.

136{ return false; } //If true then CIccTag can be cast as an CIccMBB

Referenced by CIccProfileXml::ParseTag().

+ Here is the caller graph for this function:

◆ IsNumArrayType()

virtual bool CIccTag::IsNumArrayType ( ) const
inlinevirtualinherited

Reimplemented in CIccTagSparseMatrixArray, CIccTagFixedNum< T, Tsig >, CIccTagNum< T, Tsig >, and CIccTagFloatNum< T, Tsig >.

137{ return false;} //If true then CIccTag can be cast as a CIccTagNumArray

Referenced by CIccArrayNamedColor::FindDeviceColor(), CIccArrayNamedColor::FindPcsColor(), CIccArrayNamedColor::FindSpectralColor(), CIccTagStruct::GetElemNumberValue(), CIccStructNamedColor::GetNumArray(), CIccMpeXmlTintArray::ParseXml(), and CIccMpeTintArray::Read().

+ Here is the caller graph for this function:

◆ IsSupported()

bool CIccTagMultiProcessElement::IsSupported ( )
virtualinherited

Name: CIccTagMultiProcessElement::IsSupported

Purpose:

Args:

Return:

Reimplemented from CIccTag.

867{
868 if (m_list) {
869 CIccMultiProcessElementList::iterator i;
870
871 for (i=m_list->begin(); i!=m_list->end(); i++) {
872 if (!i->ptr->IsSupported())
873 return false;
874 }
875 }
876
877 return true;
878}

References CIccMultiProcessElement::IsSupported(), CIccTagMultiProcessElement::m_list, and CIccMultiProcessElementPtr::ptr.

+ Here is the call graph for this function:

◆ NewCopy()

virtual CIccTag * CIccTagMultiProcessElement::NewCopy ( ) const
inlinevirtualinherited

Function: NewCopy(sDescription) Each derived tag will implement it's own NewCopy() function.

Parameter(s): none

Returns a new CIccTag object that is a copy of this object.

Reimplemented from CIccTag.

363{ return new CIccTagMultiProcessElement(*this);}
Definition IccTagMPE.h:358

References CIccTagMultiProcessElement::CIccTagMultiProcessElement().

+ Here is the call graph for this function:

◆ NumElements()

icUInt32Number CIccTagMultiProcessElement::NumElements ( ) const
inlineinherited
398{ return m_list ? (icUInt32Number)(m_list->size()) : 0; }
unsigned long icUInt32Number
Definition icProfileHeader.h:262

References CIccTagMultiProcessElement::m_list.

Referenced by main().

+ Here is the caller graph for this function:

◆ NumInputChannels()

icUInt16Number CIccTagMultiProcessElement::NumInputChannels ( ) const
inlineinherited
393{ return m_nInputChannels; }

References CIccTagMultiProcessElement::m_nInputChannels.

Referenced by main(), and ToXml().

+ Here is the caller graph for this function:

◆ NumOutputChannels()

icUInt16Number CIccTagMultiProcessElement::NumOutputChannels ( ) const
inlineinherited
394{ return m_nOutputChannels; }

References CIccTagMultiProcessElement::m_nOutputChannels.

Referenced by main(), and ToXml().

+ Here is the caller graph for this function:

◆ ParseElement()

bool CIccTagXmlMultiProcessElement::ParseElement ( xmlNode *  pNode,
std::string &  parseStr 
)
protected
4037{
4038 xmlAttr *attr;
4039
4040 if (pNode->type != XML_ELEMENT_NODE) {
4041 return false;
4042 }
4043
4044 CIccMultiProcessElement *pMpe = CreateElement((const icChar*)pNode->name);
4045
4046 if (!pMpe) {
4047 parseStr += std::string("Unknown Element Type (") + (const icChar*)pNode->name + ")\n";
4048 return false;
4049 }
4050
4052
4053 IIccExtensionMpe *pExt = pMpe->GetExtension();
4054
4055 if (pExt) {
4056 if (!strcmp(pExt->GetExtClassName(), "CIccMpeXml")) {
4057 CIccMpeXml* pXmlMpe = (CIccMpeXml*)pExt;
4058
4059 if (pXmlMpe->ParseXml(pNode, parseStr)) {
4060 if ((attr=icXmlFindAttr(pNode, "Reserved"))) {
4061 sscanf(icXmlAttrValue(attr), "%u", &pMpe->m_nReserved);
4062 }
4063
4064 ptr.ptr = pMpe;
4065 m_list->push_back(ptr);
4066 }
4067 else {
4068 parseStr += std::string("Unable to parse element of type ") + pMpe->GetClassName() + "\n";
4069 delete pMpe;
4070 return false;
4071 }
4072 }
4073 else {
4074 parseStr += std::string("Element ") + pMpe->GetClassName() + "isn't of type CIccMpeXml\n";
4075 delete pMpe;
4076 return false;
4077 }
4078 }
4079 else {
4080 parseStr += std::string("Element ") + pMpe->GetClassName() + "isn't of type CIccMpeXml\n";
4081 delete pMpe;
4082 return false;
4083 }
4084
4085 return true;
4086}
xmlAttr * icXmlFindAttr(xmlNode *pNode, const char *szAttrName)
Definition IccUtilXml.cpp:669
const char * icXmlAttrValue(xmlAttr *attr, const char *szDefault="")
Definition IccUtilXml.cpp:572
Definition IccTagMPE.h:133
virtual const char * GetExtClassName()=0
virtual IIccExtensionMpe * GetExtension()
Definition IccTagMPE.h:182
virtual const icChar * GetClassName() const =0
icUInt32Number m_nReserved
Definition IccTagMPE.h:188
static CIccMultiProcessElement * CreateElement(const icChar *szElementNodeName)
Definition IccTagXml.cpp:3976
Definition IccMpeXml.h:77
virtual bool ParseXml(xmlNode *pNode, std::string &parseStr)=0

References CreateElement(), CIccMultiProcessElement::GetClassName(), IIccExtensionMpe::GetExtClassName(), CIccMultiProcessElement::GetExtension(), icXmlAttrValue(), icXmlFindAttr(), CIccTagMultiProcessElement::m_list, CIccMultiProcessElement::m_nReserved, CIccMpeXml::ParseXml(), and CIccMultiProcessElementPtr::ptr.

Referenced by ParseXml().

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

◆ ParseXml()

bool CIccTagXmlMultiProcessElement::ParseXml ( xmlNode *  pNode,
std::string &  parseStr 
)
virtual

Implements CIccTagXml.

4090{
4091 pNode = icXmlFindNode(pNode, "MultiProcessElements");
4092
4093 if (!pNode) {
4094 parseStr += "Cannot Find MultiProcessElements\n";
4095 return false;
4096 }
4097
4098 xmlAttr *pInputChannels = icXmlFindAttr(pNode, "InputChannels");
4099 xmlAttr *pOutputChannels = icXmlFindAttr(pNode, "OutputChannels");
4100
4101 if (!pInputChannels || !pOutputChannels) {
4102 parseStr += "Invalid channels in MultiProcessElements\n";
4103 return false;
4104 }
4105
4106 m_nInputChannels = atoi(icXmlAttrValue(pInputChannels));
4107 m_nOutputChannels = atoi(icXmlAttrValue(pOutputChannels));
4108
4109 if (!m_list) {
4111 }
4112 else {
4113 m_list->clear();
4114 }
4115
4116 xmlNode *elemNode;
4117 for (elemNode = pNode->children; elemNode; elemNode = elemNode->next) {
4118 if (elemNode->type == XML_ELEMENT_NODE) {
4119 if (!ParseElement(elemNode, parseStr)) {
4120 char str[100];
4121 parseStr += "Unable to parse element (";
4122 parseStr += (char*)elemNode->name;
4123 sprintf(str, ") starting on line %d\n", elemNode->line);
4124 parseStr += str;
4125 return false;
4126 }
4127 }
4128 }
4129
4130 return true;
4131}
xmlNode * icXmlFindNode(xmlNode *pNode, const char *szNodeName)
Definition IccUtilXml.cpp:687
bool ParseElement(xmlNode *pNode, std::string &parseStr)
Definition IccTagXml.cpp:4036

References icXmlAttrValue(), icXmlFindAttr(), icXmlFindNode(), CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nInputChannels, CIccTagMultiProcessElement::m_nOutputChannels, and ParseElement().

+ Here is the call graph for this function:

◆ Read() [1/2]

bool CIccTagMultiProcessElement::Read ( icUInt32Number  size,
CIccIO pIO 
)
virtualinherited

Name: CIccTagMultiProcessElement::Read

Purpose:

Args:

Return:

Reimplemented from CIccTag.

970{
972
973 icUInt32Number headerSize = sizeof(icTagTypeSignature) +
974 sizeof(icUInt32Number) +
975 sizeof(icUInt8Number) +
976 sizeof(icUInt8Number) +
977 sizeof(icUInt16Number);
978
979 if (headerSize > size)
980 return false;
981
982 if (!pIO) {
983 return false;
984 }
985
986 Clean();
987
988 icUInt32Number tagStart = pIO->Tell();
989
990 if (!pIO->Read32(&sig))
991 return false;
992
993 if (!pIO->Read32(&m_nReserved))
994 return false;
995
996 if (!pIO->Read16(&m_nInputChannels))
997 return false;
998
999 if (!pIO->Read16(&m_nOutputChannels))
1000 return false;
1001
1002 if (!pIO->Read32(&m_nProcElements))
1003 return false;
1004
1005 if (headerSize + (icUInt64Number)m_nProcElements*sizeof(icUInt32Number) > size)
1006 return false;
1007
1009
1010 if (!m_list)
1011 return false;
1012
1014
1016
1017 if (!m_position)
1018 return false;
1019
1020 CIccLutOffsetMap loadedElements;
1021
1022 for (i=0; i<m_nProcElements; i++) {
1023 if (!pIO->Read32(&m_position[i].offset))
1024 return false;
1025 if (!pIO->Read32(&m_position[i].size))
1026 return false;
1027 }
1028
1030 icElemTypeSignature sigElem;
1031
1032 for (i=0; i<m_nProcElements; i++) {
1033 if (m_position[i].offset+m_position[i].size > size) {
1034 return false;
1035 }
1036
1037 //Use hash to cache offset duplication
1038 CIccMultiProcessElement *element = loadedElements[m_position[i].offset];
1039 if (!element) {
1040 icUInt32Number pos = tagStart + m_position[i].offset;
1041
1042 if (pIO->Seek(pos, icSeekSet)!=(icInt32Number)pos) {
1043 return false;
1044 }
1045
1046 if (!pIO->Read32(&sigElem)) {
1047 return false;
1048 }
1049
1050 if (pIO->Seek(pos, icSeekSet)!=(icInt32Number)pos) {
1051 return false;
1052 }
1053
1054 element = CIccMultiProcessElement::Create(sigElem);
1055 if (!element) {
1056 return false;
1057 }
1058
1059 if (!element->Read(m_position[i].size, pIO)) {
1060 delete element;
1061 return false;
1062 }
1063
1064 loadedElements[m_position[i].offset] = element;
1065 }
1066 ptr.ptr = element;
1067
1068 m_list->push_back(ptr);
1069 }
1070
1071 return true;
1072}
unsigned char icUInt8Number
Definition icProfileHeader.h:250
unsigned short icUInt16Number
Definition icProfileHeader.h:256
icElemTypeSignature
Definition icProfileHeader.h:641
icUInt32Number offset
Definition icProfileHeader.h:1461
icTagTypeSignature
Definition icProfileHeader.h:526
icUInt32Number icUInt64Number[2]
Definition icProfileHeader.h:268
icUInt32Number size
Definition icProfileHeader.h:1462
Definition icProfileHeader.h:1460
std::map< icUInt32Number, CIccMultiProcessElement * > CIccLutOffsetMap
Definition IccTagMPE.cpp:820
@ icSeekSet
Definition IccIO.h:83
icInt32Number Read16(void *pBuf16, icInt32Number nNum=1)
Definition IccIO.cpp:114
virtual icInt32Number Tell()
Definition IccIO.h:133
virtual icInt32Number Seek(icInt32Number nOffset, icSeekVal pos)
Definition IccIO.h:132
icInt32Number Read32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:143
icUInt32Number m_nReserved
Definition IccTagBasic.h:235
virtual bool Read(icUInt32Number size, CIccIO *pIO)=0
static CIccMultiProcessElement * Create(icElemTypeSignature sig)
Definition IccTagMPE.cpp:131
virtual void Clean()
Definition IccTagMPE.cpp:831

References CIccTagMultiProcessElement::Clean(), CIccMultiProcessElement::Create(), icSeekSet, CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nInputChannels, CIccTagMultiProcessElement::m_nOutputChannels, CIccTagMultiProcessElement::m_nProcElements, CIccTag::m_nReserved, CIccTagMultiProcessElement::m_position, icPositionNumber::offset, CIccMultiProcessElementPtr::ptr, CIccMultiProcessElement::Read(), CIccIO::Read16(), CIccIO::Read32(), CIccIO::Seek(), icPositionNumber::size, and CIccIO::Tell().

+ Here is the call graph for this function:

◆ Read() [2/2]

virtual bool CIccTag::Read ( icUInt32Number  size,
CIccIO pIO,
CIccProfile pProfile 
)
inlinevirtualinherited

Function: Read(size, pIO) - Read tag from file. Each derived tag will implement it's own Read() function.

Parameter(s): size - number of bytes in tag including the type signature. pIO - IO object used to read in tag. The IO object should already be initialized to point to the begining of the tag.

Returns true if Read is successful.

Reimplemented in CIccTagEmbeddedProfile.

197{ return Read(size, pIO); }
virtual bool Read(icUInt32Number size, CIccIO *pIO)
Definition IccTagBasic.h:167

References CIccTag::Read().

+ Here is the call graph for this function:

◆ ReadAll()

virtual bool CIccTag::ReadAll ( )
inlinevirtualinherited

Function: ReadAll() - Read All sub data for tag from file. Called by CIccProfile::ReadAll() to read all sub data for tag

Returns true if ReadAll is successful.

Reimplemented in CIccTagEmbeddedProfile.

175{ return true; }

◆ SetChannels()

void CIccTagMultiProcessElement::SetChannels ( icUInt16Number  nInputChannels,
icUInt16Number  nOutputChannels 
)
inlineinherited
396{m_nInputChannels = nInputChannels; m_nOutputChannels = nOutputChannels;}

References CIccTagMultiProcessElement::m_nInputChannels, and CIccTagMultiProcessElement::m_nOutputChannels.

Referenced by CIccDefaultEncProfileConverter::ConvertFromParams().

+ Here is the caller graph for this function:

◆ ToXml()

bool CIccTagXmlMultiProcessElement::ToXml ( std::string &  xml,
std::string  blanks = "" 
)
virtual

Implements CIccTagXml.

3941{
3942 std::string info;
3943 char line[256];
3944
3945 CIccMultiProcessElementList::iterator i;
3946
3947 sprintf(line, "<MultiProcessElements InputChannels=\"%d\" OutputChannels=\"%d\">\n", NumInputChannels(), NumOutputChannels());
3948 xml += blanks + line;
3949
3950 for (i=m_list->begin(); i!=m_list->end(); i++) {
3951 if (i->ptr) {
3952 CIccMultiProcessElement *pMpe = i->ptr;
3953
3954 IIccExtensionMpe *pMpeExt = pMpe->GetExtension();
3955
3956 if (pMpeExt) {
3957 if (!strcmp(pMpeExt->GetExtClassName(), "CIccMpeXml")) {
3958 CIccMpeXml *pMpeXml = (CIccMpeXml*)pMpeExt;
3959
3960 pMpeXml->ToXml(xml, blanks + " ");
3961 }
3962 else {
3963 return false;
3964 }
3965 }
3966 else {
3967 return false;
3968 }
3969 }
3970 }
3971 xml += blanks + "</MultiProcessElements>\n";
3972 return true;
3973}
icUInt16Number NumInputChannels() const
Definition IccTagMPE.h:393
virtual bool ToXml(std::string &xml, std::string blanks="")=0

References IIccExtensionMpe::GetExtClassName(), CIccMultiProcessElement::GetExtension(), CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::NumInputChannels(), CIccTagMultiProcessElement::NumOutputChannels(), CIccMultiProcessElementPtr::ptr, and CIccMpeXml::ToXml().

+ Here is the call graph for this function:

◆ Validate()

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

Name: CIccTagMultiProcessElement::Validate

Purpose:

Args:

Return:

Reimplemented from CIccTag.

1528{
1530
1531 CIccInfo Info;
1532 std::string sSigPathName = Info.GetSigPathName(sigPath);
1533 bool bMatchChannels = true;
1534
1535 if (!m_list || !m_list->size()) {
1537 sReport += icMsgValidateCriticalError;
1538 sReport += sSigPathName;
1539 sReport += " No processing elements and input and output channels do not match!\n";
1541 }
1542 else {
1543 sReport += icMsgValidateWarning;
1544 sReport += sSigPathName;
1545 sReport += " No processing elements.\n";
1547 }
1548 }
1549
1550 if (!pProfile) {
1551 sReport += icMsgValidateWarning;
1552 sReport += sSigPathName;
1553 sReport += " - Tag validation incomplete: Pointer to profile unavailable.\n";
1555 return rv;
1556 }
1557 icUInt32Number nInput, nOutput;
1558
1559 //Check # of channels
1560 switch(icGetFirstSigPathSig(sigPath)) {
1561 case icSigAToB0Tag:
1562 case icSigAToB1Tag:
1563 case icSigAToB2Tag:
1564 case icSigAToB3Tag:
1565 {
1566 nInput = icGetSpaceSamples(pProfile->m_Header.colorSpace);
1567 if (m_nInputChannels != nInput) {
1568 sReport += icMsgValidateCriticalError;
1569 sReport += sSigPathName;
1570 sReport += " - Incorrect number of input channels.\n";
1572 }
1573
1574 nOutput = icGetSpaceSamples(pProfile->m_Header.pcs);
1575 if (m_nOutputChannels != nOutput) {
1576 sReport += icMsgValidateCriticalError;
1577 sReport += sSigPathName;
1578 sReport += " - Incorrect number of output channels.\n";
1580 }
1581
1582 break;
1583 }
1584 case icSigBToA0Tag:
1585 case icSigBToA1Tag:
1586 case icSigBToA2Tag:
1587 case icSigBToA3Tag:
1588 {
1589 nInput = icGetSpaceSamples(pProfile->m_Header.pcs);
1590 if (m_nInputChannels!=nInput) {
1591 sReport += icMsgValidateCriticalError;
1592 sReport += sSigPathName;
1593 sReport += " - Incorrect number of input channels.\n";
1595 }
1596
1597 nOutput = icGetSpaceSamples(pProfile->m_Header.colorSpace);
1598 if (m_nOutputChannels!=nOutput) {
1599 sReport += icMsgValidateCriticalError;
1600 sReport += sSigPathName;
1601 sReport += " - Incorrect number of output channels.\n";
1603 }
1604
1605 break;
1606 }
1607 case icSigDToB0Tag:
1608 case icSigDToB1Tag:
1609 case icSigDToB2Tag:
1610 case icSigDToB3Tag:
1611 {
1612 nInput = icGetSpaceSamples(pProfile->m_Header.colorSpace);
1613 if (m_nInputChannels != nInput) {
1614 sReport += icMsgValidateCriticalError;
1615 sReport += sSigPathName;
1616 sReport += " - Incorrect number of input channels.\n";
1618 }
1619
1620 nOutput = icGetSpectralSpaceSamples(&pProfile->m_Header);
1621 if (m_nOutputChannels != nOutput) {
1622 sReport += icMsgValidateCriticalError;
1623 sReport += sSigPathName;
1624 sReport += " - Incorrect number of output channels.\n";
1626 }
1627
1628 break;
1629 }
1630 case icSigBToD0Tag:
1631 case icSigBToD1Tag:
1632 case icSigBToD2Tag:
1633 case icSigBToD3Tag:
1634 {
1635 nInput = icGetSpectralSpaceSamples(&pProfile->m_Header);
1636 if (m_nInputChannels!=nInput) {
1637 sReport += icMsgValidateCriticalError;
1638 sReport += sSigPathName;
1639 sReport += " - Incorrect number of input channels.\n";
1641 }
1642
1643 nOutput = icGetSpaceSamples(pProfile->m_Header.colorSpace);
1644 if (m_nOutputChannels!=nOutput) {
1645 sReport += icMsgValidateCriticalError;
1646 sReport += sSigPathName;
1647 sReport += " - Incorrect number of output channels.\n";
1649 }
1650
1651 break;
1652 }
1653 case icSigHToS0Tag:
1654 case icSigHToS1Tag:
1655 case icSigHToS2Tag:
1656 case icSigHToS3Tag:
1657 {
1658 nInput = icGetSpaceSamples(pProfile->m_Header.pcs);
1659 if (m_nInputChannels != nInput) {
1660 sReport += icMsgValidateCriticalError;
1661 sReport += sSigPathName;
1662 sReport += " - Incorrect number of input channels.\n";
1664 }
1665
1666 nOutput = icGetSpaceSamples(pProfile->m_Header.pcs);
1667 if (m_nOutputChannels != nOutput) {
1668 sReport += icMsgValidateCriticalError;
1669 sReport += sSigPathName;
1670 sReport += " - Incorrect number of output channels.\n";
1672 }
1673
1674 break;
1675 }
1678 {
1679 if (m_nInputChannels != 3) {
1680 sReport += icMsgValidateCriticalError;
1681 sReport += sSigPathName;
1682 sReport += " - Incorrect number of input channels.\n";
1684 }
1685
1686 if (m_nOutputChannels != 3) {
1687 sReport += icMsgValidateCriticalError;
1688 sReport += sSigPathName;
1689 sReport += " - Incorrect number of output channels.\n";
1691 }
1692
1693 break;
1694 }
1695 case icSigBRDFAToB0Tag:
1696 case icSigBRDFAToB1Tag:
1697 case icSigBRDFAToB2Tag:
1698 case icSigBRDFAToB3Tag:
1699 {
1700 switch(icGetFirstSigPathSig(sigPath)) {
1702 //TODO: Initialize input and output
1703 nInput = nOutput = 0;
1704 break;
1705
1707 //TODO: Initialize input and output
1708 nInput = nOutput = 0;
1709 break;
1710
1712 //TODO: Initialize input and output
1713 nInput = nOutput = 0;
1714 break;
1715
1716 default:
1717 break;
1718 }
1719 break;
1720 }
1721 case icSigBRDFDToB0Tag:
1722 case icSigBRDFDToB1Tag:
1723 case icSigBRDFDToB2Tag:
1724 case icSigBRDFDToB3Tag:
1725 {
1726 switch(icGetFirstSigPathSig(sigPath)) {
1728 //TODO: Initialize input and output
1729 nInput = nOutput = 0;
1730 break;
1731
1733 //TODO: Initialize input and output
1734 nInput = nOutput = 0;
1735 break;
1736
1738 //TODO: Initialize input and output
1739 nInput = nOutput = 0;
1740 break;
1741
1742 default:
1743 break;
1744 }
1745 break;
1746 }
1747
1748 case icSigMToA0Tag:
1749 {
1750 nInput = icGetMaterialColorSpaceSamples(pProfile->m_Header.mcs);
1751 if (m_nInputChannels != nInput) {
1752 sReport += icMsgValidateCriticalError;
1753 sReport += sSigPathName;
1754 sReport += " - Incorrect number of input channels.\n";
1756 }
1757
1758 nOutput = icGetSpaceSamples(pProfile->m_Header.colorSpace);
1759 if (m_nOutputChannels != nOutput) {
1760 sReport += icMsgValidateCriticalError;
1761 sReport += sSigPathName;
1762 sReport += " - Incorrect number of output channels.\n";
1764 }
1765
1766 break;
1767 }
1768
1769 case icSigAToM0Tag:
1770 {
1771 nInput = icGetSpaceSamples(pProfile->m_Header.colorSpace);
1772 if (m_nInputChannels != nInput) {
1773 sReport += icMsgValidateCriticalError;
1774 sReport += sSigPathName;
1775 sReport += " - Incorrect number of input channels.\n";
1777 }
1778
1779 nOutput = icGetMaterialColorSpaceSamples(pProfile->m_Header.mcs);
1780 if (m_nOutputChannels != nOutput) {
1781 sReport += icMsgValidateCriticalError;
1782 sReport += sSigPathName;
1783 sReport += " - Incorrect number of output channels.\n";
1785 }
1786
1787 break;
1788 }
1789
1790 case icSigMToB0Tag:
1791 case icSigMToB1Tag:
1792 case icSigMToB2Tag:
1793 case icSigMToB3Tag:
1794 {
1795 nInput = icGetMaterialColorSpaceSamples(pProfile->m_Header.mcs);
1796 if (m_nInputChannels != nInput) {
1797 sReport += icMsgValidateCriticalError;
1798 sReport += sSigPathName;
1799 sReport += " - Incorrect number of input channels.\n";
1801 }
1802
1803 nOutput = icGetSpaceSamples(pProfile->m_Header.pcs);
1804 if (m_nOutputChannels != nOutput) {
1805 sReport += icMsgValidateCriticalError;
1806 sReport += sSigPathName;
1807 sReport += " - Incorrect number of output channels.\n";
1809 }
1810
1811 break;
1812 }
1813
1814 case icSigMToS0Tag:
1815 case icSigMToS1Tag:
1816 case icSigMToS2Tag:
1817 case icSigMToS3Tag:
1818 {
1819 nInput = icGetMaterialColorSpaceSamples(pProfile->m_Header.mcs);
1820 if (m_nInputChannels != nInput) {
1821 sReport += icMsgValidateCriticalError;
1822 sReport += sSigPathName;
1823 sReport += " - Incorrect number of input channels.\n";
1825 }
1826
1827 nOutput = icGetSpectralSpaceSamples(&pProfile->m_Header);
1828 if (m_nOutputChannels != nOutput) {
1829 sReport += icMsgValidateCriticalError;
1830 sReport += sSigPathName;
1831 sReport += " - Incorrect number of output channels.\n";
1833 }
1834
1835 break;
1836 }
1837
1838 default:
1839 sReport += icMsgValidateWarning;
1840 sReport += sSigPathName;
1841 sReport += " - Unknown tag - Cannot validate input and output channels!\n";
1843 bMatchChannels = false;
1844 break;
1845 }
1846
1847 if (!m_list || !m_list->size()) {
1848 return rv;
1849 }
1850
1851 CIccMultiProcessElementList::iterator i = m_list->begin();
1852 CIccMultiProcessElement *last=NULL;
1853
1854 if (bMatchChannels && i->ptr->NumInputChannels() != m_nInputChannels) {
1855 sReport += icMsgValidateCriticalError;
1856 sReport += sSigPathName;
1857 sReport += "Mis-matching number of input channels in first process element!\n";
1859 }
1860
1861 for (; i!= m_list->end(); i++) {
1862 if (last) {
1863 if (i->ptr->NumInputChannels() != last->NumOutputChannels()) {
1864 sReport += icMsgValidateCriticalError;
1865 sReport += sSigPathName;
1866
1867 sReport += "(";
1868 sReport += last->GetClassName();
1869 sReport += "->";
1870 sReport += i->ptr->GetClassName();
1871
1872 sReport += " Mis-matching number of channels in last process element!\n";
1874 }
1875 }
1876 last = i->ptr;
1877
1878 if (last)
1879 rv = icMaxStatus(rv, last->Validate(sigPath+icGetSigPath(GetType()), sReport, this));
1880 }
1881
1882 if (bMatchChannels && last && last->NumOutputChannels() != m_nOutputChannels) {
1883 sReport += icMsgValidateCriticalError;
1884 sReport += sSigPathName;
1885 sReport += " Mis-matching number of output channels!\n";
1887 }
1888
1889 return rv;
1890}
@ icSigBToD0Tag
Definition icProfileHeader.h:408
@ icSigBToA2Tag
Definition icProfileHeader.h:376
@ icSigBRDFDToB0Tag
Definition icProfileHeader.h:362
@ icSigAToB3Tag
Definition icProfileHeader.h:345
@ icSigHToS3Tag
Definition icProfileHeader.h:420
@ icSigMToS3Tag
Definition icProfileHeader.h:436
@ icSigBToD2Tag
Definition icProfileHeader.h:410
@ icSigAToM0Tag
Definition icProfileHeader.h:346
@ icSigHToS2Tag
Definition icProfileHeader.h:419
@ icSigMToB0Tag
Definition icProfileHeader.h:429
@ icSigAToB0Tag
Definition icProfileHeader.h:342
@ icSigMToB3Tag
Definition icProfileHeader.h:432
@ icSigBToA1Tag
Definition icProfileHeader.h:375
@ icSigDToB3Tag
Definition icProfileHeader.h:407
@ icSigAToB2Tag
Definition icProfileHeader.h:344
@ icSigBRDFAToB1Tag
Definition icProfileHeader.h:359
@ icSigBRDFAToB2Tag
Definition icProfileHeader.h:360
@ icSigCustomToStandardPccTag
Definition icProfileHeader.h:394
@ icSigBRDFAToB0Tag
Definition icProfileHeader.h:358
@ icSigDToB0Tag
Definition icProfileHeader.h:404
@ icSigBToD3Tag
Definition icProfileHeader.h:411
@ icSigBToA0Tag
Definition icProfileHeader.h:374
@ icSigMToS0Tag
Definition icProfileHeader.h:433
@ icSigMToS2Tag
Definition icProfileHeader.h:435
@ icSigHToS1Tag
Definition icProfileHeader.h:418
@ icSigBToD1Tag
Definition icProfileHeader.h:409
@ icSigMToB1Tag
Definition icProfileHeader.h:430
@ icSigHToS0Tag
Definition icProfileHeader.h:417
@ icSigBRDFAToB3Tag
Definition icProfileHeader.h:361
@ icSigAToB1Tag
Definition icProfileHeader.h:343
@ icSigBToA3Tag
Definition icProfileHeader.h:377
@ icSigDToB2Tag
Definition icProfileHeader.h:406
@ icSigStandardToCustomPccTag
Definition icProfileHeader.h:471
@ icSigMToA0Tag
Definition icProfileHeader.h:428
@ icSigMToS1Tag
Definition icProfileHeader.h:434
@ icSigDToB1Tag
Definition icProfileHeader.h:405
@ icSigBRDFDToB1Tag
Definition icProfileHeader.h:363
@ icSigBRDFDToB2Tag
Definition icProfileHeader.h:364
@ icSigMToB2Tag
Definition icProfileHeader.h:431
@ icSigBRDFDToB3Tag
Definition icProfileHeader.h:365
@ icSigBrdfLightTransformMbr
Definition icProfileHeader.h:681
@ icSigBrdfOutputTransformMbr
Definition icProfileHeader.h:682
@ icSigBrdfTransformMbr
Definition icProfileHeader.h:680
icValidateStatus
Definition IccDefs.h:119
@ icValidateOK
Definition IccDefs.h:120
@ icValidateWarning
Definition IccDefs.h:121
@ icValidateCriticalError
Definition IccDefs.h:123
ICCPROFLIB_API icUInt32Number icGetSpectralSpaceSamples(const icHeader *pHdr)
Definition IccUtil.cpp:1367
ICCPROFLIB_API icSignature icGetFirstSigPathSig(std::string sigPath)
Definition IccUtil.cpp:1201
ICCPROFLIB_API icUInt32Number icGetSpaceSamples(icColorSpaceSignature sig)
Definition IccUtil.cpp:1303
ICCPROFLIB_API std::string icGetSigPath(icUInt32Number sig)
Definition IccUtil.cpp:1191
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
ICCPROFLIB_API icUInt32Number icGetMaterialColorSpaceSamples(icMaterialColorSignature sig)
Definition IccUtil.cpp:1391
Definition IccUtil.h:303
std::string GetSigPathName(std::string sigPath)
Definition IccUtil.cpp:1614
virtual icValidateStatus Validate(std::string sigPath, std::string &sReport, const CIccTagMultiProcessElement *pMPE=NULL, const CIccProfile *pProfile=NULL) const =0
Definition IccTagMPE.cpp:454
virtual icTagTypeSignature GetType() const
Definition IccTagMPE.h:368

References icHeader::colorSpace, CIccMultiProcessElement::GetClassName(), CIccInfo::GetSigPathName(), CIccTagMultiProcessElement::GetType(), icGetFirstSigPathSig(), icGetMaterialColorSpaceSamples(), icGetSigPath(), icGetSpaceSamples(), icGetSpectralSpaceSamples(), icMaxStatus(), icMsgValidateCriticalError, icMsgValidateWarning, icSigAToB0Tag, icSigAToB1Tag, icSigAToB2Tag, icSigAToB3Tag, icSigAToM0Tag, icSigBRDFAToB0Tag, icSigBRDFAToB1Tag, icSigBRDFAToB2Tag, icSigBRDFAToB3Tag, icSigBRDFDToB0Tag, icSigBRDFDToB1Tag, icSigBRDFDToB2Tag, icSigBRDFDToB3Tag, icSigBrdfLightTransformMbr, icSigBrdfOutputTransformMbr, icSigBrdfTransformMbr, icSigBToA0Tag, icSigBToA1Tag, icSigBToA2Tag, icSigBToA3Tag, icSigBToD0Tag, icSigBToD1Tag, icSigBToD2Tag, icSigBToD3Tag, icSigCustomToStandardPccTag, icSigDToB0Tag, icSigDToB1Tag, icSigDToB2Tag, icSigDToB3Tag, icSigHToS0Tag, icSigHToS1Tag, icSigHToS2Tag, icSigHToS3Tag, icSigMToA0Tag, icSigMToB0Tag, icSigMToB1Tag, icSigMToB2Tag, icSigMToB3Tag, icSigMToS0Tag, icSigMToS1Tag, icSigMToS2Tag, icSigMToS3Tag, icSigStandardToCustomPccTag, icValidateCriticalError, icValidateOK, icValidateWarning, CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nInputChannels, CIccTagMultiProcessElement::m_nOutputChannels, icHeader::mcs, CIccMultiProcessElement::NumInputChannels(), CIccMultiProcessElement::NumOutputChannels(), icHeader::pcs, CIccMultiProcessElementPtr::ptr, and CIccMultiProcessElement::Validate().

+ Here is the call graph for this function:

◆ Write()

bool CIccTagMultiProcessElement::Write ( CIccIO pIO)
virtualinherited

Name: CIccTagMultiProcessElement::Write

Purpose:

Args:

Return:

Reimplemented from CIccTag.

1085{
1087
1088 if (!pIO)
1089 return false;
1090
1091 icUInt32Number tagStart = pIO->Tell();
1092
1093 if (!pIO->Write32(&sig))
1094 return false;
1095
1096 if (!pIO->Write32(&m_nReserved))
1097 return false;
1098
1099 if (!pIO->Write16(&m_nInputChannels))
1100 return false;
1101
1102 if (!pIO->Write16(&m_nOutputChannels))
1103 return false;
1104
1105 if (m_list) {
1107 }
1108 else {
1109 m_nProcElements = 0;
1110 }
1111
1112 if (!pIO->Write32(&m_nProcElements))
1113 return false;
1114
1115 if (m_nProcElements) {
1116 icUInt32Number offsetPos = pIO->Tell();
1117
1118 if (m_position) {
1119 delete [] m_position;
1120 }
1121
1123
1124 if (!m_position)
1125 return false;
1126
1127 //Write an empty position table
1128 icUInt32Number j, zeros[2] = { 0, 0 };
1129 for (j=0; j<m_nProcElements; j++) {
1130 if (pIO->Write32(zeros, 2)!=2)
1131 return false;
1132 }
1133
1134 CIccLutPtrMap map;
1135 CIccMultiProcessElementList::iterator i;
1136 icUInt32Number start, end;
1137 icPositionNumber position;
1138
1139 //Write out each process element
1140 for (j=0, i=m_list->begin(); i!=m_list->end(); i++, j++) {
1141 if (map.find(i->ptr)==map.end()) {
1142 start = pIO->Tell();
1143
1144 if (!i->ptr->Write(pIO))
1145 return false;
1146
1147 end = pIO->Tell();
1148
1149 if (!pIO->Align32())
1150 return false;
1151
1152 position.offset = start - tagStart;
1153 position.size = end - start;
1154
1155 map[i->ptr] = position;
1156 }
1157 m_position[j] = map[i->ptr];
1158 }
1159
1160 icUInt32Number endPos = pIO->Tell();
1161
1162 if (pIO->Seek(offsetPos, icSeekSet)<0)
1163 return false;
1164
1165 for (j=0; j<m_nProcElements; j++) {
1166 if (!pIO->Write32(&m_position[j].offset))
1167 return false;
1168 if (!pIO->Write32(&m_position[j].size))
1169 return false;
1170 }
1171
1172 if (pIO->Seek(endPos, icSeekSet)<0)
1173 return false;
1174 }
1175
1176 return true;
1177}
icInt32Number Write16(void *pBuf16, icInt32Number nNum=1)
Definition IccIO.cpp:122
bool Align32()
Write operation to make sure that filelength is evenly divisible by 4.
Definition IccIO.cpp:341
icInt32Number Write32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:152

References CIccIO::Align32(), CIccTagMultiProcessElement::GetType(), icSeekSet, CIccTagMultiProcessElement::m_list, CIccTagMultiProcessElement::m_nInputChannels, CIccTagMultiProcessElement::m_nOutputChannels, CIccTagMultiProcessElement::m_nProcElements, CIccTag::m_nReserved, CIccTagMultiProcessElement::m_position, icPositionNumber::offset, CIccMultiProcessElementPtr::ptr, CIccIO::Seek(), icPositionNumber::size, CIccIO::Tell(), CIccMultiProcessElement::Write(), CIccIO::Write16(), and CIccIO::Write32().

+ Here is the call graph for this function:

Field Documentation

◆ m_list

◆ m_nBufChannels

◆ m_nInputChannels

◆ m_nOutputChannels

◆ m_nProcElements

◆ m_nReserved

icUInt32Number CIccTag::m_nReserved
inherited

Referenced by CIccTag::CIccTag(), CIccTagMultiProcessElement::CIccTagMultiProcessElement(), CIccTagMultiProcessElement::CIccTagMultiProcessElement(), CIccTagMultiProcessElement::operator=(), CIccProfileXml::ParseTag(), CIccTagXmlStruct::ParseTag(), CIccMpeXmlTintArray::ParseXml(), CIccTagXmlArray::ParseXml(), CIccTagText::Read(), CIccTagUtf8Text::Read(), CIccTagZipUtf8Text::Read(), CIccTagUtf16Text::Read(), CIccTagTextDescription::Read(), CIccTagSignature::Read(), CIccTagNamedColor2::Read(), CIccTagXYZ::Read(), CIccTagChromaticity::Read(), CIccTagCicp::Read(), CIccTagSparseMatrixArray::Read(), CIccTagFixedNum< T, Tsig >::Read(), CIccTagNum< T, Tsig >::Read(), CIccTagFloatNum< T, Tsig >::Read(), CIccTagMeasurement::Read(), CIccTagMultiLocalizedUnicode::Read(), CIccTagData::Read(), CIccTagDateTime::Read(), CIccTagColorantOrder::Read(), CIccTagColorantTable::Read(), CIccTagViewingConditions::Read(), CIccTagProfileSeqDesc::Read(), CIccTagResponseCurveSet16::Read(), CIccTagSpectralDataInfo::Read(), CIccTagSpectralViewingConditions::Read(), CIccTagEmbeddedHeightImage::Read(), CIccTagEmbeddedNormalImage::Read(), CIccTagStruct::Read(), CIccTagArray::Read(), CIccTagDict::Read(), CIccTagCurve::Read(), CIccTagParametricCurve::Read(), CIccTagLutAtoB::Read(), CIccTagLut8::Read(), CIccTagLut16::Read(), CIccTagGamutBoundaryDesc::Read(), CIccTagMultiProcessElement::Read(), CIccTagProfileSequenceId::Read(), CIccTagEmbeddedProfile::Read(), CIccTag::Validate(), CIccTagText::Write(), CIccTagUtf8Text::Write(), CIccTagZipUtf8Text::Write(), CIccTagUtf16Text::Write(), CIccTagTextDescription::Write(), CIccTagSignature::Write(), CIccTagNamedColor2::Write(), CIccTagXYZ::Write(), CIccTagChromaticity::Write(), CIccTagCicp::Write(), CIccTagSparseMatrixArray::Write(), CIccTagFixedNum< T, Tsig >::Write(), CIccTagNum< T, Tsig >::Write(), CIccTagFloatNum< T, Tsig >::Write(), CIccTagMeasurement::Write(), CIccTagMultiLocalizedUnicode::Write(), CIccTagData::Write(), CIccTagDateTime::Write(), CIccTagColorantOrder::Write(), CIccTagColorantTable::Write(), CIccTagViewingConditions::Write(), CIccTagProfileSeqDesc::Write(), CIccTagResponseCurveSet16::Write(), CIccTagSpectralDataInfo::Write(), CIccTagSpectralViewingConditions::Write(), CIccTagEmbeddedHeightImage::Write(), CIccTagEmbeddedNormalImage::Write(), CIccTagStruct::Write(), CIccTagArray::Write(), CIccTagDict::Write(), CIccTagEmbeddedProfile::Write(), CIccTagCurve::Write(), CIccTagParametricCurve::Write(), CIccTagLutAtoB::Write(), CIccTagLut8::Write(), CIccTagLut16::Write(), CIccTagGamutBoundaryDesc::Write(), CIccTagMultiProcessElement::Write(), and CIccTagProfileSequenceId::Write().

◆ m_pAppliedPCC

◆ m_pCmmEnvVarLookup

◆ m_position

◆ m_pProfilePCC


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