Hoyt's FORK of DemoIccMAX 2.1.17.hoyt
Documentation for Hoyt's FORK of DemoIccMAX
Loading...
Searching...
No Matches
CIccMpeToneMap Class Reference

Class: CIccMpeToneMap. More...

#include <IccMpeBasic.h>

+ Inheritance diagram for CIccMpeToneMap:
+ Collaboration diagram for CIccMpeToneMap:

Public Member Functions

virtual void Apply (CIccApplyMpe *pApply, icFloatNumber *dstPixel, const icFloatNumber *srcPixel) const
 Name: CIccMpeToneMap::Apply.
 
virtual bool Begin (icElemInterp nInterp, CIccTagMultiProcessElement *pMPE)
 Name: CIccMpeToneMap::Begin.
 
 CIccMpeToneMap (const CIccMpeToneMap &toneMap)
 Name: CIccMpeToneMap::CIccMpeToneMap.
 
 CIccMpeToneMap (icUInt16Number nOutputChannels=1)
 Name: CIccMpeToneMap::CIccMpeToneMap.
 
virtual void Describe (std::string &sDescription, int nVerboseness=0)
 Name: CIccMpeToneMap::Describe.
 
virtual const icCharGetClassName () const
 
virtual icElemTypeSignature GetType () const
 
bool Insert (CIccToneMapFunc *pToneMapFunc)
 Name: CIccMpeToneMap::PushBackFunc.
 
virtual CIccMultiProcessElementNewCopy () const
 
virtual CIccToneMapFuncNewToneMapFunc ()
 
CIccMpeToneMapoperator= (const CIccMpeToneMap &toneMap)
 Name: &CIccMpeToneMap::operator=.
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 Name: CIccMpeToneMap::Read.
 
void SetLumCurve (CIccCurveSetCurve *pLumCurve)
 Name: CIccMpeToneMap::SetLumCurve.
 
void SetNumOutputChannels (icUInt16Number nOutputChannels)
 Name: CIccMpeToneMap::SetNumOutputChannels.
 
virtual icValidateStatus Validate (std::string sigPath, std::string &sReport, const CIccTagMultiProcessElement *pMPE=NULL, const CIccProfile *pProfile=NULL) const
 Name: CIccMpeToneMap::Validate.
 
virtual bool Write (CIccIO *pIO)
 Name: CIccMpeToneMap::Write.
 
virtual ~CIccMpeToneMap ()
 Name: CIccMpeToneMap::~CIccMpeToneMap.
 
- Public Member Functions inherited from CIccMultiProcessElement
 CIccMultiProcessElement ()
 
virtual icAcsSignature GetBAcsSig ()
 
virtual icAcsSignature GetEAcsSig ()
 
virtual IIccExtensionMpeGetExtension ()
 
virtual CIccApplyMpeGetNewApply (CIccApplyTagMpe *pApplyTag)
 Name: CIccMultiProcessElement::GetNewApply()
 
virtual bool IsAcs ()
 
virtual bool IsLateBinding () const
 
virtual bool IsLateBindingReflectance () const
 
virtual bool IsSupported ()
 
virtual icUInt16Number NumInputChannels () const
 
virtual icUInt16Number NumOutputChannels () const
 
virtual ~CIccMultiProcessElement ()
 

Protected Member Functions

void ClearToneFuncs ()
 Name: CIccMpeToneMap::ClearToneFuncs.
 
CIccToneMapFunc ** CopyToneFuncs () const
 Name: CIccMpeToneMap::CopyToneFuncs.
 

Protected Attributes

icUInt16Number m_nFunc
 
CIccCurveSetCurvem_pLumCurve
 
CIccToneMapFunc ** m_pToneFuncs
 
- Protected Attributes inherited from CIccMultiProcessElement
icUInt16Number m_nInputChannels
 
icUInt16Number m_nOutputChannels
 

Additional Inherited Members

- Static Public Member Functions inherited from CIccMultiProcessElement
static CIccMultiProcessElementCreate (icElemTypeSignature sig)
 Name: CIccMultiProcessElement::Create.
 
- Public Attributes inherited from CIccMultiProcessElement
icUInt32Number m_nReserved
 

Detailed Description

Class: CIccMpeToneMap.

Purpose: The curve set process element

Definition at line 545 of file IccMpeBasic.h.

Constructor & Destructor Documentation

◆ CIccMpeToneMap() [1/2]

CIccMpeToneMap::CIccMpeToneMap ( icUInt16Number nOutputChannels = 1)

Name: CIccMpeToneMap::CIccMpeToneMap.

Purpose:

Args:

Return:

Definition at line 4127 of file IccMpeBasic.cpp.

4128{
4129 m_nReserved = 0;
4130 m_nInputChannels = nOutputChannels + 1;
4131 m_nOutputChannels = nOutputChannels;
4132 m_pLumCurve = NULL;
4133 m_pToneFuncs = NULL;
4134
4135 SetNumOutputChannels(nOutputChannels);
4136
4137}
CIccToneMapFunc ** m_pToneFuncs
void SetNumOutputChannels(icUInt16Number nOutputChannels)
Name: CIccMpeToneMap::SetNumOutputChannels.
CIccCurveSetCurve * m_pLumCurve
icUInt16Number m_nOutputChannels
Definition IccTagMPE.h:192
icUInt16Number m_nInputChannels
Definition IccTagMPE.h:191
icUInt32Number m_nReserved
Definition IccTagMPE.h:188

◆ CIccMpeToneMap() [2/2]

CIccMpeToneMap::CIccMpeToneMap ( const CIccMpeToneMap & toneMap)

Name: CIccMpeToneMap::CIccMpeToneMap.

Purpose:

Args:

Return:

Definition at line 4149 of file IccMpeBasic.cpp.

4150{
4151 m_nReserved = toneMap.m_nReserved;
4152
4155
4156 if (toneMap.m_pLumCurve)
4157 m_pLumCurve = toneMap.m_pLumCurve->NewCopy();
4158
4159 m_nFunc = toneMap.m_nFunc;
4160 if (toneMap.m_pToneFuncs)
4161 m_pToneFuncs = toneMap.CopyToneFuncs();
4162 else
4163 m_pToneFuncs = NULL;
4164}
virtual CIccCurveSetCurve * NewCopy() const =0
icUInt16Number m_nFunc
CIccToneMapFunc ** CopyToneFuncs() const
Name: CIccMpeToneMap::CopyToneFuncs.

References CopyToneFuncs(), m_nFunc, CIccMultiProcessElement::m_nInputChannels, CIccMultiProcessElement::m_nOutputChannels, CIccMultiProcessElement::m_nReserved, m_pLumCurve, m_pToneFuncs, and CIccCurveSetCurve::NewCopy().

+ Here is the call graph for this function:

◆ ~CIccMpeToneMap()

CIccMpeToneMap::~CIccMpeToneMap ( )
virtual

Name: CIccMpeToneMap::~CIccMpeToneMap.

Purpose:

Args:

Return:

Definition at line 4215 of file IccMpeBasic.cpp.

4216{
4217 if (m_pLumCurve)
4218 delete m_pLumCurve;
4219
4221}
void ClearToneFuncs()
Name: CIccMpeToneMap::ClearToneFuncs.

Member Function Documentation

◆ Apply()

void CIccMpeToneMap::Apply ( CIccApplyMpe * pApply,
icFloatNumber * pDestPixel,
const icFloatNumber * pSrcPixel ) const
virtual

Name: CIccMpeToneMap::Apply.

Purpose:

Args:

Return:

Implements CIccMultiProcessElement.

Definition at line 4713 of file IccMpeBasic.cpp.

4714{
4716 for (int i = 0; i < m_nOutputChannels; i++) {
4717 pDestPixel[i] = m_pToneFuncs[i]->Apply(lum, pSrcPixel[i]);
4718 }
4719}
float icFloatNumber
All floating point operations/variables in IccProfLib use the icFloatNumber data type.
Definition IccDefs.h:100
virtual icFloatNumber Apply(icFloatNumber v) const =0
icFloatNumber Apply(icFloatNumber lumValue, icFloatNumber pixelValue) const

◆ Begin()

bool CIccMpeToneMap::Begin ( icElemInterp nInterp,
CIccTagMultiProcessElement * pMPE )
virtual

Name: CIccMpeToneMap::Begin.

Purpose:

Args:

Return:

Implements CIccMultiProcessElement.

Definition at line 4680 of file IccMpeBasic.cpp.

4681{
4682 if (!m_pLumCurve || !m_pToneFuncs)
4683 return false;
4684
4685 if (!m_pLumCurve->Begin(nInterp, pMPE))
4686 return false;
4687
4688 if (!m_pToneFuncs[0] || !m_pToneFuncs[0]->Begin())
4689 return false;
4690
4691 int j;
4692 for (int i=1; i<m_nOutputChannels; i++) {
4693 for (j = 0; j < i; j++)
4694 if (m_pToneFuncs[j] == m_pToneFuncs[i])
4695 break;
4696 if (j==i && (!m_pToneFuncs[i] || !m_pToneFuncs[i]->Begin()))
4697 return false;
4698 }
4699 return true;
4700}
virtual bool Begin(icElemInterp nInterp, CIccTagMultiProcessElement *pMPE)=0
virtual bool Begin(icElemInterp nInterp, CIccTagMultiProcessElement *pMPE)
Name: CIccMpeToneMap::Begin.

◆ ClearToneFuncs()

void CIccMpeToneMap::ClearToneFuncs ( )
protected

Name: CIccMpeToneMap::ClearToneFuncs.

Purpose:

Args:

Return:

Definition at line 4269 of file IccMpeBasic.cpp.

4270{
4271 if (m_pToneFuncs) {
4272
4273 if (m_nOutputChannels) {
4274 if (m_pToneFuncs[0])
4275 delete m_pToneFuncs[0];
4276
4277 int j;
4278 for (int i = 1; i < m_nOutputChannels; i++) {
4279 for (j = 0; j < i; j++)
4280 if (m_pToneFuncs[j] == m_pToneFuncs[i])
4281 break;
4282 if (j == i && m_pToneFuncs[i])
4283 delete m_pToneFuncs[i];
4284 }
4285 }
4286
4287 free(m_pToneFuncs);
4288 m_pToneFuncs = NULL;
4289 }
4290}

◆ CopyToneFuncs()

CIccToneMapFunc ** CIccMpeToneMap::CopyToneFuncs ( ) const
protected

Name: CIccMpeToneMap::CopyToneFuncs.

Purpose:

Args:

Return:

Definition at line 4233 of file IccMpeBasic.cpp.

4234{
4236 return NULL;
4237
4239 if (!rv)
4240 return NULL;
4241
4242 rv[0] = m_pToneFuncs[0] ? m_pToneFuncs[0]->NewCopy() : NULL;
4243
4244 int j;
4245 for (int i = 1; i < m_nOutputChannels; i++) {
4246 for (j = 0; j < i; j++)
4247 if (m_pToneFuncs[j] == m_pToneFuncs[i])
4248 break;
4249 if (j < i)
4250 rv[i] = rv[j];
4251 else
4252 rv[i] = m_pToneFuncs[i] ? m_pToneFuncs[i]->NewCopy() : NULL;
4253 }
4254
4255 return rv;
4256}
Class: CIccToneMapFunc.
virtual CIccToneMapFunc * NewCopy() const

References CIccToneMapFunc::NewCopy().

Referenced by CIccMpeToneMap(), and operator=().

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

◆ Describe()

void CIccMpeToneMap::Describe ( std::string & sDescription,
int nVerboseness = 0 )
virtual

Name: CIccMpeToneMap::Describe.

Purpose:

Args:

Return:

Implements CIccMultiProcessElement.

Definition at line 4366 of file IccMpeBasic.cpp.

4367{
4368 char buf[256];
4369
4370 sprintf(buf, "BEGIN_TONE_MAP %d\n", m_nOutputChannels);
4371 sDescription += buf;
4372
4373 if (m_pLumCurve) {
4374 sDescription += "LUM_FUNCTION:\n";
4375 m_pLumCurve->Describe(sDescription, nVerboseness);
4376 }
4377
4378 if (m_pToneFuncs) {
4379 for (int i = 0; i < m_nOutputChannels; i++) {
4380 sprintf(buf, "TONE_FUNCTION_%d:\n", i);
4381 sDescription += buf;
4382 if (m_pToneFuncs[i])
4383 m_pToneFuncs[i]->Describe(sDescription, nVerboseness);
4384 }
4385 }
4386
4387 sDescription += "END_TINT_ARRAY\n";
4388}
virtual void Describe(std::string &sDescription, int nVerboseness=100)=0
void Describe(std::string &sDescription, int nVerboseness=0)

◆ GetClassName()

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

Implements CIccMultiProcessElement.

Reimplemented in CIccMpeXmlToneMap.

Definition at line 555 of file IccMpeBasic.h.

555{ return "CIccMpeToneMap"; }

◆ GetType()

virtual icElemTypeSignature CIccMpeToneMap::GetType ( ) const
inlinevirtual

Implements CIccMultiProcessElement.

Definition at line 554 of file IccMpeBasic.h.

554{ return icSigToneMapElemType; }
@ icSigToneMapElemType

References icSigToneMapElemType.

◆ Insert()

bool CIccMpeToneMap::Insert ( CIccToneMapFunc * pToneMapFunc)

Name: CIccMpeToneMap::PushBackFunc.

Purpose:

Args:

Return:

Definition at line 4345 of file IccMpeBasic.cpp.

4346{
4348 return false;
4349
4350 m_pToneFuncs[m_nFunc++] = pToneMapFunc;
4351
4352 return true;
4353}

◆ NewCopy()

virtual CIccMultiProcessElement * CIccMpeToneMap::NewCopy ( ) const
inlinevirtual

Implements CIccMultiProcessElement.

Definition at line 551 of file IccMpeBasic.h.

551{ return new CIccMpeToneMap(*this); }
CIccMpeToneMap(icUInt16Number nOutputChannels=1)
Name: CIccMpeToneMap::CIccMpeToneMap.

◆ NewToneMapFunc()

virtual CIccToneMapFunc * CIccMpeToneMap::NewToneMapFunc ( )
inlinevirtual

Reimplemented in CIccMpeXmlToneMap.

Definition at line 557 of file IccMpeBasic.h.

557{ return new CIccToneMapFunc(); }

◆ operator=()

CIccMpeToneMap & CIccMpeToneMap::operator= ( const CIccMpeToneMap & toneMap)

Name: &CIccMpeToneMap::operator=.

Purpose:

Args:

Return:

Definition at line 4176 of file IccMpeBasic.cpp.

4177{
4178 if (&toneMap == this)
4179 return *this;
4180
4181 m_nReserved = toneMap.m_nReserved;
4182
4185
4186 if (m_pLumCurve)
4187 delete m_pLumCurve;
4188
4189 if (toneMap.m_pLumCurve)
4190 m_pLumCurve = toneMap.m_pLumCurve->NewCopy();
4191 else
4192 m_pLumCurve = NULL;
4193
4195
4196 m_nFunc = toneMap.m_nFunc;
4197 if (toneMap.m_pToneFuncs)
4198 m_pToneFuncs = toneMap.CopyToneFuncs();
4199 else
4200 m_pToneFuncs = NULL;
4201
4202 return *this;
4203}

References CopyToneFuncs(), m_nFunc, CIccMultiProcessElement::m_nInputChannels, CIccMultiProcessElement::m_nOutputChannels, CIccMultiProcessElement::m_nReserved, m_pLumCurve, m_pToneFuncs, and CIccCurveSetCurve::NewCopy().

+ Here is the call graph for this function:

◆ Read()

bool CIccMpeToneMap::Read ( icUInt32Number size,
CIccIO * pIO )
virtual

Name: CIccMpeToneMap::Read.

Purpose:

Args:

Return:

Implements CIccMultiProcessElement.

Definition at line 4400 of file IccMpeBasic.cpp.

4401{
4402 if (m_pLumCurve)
4403 delete m_pLumCurve;
4404 m_pLumCurve = NULL;
4405
4407
4409
4410 icUInt32Number startPos = pIO->Tell();
4411
4412 icUInt32Number headerSize = sizeof(icElemTypeSignature) +
4413 sizeof(icUInt32Number) +
4414 sizeof(icUInt16Number) +
4415 sizeof(icUInt16Number) +
4416 sizeof(icUInt32Number)*2;
4417
4418 if (headerSize + sizeof(icTagTypeSignature) > size)
4419 return false;
4420
4421 if (!pIO) {
4422 return false;
4423 }
4424
4425 icUInt16Number nInputChannels, nOutputChannels;
4426
4427 if (!pIO->Read32(&sig))
4428 return false;
4429
4430 if (!pIO->Read32(&m_nReserved))
4431 return false;
4432
4433 if (!pIO->Read16(&nInputChannels))
4434 return false;
4435
4436 if (!pIO->Read16(&nOutputChannels))
4437 return false;
4438
4439 if (nInputChannels != nOutputChannels+1 || !nOutputChannels)
4440 return false;
4441
4442 m_nInputChannels = nInputChannels;
4443 SetNumOutputChannels(nOutputChannels);
4444
4445 //setup to read luminance curve based on position
4446 icPositionNumber lumPos;
4447 if (!pIO->Read32(&lumPos.offset) ||
4448 !pIO->Read32(&lumPos.size))
4449 return false;
4450
4451 icUInt32Number curPos = pIO->Tell();
4452
4453 //We need signature of curve type to construct and read it
4454 icCurveElemSignature curveSig;
4455 if (lumPos.size < sizeof(curveSig))
4456 return false;
4457
4458 pIO->Seek(startPos + lumPos.offset, icSeekSet);
4459 if (!pIO->Read32(&curveSig))
4460 return false;
4461 pIO->Seek(startPos + lumPos.offset, icSeekSet);
4462
4463 CIccCurveSetCurve* pCurve = CIccCurveSetCurve::Create(curveSig);
4464
4465 if (!pCurve) {
4466 return false;
4467 }
4468
4469 if (!pCurve->Read(lumPos.size, pIO)) {
4470 return false;
4471 }
4472
4473 SetLumCurve(pCurve);
4474
4475 //setup positions to get the output channel mapping functions
4476 pIO->Seek(curPos, icSeekSet);
4477
4478 headerSize += nOutputChannels + sizeof(icUInt32Number)*2;
4479
4480 if (headerSize + sizeof(icTagTypeSignature) > size)
4481 return false;
4482
4483 if (!icValidTagPos(lumPos, headerSize, size))
4484 return false;
4485
4487 if (!funcPos)
4488 return false;
4489
4490 //read output tone mapping function positions
4491 int j;
4492 for (int i = 0; i < m_nOutputChannels; i++) {
4493 if (!pIO->Read32(&funcPos[i].offset) ||
4494 !pIO->Read32(&funcPos[i].size) ||
4495 !icValidTagPos(funcPos[i], headerSize, size)) {
4496 delete[] funcPos;
4497 return false;
4498 }
4499
4500 if (!icValidOverlap(lumPos, funcPos[i], false)) {
4501 delete[] funcPos;
4502 return false;
4503 }
4504 for (j = 0; j < i; j++) {
4505 if (!icValidOverlap(funcPos[j], funcPos[i], true)) {
4506 delete[] funcPos;
4507 return false;
4508 }
4509 }
4510 }
4511
4512 //Read tone mapping functions making copies as we go
4514 if (!m_pToneFuncs[0]) {
4515 delete[] funcPos;
4516 return false;
4517 }
4518 pIO->Seek(startPos + funcPos[0].offset, icSeekSet);
4519 if (!m_pToneFuncs[0]->Read(funcPos[0].size, pIO)) {
4520 delete[] funcPos;
4521 return false;
4522 }
4523
4524 for (int i = 1; i < m_nOutputChannels; i++) {
4525 for (j = 0; j < i; i++) {
4526 if (funcPos[j].offset == funcPos[i].offset)
4527 break;
4528 }
4529 if (j != i)
4530 m_pToneFuncs[i] = m_pToneFuncs[j];
4531 else {
4533 if (!m_pToneFuncs[i]) {
4534 delete[] funcPos;
4535 return false;
4536 }
4537 pIO->Seek(startPos + funcPos[i].offset, icSeekSet);
4538 if (!m_pToneFuncs[i]->Read(funcPos[i].size, pIO)) {
4539 delete[] funcPos;
4540 return false;
4541 }
4542 }
4543 }
4544
4545 //keep track of functions read in
4547
4548 return true;
4549}
icArraySignature sig
@ icSeekSet
Definition IccIO.h:83
bool icValidTagPos(const icPositionNumber &pos, icUInt32Number nTagHeaderSize, icUInt32Number nTagSize, bool bAllowEmpty)
Name: icValidTagPos.
Definition IccUtil.cpp:163
bool icValidOverlap(const icPositionNumber &pos1, const icPositionNumber &pos2, bool bAllowSame)
Name: icValidOverlap.
Definition IccUtil.cpp:195
icTagTypeSignature
unsigned int icUInt32Number
Class: CIccCurveSetCurve.
static CIccCurveSetCurve * Create(icCurveElemSignature sig)
Name: CIccCurveSetCurve::Create.
virtual bool Read(icUInt32Number size, CIccIO *pIO)=0
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
virtual bool Read(icUInt32Number size, CIccIO *pIO)
Name: CIccMpeToneMap::Read.
void SetLumCurve(CIccCurveSetCurve *pLumCurve)
Name: CIccMpeToneMap::SetLumCurve.
virtual CIccToneMapFunc * NewToneMapFunc()
icCurveElemSignature
MPE Curve Set Curve signature.
unsigned short icUInt16Number
icElemTypeSignature
Multi-Processing Element type signatures.
icUInt32Number offset
icUInt32Number size

References CIccCurveSetCurve::Create(), icSeekSet, icValidOverlap(), icValidTagPos(), icPositionNumber::offset, CIccCurveSetCurve::Read(), CIccIO::Read16(), CIccIO::Read32(), CIccIO::Seek(), sig, icPositionNumber::size, and CIccIO::Tell().

+ Here is the call graph for this function:

◆ SetLumCurve()

void CIccMpeToneMap::SetLumCurve ( CIccCurveSetCurve * pLumCurve)

Name: CIccMpeToneMap::SetLumCurve.

Purpose:

Args:

Return:

Definition at line 4302 of file IccMpeBasic.cpp.

4303{
4304 if (pLumCurve == m_pLumCurve)
4305 return;
4306
4307 if (m_pLumCurve)
4308 delete m_pLumCurve;
4309
4310 m_pLumCurve = pLumCurve;
4311}

◆ SetNumOutputChannels()

void CIccMpeToneMap::SetNumOutputChannels ( icUInt16Number nVectorSize)

Name: CIccMpeToneMap::SetNumOutputChannels.

Purpose:

Args:

Return:

Definition at line 4324 of file IccMpeBasic.cpp.

4325{
4327 m_nOutputChannels = nVectorSize;
4328 if (m_nOutputChannels) {
4330 }
4331 m_nFunc = 0;
4332}

◆ Validate()

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

Name: CIccMpeToneMap::Validate.

Purpose:

Args:

Return:

Implements CIccMultiProcessElement.

Definition at line 4731 of file IccMpeBasic.cpp.

4732{
4733 std::string mpeSigPath = sigPath + icGetSigPath(GetType());
4734 icValidateStatus rv = CIccMultiProcessElement::Validate(sigPath, sReport, pMPE, pProfile);
4735
4737 CIccInfo Info;
4738 std::string sSigPathName = Info.GetSigPathName(mpeSigPath);
4739
4740 sReport += icMsgValidateCriticalError;
4741 sReport += sSigPathName;
4742 sReport += " - Bad number of input channels!\n";
4744 }
4745
4746 if (!m_nOutputChannels) {
4747 CIccInfo Info;
4748 std::string sSigPathName = Info.GetSigPathName(mpeSigPath);
4749
4750 sReport += icMsgValidateCriticalError;
4751 sReport += sSigPathName;
4752 sReport += " - Bad number of output channels!\n";
4754 }
4755
4756 if (!m_pLumCurve) {
4757 CIccInfo Info;
4758 std::string sSigPathName = Info.GetSigPathName(mpeSigPath);
4759
4760 sReport += icMsgValidateCriticalError;
4761 sReport += sSigPathName;
4762 sReport += " - Has no luminance mapping curve!\n";
4764 }
4765 else {
4766 rv = icMaxStatus(rv, m_pLumCurve->Validate(mpeSigPath, sReport, pMPE, pProfile));
4767 }
4768
4769 if (!m_pToneFuncs) {
4770 CIccInfo Info;
4771 std::string sSigPathName = Info.GetSigPathName(mpeSigPath);
4772
4773 sReport += icMsgValidateCriticalError;
4774 sReport += sSigPathName;
4775 sReport += " - Has no tone mapping functions!\n";
4777 }
4778 else {
4779 for (int i = 0; i < m_nOutputChannels; i++) {
4780 std::string funcReport;
4781 char buf[20];
4782 sprintf(buf, "#%d", i);
4783 if (!m_pToneFuncs[i]) {
4784 CIccInfo Info;
4785 std::string sSigPathName = Info.GetSigPathName(mpeSigPath);
4786
4787 sReport += icMsgValidateCriticalError;
4788 sReport += sSigPathName;
4789 sReport += std::string(" - Missing Tone function #") + buf + "\n";
4790
4792 }
4793
4794 icValidateStatus crv = m_pToneFuncs[i]->Validate(funcReport);
4795 if (crv != icValidateOK) {
4796 CIccInfo Info;
4797 std::string sSigPathName = Info.GetSigPathName(mpeSigPath);
4798
4799 sReport += icMsgValidateInformation;
4800 sReport += sSigPathName;
4801 sReport += std::string(" - Tone Function #") + buf + " status:\n" + funcReport;
4802
4803 rv = icMaxStatus(rv, crv);
4804 }
4805 }
4806 }
4807
4808 return rv;
4809}
icValidateStatus
Definition IccDefs.h:118
@ icValidateOK
Definition IccDefs.h:119
@ icValidateCriticalError
Definition IccDefs.h:122
icValidateStatus icMaxStatus(icValidateStatus s1, icValidateStatus s2)
Name: icMaxStatus.
Definition IccUtil.cpp:244
std::string icGetSigPath(icUInt32Number nSig)
Definition IccUtil.cpp:1191
const char * icMsgValidateInformation
Definition IccUtil.cpp:93
const char * icMsgValidateCriticalError
Definition IccUtil.cpp:92
virtual icValidateStatus Validate(std::string sigPath, std::string &sReport, const CIccTagMultiProcessElement *pMPE=NULL, const CIccProfile *pProfile=NULL) const =0
Type: Class.
Definition IccUtil.h:303
std::string GetSigPathName(std::string sigPath)
Definition IccUtil.cpp:1614
virtual icElemTypeSignature GetType() const
virtual icValidateStatus Validate(std::string sigPath, std::string &sReport, const CIccTagMultiProcessElement *pMPE=NULL, const CIccProfile *pProfile=NULL) const =0
Name: CIccProcessElement::Validate.
icValidateStatus Validate(std::string &sFuncReport, int nVerboseness=0) const

References CIccInfo::GetSigPathName(), icGetSigPath(), icMaxStatus(), icMsgValidateCriticalError, icMsgValidateInformation, icValidateCriticalError, icValidateOK, and CIccMultiProcessElement::Validate().

+ Here is the call graph for this function:

◆ Write()

bool CIccMpeToneMap::Write ( CIccIO * pIO)
virtual

Name: CIccMpeToneMap::Write.

Purpose:

Args:

Return:

Implements CIccMultiProcessElement.

Definition at line 4561 of file IccMpeBasic.cpp.

4562{
4564 return false;
4565
4567
4568 if (!pIO)
4569 return false;
4570
4571 icUInt32Number nTagStartPos = pIO->Tell();
4572
4573 if (!pIO->Write32(&sig))
4574 return false;
4575
4576 if (!pIO->Write32(&m_nReserved))
4577 return false;
4578
4579 if (!pIO->Write16(&m_nInputChannels))
4580 return false;
4581
4582 if (!pIO->Write16(&m_nOutputChannels))
4583 return false;
4584
4585 icUInt32Number lumOffset = pIO->Tell();
4586
4587 //Reserve position entry for Luminance Curve
4588 icUInt32Number zero = 0;
4589 if (!pIO->Write32(&zero) ||
4590 !pIO->Write32(&zero))
4591 return false;
4592
4593 //Reserve Position entry for mapping functions
4594 for (int i = 0; i < m_nOutputChannels; i++) {
4595 if (!pIO->Write32(&zero) ||
4596 !pIO->Write32(&zero))
4597 return false;
4598 }
4599
4600 //write out luminance curve
4601 icPositionNumber lumPos;
4602 lumPos.offset = pIO->Tell()- nTagStartPos;
4603
4604 if (!m_pLumCurve->Write(pIO))
4605 return false;
4606
4607 lumPos.size = pIO->Tell() - (lumPos.offset + nTagStartPos);
4608
4609 //Keep track of tone function positions
4611 if (!funcPos)
4612 return false;
4613
4614 //write out first tone function
4615 int j;
4616 funcPos[0].offset = pIO->Tell() - nTagStartPos;
4617 if (!m_pToneFuncs[0]->Write(pIO)) {
4618 delete[] funcPos;
4619 return false;
4620 }
4621 funcPos[0].size = pIO->Tell() - (funcPos[0].offset + nTagStartPos);
4622
4623 //write out additional non-copied tone functions
4624 for (int i = 1; i < m_nOutputChannels; i++) {
4625 for (j = 0; j < i; j++)
4626 if (m_pToneFuncs[j] == m_pToneFuncs[i])
4627 break;
4628 if (j < i) {
4629 funcPos[i] = funcPos[j];
4630 }
4631 else {
4632 funcPos[i].offset = pIO->Tell() - nTagStartPos;
4633 if (!m_pToneFuncs[i]->Write(pIO)) {
4634 delete[] funcPos;
4635 return false;
4636 }
4637 funcPos[i].size = pIO->Tell() - (funcPos[i].offset + nTagStartPos);
4638 }
4639 }
4640
4641 //Everything but positions is written so make sure we end on 32 bit boundary
4642 pIO->Align32();
4643 icUInt32Number endOffset = pIO->Tell();
4644
4645 //write out luminance curve position
4646 pIO->Seek(lumOffset, icSeekSet);
4647
4648 if (!pIO->Write32(&lumPos.offset) ||
4649 !pIO->Write32(&lumPos.size)) {
4650 delete[] funcPos;
4651 return false;
4652 }
4653
4654 //write out tone mapping function positions
4655 for (int i = 0; i < m_nOutputChannels; i++) {
4656 if (!pIO->Write32(&funcPos[i].offset) ||
4657 !pIO->Write32(&funcPos[i].size)) {
4658 delete[] funcPos;
4659 return false;
4660 }
4661 }
4662 delete[] funcPos;
4663
4664 //Go back to end and we are done
4665 pIO->Seek(endOffset, icSeekSet);
4666
4667 return true;
4668}
virtual bool Write(CIccIO *pIO)=0
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
virtual bool Write(CIccIO *pIO)
Name: CIccMpeToneMap::Write.

References CIccIO::Align32(), icSeekSet, icPositionNumber::offset, CIccIO::Seek(), sig, icPositionNumber::size, CIccIO::Tell(), CIccIO::Write16(), and CIccIO::Write32().

+ Here is the call graph for this function:

Member Data Documentation

◆ m_nFunc

icUInt16Number CIccMpeToneMap::m_nFunc
protected

Definition at line 579 of file IccMpeBasic.h.

Referenced by CIccMpeToneMap(), and operator=().

◆ m_pLumCurve

CIccCurveSetCurve* CIccMpeToneMap::m_pLumCurve
protected

Definition at line 578 of file IccMpeBasic.h.

Referenced by CIccMpeToneMap(), and operator=().

◆ m_pToneFuncs

CIccToneMapFunc** CIccMpeToneMap::m_pToneFuncs
protected

Definition at line 580 of file IccMpeBasic.h.

Referenced by CIccMpeToneMap(), and operator=().


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