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

Class: CIccCalculatorFunc. More...

#include <IccMpeCalc.h>

+ Collaboration diagram for CIccCalculatorFunc:

Public Member Functions

virtual bool Apply (CIccApplyMpeCalculator *pApply) const
 Name: CIccCalculatorFunc::Apply.
 
virtual bool Begin (const CIccMpeCalculator *pChannelMux, CIccTagMultiProcessElement *pMPE)
 Name: CIccCalculatorFunc::Begin.
 
int CheckUnderflowOverflow (SIccCalcOp *op, icUInt32Number nOps, int nArgs, bool bCheckUnderflow, std::string &sReport) const
 Name: CIccCalculatorFunc::CheckUnderflow.
 
 CIccCalculatorFunc (CIccMpeCalculator *pCalc)
 Name: CIccCalculatorFunc::CIccCalculatorFunc.
 
 CIccCalculatorFunc (const CIccCalculatorFunc &ICF)
 Name: CIccCalculatorFunc::CIccCalculatorFunc.
 
virtual void Describe (std::string &sDescription, int nVerboseness=0, int nBlanks=0)
 Name: CIccCalculatorFunc::Describe.
 
bool DoesOverflowInput (icUInt16Number nInputChannels) const
 Name: CIccChannelFunc::DoesOverflowInput.
 
bool DoesOverflowOutput (icUInt16Number nOutputChannels) const
 Name: CIccChannelFunc::DoesOverflowOutput.
 
icFuncParseStatus DoesStackUnderflowOverflow (std::string &sReport) const
 Name: CIccCalculatorFunc::DoesStackUnderflowOverflow.
 
virtual const icCharGetClassName () const
 
icUInt32Number GetMaxTemp () const
 Name: CIccCalculatorFunc::GetMaxTemp.
 
virtual icChannelFuncSignature GetType () const
 
bool HasUnsupportedOperations (std::string &sReport, const CIccProfile *pProfile) const
 Name: CIccCalculatorFunc::HasUnsupportedOperations.
 
bool HasValidOperations (std::string &sReport) const
 Name: CIccCalculatorFunc::HasValidOperations.
 
bool NeedTempReset (icUInt8Number *tempUsage, icUInt32Number nMaxTemp)
 Name: CIccCalculatorFunc::NeedTempReset.
 
virtual CIccCalculatorFuncNewCopy () const
 
CIccCalculatorFuncoperator= (const CIccCalculatorFunc &ICF)
 Name: &CIccCalculatorFunc::operator=.
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 Name: CIccCalculatorFunc::Read.
 
icFuncParseStatus SetFunction (CIccCalcOpList &opList, std::string &sReport)
 Name: CIccCalculatorFunc::SetFunction.
 
icFuncParseStatus SetFunction (const char *szFuncDef, std::string &sReport)
 Name: CIccCalculatorFunc::SetFunction.
 
bool SetOpDefs ()
 Name: CIccCalculatorFunc::SetOpDefs.
 
virtual icValidateStatus Validate (std::string sigPath, std::string &sReport, const CIccMpeCalculator *pChannelCalc=NULL, const CIccProfile *pProfile=NULL) const
 Name: CIccCalculatorFunc::Validate.
 
virtual bool Write (CIccIO *pIO)
 Name: CIccCalculatorFunc::Write.
 
virtual ~CIccCalculatorFunc ()
 Name: CIccCalculatorFunc::~CIccChannelFunc.
 

Protected Member Functions

bool ApplySequence (CIccApplyMpeCalculator *pApply, icUInt32Number nOps, SIccCalcOp *op) const
 Name: CIccCalculatorFunc::ApplySequence.
 
void DescribeSequence (std::string &sDescription, icUInt32Number nOps, SIccCalcOp *op, int nBlanks)
 
bool InitSelectOp (SIccCalcOp *ops, icUInt32Number nOps)
 Name: CIccCalculatorFunc::InitSelectOp.
 
bool InitSelectOps ()
 Name: CIccCalculatorFunc::InitSelectOps.
 
void InsertBlanks (std::string &sDescription, int nBlanks)
 
const char * ParseFuncDef (const char *szFuncDef, CIccCalcOpList &m_list, std::string &sReport)
 Name: CIccCalculatorFunc::ParseFuncDef.
 
bool SequenceNeedTempReset (SIccCalcOp *op, icUInt32Number nOps, icUInt8Number *tempUsage, icUInt32Number nMaxTemp)
 Name: CIccCalculatorFunc::SequenceNeedTempReset.
 

Protected Attributes

icUInt32Number m_nOps
 
icUInt32Number m_nReserved
 
SIccCalcOpm_Op
 
CIccMpeCalculatorm_pCalc
 

Detailed Description

Class: CIccCalculatorFunc.

Purpose: The Calculator function sequence

Definition at line 363 of file IccMpeCalc.h.

Constructor & Destructor Documentation

◆ CIccCalculatorFunc() [1/2]

CIccCalculatorFunc::CIccCalculatorFunc ( CIccMpeCalculator * pCalc)

Name: CIccCalculatorFunc::CIccCalculatorFunc.

Purpose:

Args:

Return:

Definition at line 2747 of file IccMpeCalc.cpp.

2748{
2749 m_pCalc = pCalc;
2750 m_nReserved = 0;
2751
2752 m_nOps = 0;
2753 m_Op = NULL;
2754}
icUInt32Number m_nReserved
Definition IccMpeCalc.h:414
CIccMpeCalculator * m_pCalc
Definition IccMpeCalc.h:412
SIccCalcOp * m_Op
Definition IccMpeCalc.h:417
icUInt32Number m_nOps
Definition IccMpeCalc.h:416

References m_nOps, m_nReserved, m_Op, and m_pCalc.

◆ CIccCalculatorFunc() [2/2]

CIccCalculatorFunc::CIccCalculatorFunc ( const CIccCalculatorFunc & func)

Name: CIccCalculatorFunc::CIccCalculatorFunc.

Purpose:

Args:

Return:

Definition at line 2766 of file IccMpeCalc.cpp.

2767{
2768 m_pCalc = func.m_pCalc;
2769
2771
2772 m_nOps = func.m_nOps;
2773
2774 if (m_nOps) {
2775 m_Op = (SIccCalcOp*)malloc(m_nOps * sizeof(SIccCalcOp));
2776 memcpy(m_Op, func.m_Op, m_nOps*sizeof(SIccCalcOp));
2777 }
2778 else
2779 m_Op = NULL;
2780}
Structure: SIccCalcOp.
Definition IccMpeCalc.h:231

References m_nOps, m_nReserved, m_Op, and m_pCalc.

◆ ~CIccCalculatorFunc()

CIccCalculatorFunc::~CIccCalculatorFunc ( )
virtual

Name: CIccCalculatorFunc::~CIccChannelFunc.

Purpose:

Args:

Return:

Definition at line 2823 of file IccMpeCalc.cpp.

2824{
2825 if (m_Op) {
2826 free(m_Op);
2827 }
2828}

References m_Op.

Member Function Documentation

◆ Apply()

bool CIccCalculatorFunc::Apply ( CIccApplyMpeCalculator * pApply) const
virtual

Name: CIccCalculatorFunc::Apply.

Purpose:

Args:

Return:

Definition at line 3684 of file IccMpeCalc.cpp.

3685{
3686 CIccFloatVector *pStack = pApply->GetStack();
3687
3688 pStack->clear();
3689
3690 if (!ApplySequence(pApply, m_nOps, m_Op)) {
3691 icFloatNumber *pOut = pApply->GetOutput();
3693 for (i=0; i<m_pCalc->NumOutputChannels(); i++)
3694 pOut[i] = -1;
3695 return false;
3696 }
3697
3698 return true;
3699}
float icFloatNumber
All floating point operations/variables in IccProfLib use the icFloatNumber data type.
Definition IccDefs.h:100
std::vector< icFloatNumber > CIccFloatVector
Definition IccMpeCalc.h:263
unsigned int icUInt32Number
CIccFloatVector * GetStack()
Definition IccMpeCalc.h:517
icFloatNumber * GetOutput()
Definition IccMpeCalc.h:514
bool ApplySequence(CIccApplyMpeCalculator *pApply, icUInt32Number nOps, SIccCalcOp *op) const
Name: CIccCalculatorFunc::ApplySequence.
virtual icUInt16Number NumOutputChannels() const
Definition IccTagMPE.h:160

References ApplySequence(), CIccApplyMpeCalculator::GetOutput(), CIccApplyMpeCalculator::GetStack(), m_nOps, m_Op, m_pCalc, and CIccMultiProcessElement::NumOutputChannels().

Referenced by CIccMpeCalculator::Apply().

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

◆ ApplySequence()

bool CIccCalculatorFunc::ApplySequence ( CIccApplyMpeCalculator * pApply,
icUInt32Number nOps,
SIccCalcOp * ops ) const
protected

Name: CIccCalculatorFunc::ApplySequence.

Purpose:

Args:

Return:

Definition at line 3560 of file IccMpeCalc.cpp.

3561{
3562 SIccCalcOp *op;
3563 SIccOpState os;
3564
3565 os.pApply = pApply;
3566 os.pStack = pApply->GetStack();
3567 os.pScratch = pApply->GetScratch();
3568 os.temp = pApply->GetTemp();
3569 os.pixel = pApply->GetInput();
3570 os.output = pApply->GetOutput();
3571 os.nOps = nOps;
3572
3573 for (os.idx=0; os.idx<os.nOps; os.idx++) {
3574 op = &ops[os.idx];
3575
3576 if (g_pDebugger)
3577 g_pDebugger->BeforeOp(op, os, ops);
3578
3579 if (op->sig==icSigIfOp) {
3580 icFloatNumber a1;
3581 OsPopArg(a1);
3582
3583 if (os.idx+1<nOps && ops[os.idx+1].sig==icSigElseOp) {
3584 os.idx++;
3585 if (a1>=0.5) {
3586 if (os.idx+1 + op->data.size >= nOps)
3587 return false;
3588
3589 if (!ApplySequence(pApply, op->data.size, &ops[os.idx+1]))
3590 return false;
3591 }
3592 else {
3593 if (os.idx+1 + op->data.size + ops[os.idx].data.size > nOps)
3594 return false;
3595
3596 if (!ApplySequence(pApply, ops[os.idx].data.size, &ops[os.idx+1 + op->data.size]))
3597 return false;
3598 }
3599 os.idx += op->data.size + ops[os.idx].data.size;
3600 }
3601 else {
3602 if (a1>=0.5) {
3603 if (os.idx+op->data.size >= nOps)
3604 return false;
3605
3606 if (!ApplySequence(pApply, op->data.size, &ops[os.idx+1]))
3607 return false;
3608 }
3609 os.idx+= op->data.size;
3610 }
3611 }
3612 else if (op->sig==icSigSelectOp) {
3613 icFloatNumber a1;
3614 OsPopArg(a1);
3615 icInt32Number nSel = (a1 >= 0.0) ? (icInt32Number)(a1+0.5f) : (icInt32Number)(a1-0.5f);
3616
3617 if (!op->extra) {
3618 return false;
3619 }
3620
3621 icUInt32Number nDefOff = (icUInt32Number)(os.idx+1 + op->extra);
3622 if (nDefOff >= nOps)
3623 return false;
3624
3625 if (nSel<0 || (icUInt32Number)nSel>=op->extra) {
3626
3627 if (ops[nDefOff].sig==icSigDefaultOp) {
3628 if (os.idx+1 + ops[nDefOff].extra >= nOps)
3629 return false;
3630
3631 if (!ApplySequence(pApply, ops[nDefOff].data.size, &ops[os.idx+1 + ops[nDefOff].extra]))
3632 break;
3633 }
3634 }
3635 else {
3636 icUInt32Number nOff = os.idx+1 + nSel;
3637
3638 if (nOff >= nOps)
3639 return false;
3640
3641 if (!ApplySequence(pApply, ops[nOff].data.size, &ops[os.idx+1 + ops[nOff].extra]))
3642 break;
3643 }
3644
3645 if (ops[nDefOff].sig==icSigDefaultOp) {
3646 if (os.idx+1 + ops[nDefOff].extra + ops[nDefOff].data.size >nOps)
3647 return false;
3648
3649 os.idx = (icUInt32Number)(os.idx + ops[nDefOff].extra + ops[nDefOff].data.size);
3650 }
3651 else if (op->extra) {
3652 unsigned long nOff = os.idx + op->extra;
3653
3654 if (os.idx+1 + ops[nOff].extra + ops[nOff].data.size > nOps)
3655 return false;
3656
3657 os.idx = (icUInt32Number)(os.idx + ops[nOff].extra + ops[nOff].data.size);
3658 }
3659 else
3660 return false;
3661 }
3662 else {
3663 if (!op->def->Exec(op, os))
3664 return false;
3665 }
3666
3667 if (g_pDebugger) {
3668 g_pDebugger->AfterOp(op, os, ops);
3669 }
3670 }
3671 return true;
3672}
icArraySignature sig
#define OsPopArg(X)
static IIccCalcDebugger * g_pDebugger
@ icSigSelectOp
Definition IccMpeCalc.h:214
@ icSigDefaultOp
Definition IccMpeCalc.h:216
@ icSigIfOp
Definition IccMpeCalc.h:210
@ icSigElseOp
Definition IccMpeCalc.h:211
CIccFloatVector * GetScratch()
Definition IccMpeCalc.h:519
icFloatNumber * GetTemp()
Definition IccMpeCalc.h:515
const icFloatNumber * GetInput()
Definition IccMpeCalc.h:513
virtual bool BeforeOp(SIccCalcOp *op, SIccOpState &os, SIccCalcOp *ops)=0
virtual bool AfterOp(SIccCalcOp *op, SIccOpState &os, SIccCalcOp *ops)=0
virtual bool Exec(SIccCalcOp *op, SIccOpState &s)
Definition IccMpeCalc.h:304
long icInt32Number
IIccOpDef * def
Definition IccMpeCalc.h:248
icSigCalcOp sig
Definition IccMpeCalc.h:233
unsigned long extra
Definition IccMpeCalc.h:247
icUInt32Number size
Definition IccMpeCalc.h:236
union SIccCalcOp::@1 data
Structure: SIccOpState.
Definition IccMpeCalc.h:273
icUInt32Number idx
Definition IccMpeCalc.h:280
icFloatNumber * temp
Definition IccMpeCalc.h:277
icUInt32Number nOps
Definition IccMpeCalc.h:281
icFloatNumber * output
Definition IccMpeCalc.h:279
CIccFloatVector * pScratch
Definition IccMpeCalc.h:276
CIccFloatVector * pStack
Definition IccMpeCalc.h:275
const icFloatNumber * pixel
Definition IccMpeCalc.h:278
CIccApplyMpeCalculator * pApply
Definition IccMpeCalc.h:274

References IIccCalcDebugger::AfterOp(), ApplySequence(), IIccCalcDebugger::BeforeOp(), SIccCalcOp::data, SIccCalcOp::def, IIccOpDef::Exec(), SIccCalcOp::extra, g_pDebugger, CIccApplyMpeCalculator::GetInput(), CIccApplyMpeCalculator::GetOutput(), CIccApplyMpeCalculator::GetScratch(), CIccApplyMpeCalculator::GetStack(), CIccApplyMpeCalculator::GetTemp(), icSigDefaultOp, icSigElseOp, icSigIfOp, icSigSelectOp, SIccOpState::idx, SIccOpState::nOps, OsPopArg, SIccOpState::output, SIccOpState::pApply, SIccOpState::pixel, SIccOpState::pScratch, SIccOpState::pStack, SIccCalcOp::sig, sig, SIccCalcOp::size, and SIccOpState::temp.

Referenced by Apply(), and ApplySequence().

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

◆ Begin()

bool CIccCalculatorFunc::Begin ( const CIccMpeCalculator * pChannelCalc,
CIccTagMultiProcessElement * pMPE )
virtual

Name: CIccCalculatorFunc::Begin.

Purpose:

Args:

Return:

Definition at line 3461 of file IccMpeCalc.cpp.

3462{
3463 if (!pChannelCalc)
3464 return false;
3465 std::string sReport;
3466
3467 if (!InitSelectOps())
3468 return false;
3469
3470 if (!HasValidOperations(sReport))
3471 return false;
3472
3473 if (!SetOpDefs())
3474 return false;
3475
3476 if (DoesOverflowInput(pChannelCalc->NumInputChannels()))
3477 return false;
3478
3479 if (DoesOverflowOutput(pChannelCalc->NumOutputChannels()))
3480 return false;
3481
3483 return false;
3484
3485 return true;
3486}
@ icFuncParseNoError
Definition IccMpeCalc.h:309
bool DoesOverflowInput(icUInt16Number nInputChannels) const
Name: CIccChannelFunc::DoesOverflowInput.
bool HasValidOperations(std::string &sReport) const
Name: CIccCalculatorFunc::HasValidOperations.
icFuncParseStatus DoesStackUnderflowOverflow(std::string &sReport) const
Name: CIccCalculatorFunc::DoesStackUnderflowOverflow.
bool DoesOverflowOutput(icUInt16Number nOutputChannels) const
Name: CIccChannelFunc::DoesOverflowOutput.
bool InitSelectOps()
Name: CIccCalculatorFunc::InitSelectOps.
bool SetOpDefs()
Name: CIccCalculatorFunc::SetOpDefs.
virtual icUInt16Number NumInputChannels() const
Definition IccTagMPE.h:159

References DoesOverflowInput(), DoesOverflowOutput(), DoesStackUnderflowOverflow(), HasValidOperations(), icFuncParseNoError, InitSelectOps(), CIccMultiProcessElement::NumInputChannels(), CIccMultiProcessElement::NumOutputChannels(), and SetOpDefs().

Referenced by CIccMpeCalculator::Begin().

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

◆ CheckUnderflowOverflow()

int CIccCalculatorFunc::CheckUnderflowOverflow ( SIccCalcOp * op,
icUInt32Number nOps,
int nArgs,
bool bCheckUnderflow,
std::string & sReport ) const

Name: CIccCalculatorFunc::CheckUnderflow.

Purpose:

Args:

Return:

Definition at line 3907 of file IccMpeCalc.cpp.

3908{
3909 icUInt32Number i, p;
3910 int n, nIfArgs, nElseArgs, nSelArgs, nCaseArgs;
3911
3912 for (i=0; i<nOps; i++) {
3913 n = op[i].ArgsUsed(m_pCalc);
3914
3915#if 0
3916 std::string opstr;
3917 op[i].Describe(opstr);
3918 printf("%s : %d %d\n", opstr.c_str(), n, nArgs);
3919#endif
3920
3921 if (n > nArgs) {
3922 std::string opDesc;
3923 icUInt32Number j, l;
3924 icInt32Number f;
3925
3926 op[i].Describe(opDesc, 100); // TODO - propogate nVerboseness
3927 sReport += "Stack underflow at operation \"" + opDesc + "\" in \"";
3928 f=i-2;
3929 if (f<0) f=0;
3930 l=i+2;
3931 if (l>nOps-1)
3932 l=nOps-1;
3933 for (j=(icUInt32Number)f; j<=l; j++) {
3934 op[j].Describe(opDesc, 100); // TODO - propogate nVerboseness
3935 if (j!=f)
3936 sReport += " ";
3937 sReport += opDesc;
3938 }
3939 sReport += "\"\n";
3940 return -1;
3941 }
3942
3943 nArgs -= n;
3944 nArgs += op[i].ArgsPushed(m_pCalc);
3945
3946 if (nArgs>icMaxDataStackSize)
3947 return -2;
3948
3949 if (op[i].sig == icSigIfOp) {
3950 int incI = 0;
3951 if (i+1<nOps && op[i+1].sig==icSigElseOp) {
3952 p = i+2;
3953 nIfArgs = CheckUnderflowOverflow(&op[p], icIntMin(nOps-p, op[i].data.size), nArgs, bCheckUnderflow, sReport);
3954 if (nIfArgs<0)
3955 return -1;
3956 incI =op[i].data.size;
3957
3958 p = i+2+op[i].data.size;
3959 nElseArgs = CheckUnderflowOverflow(&op[p], icIntMin(nOps-p, op[i+1].data.size), nArgs, bCheckUnderflow, sReport);
3960 if (nElseArgs<0)
3961 return -1;
3962 incI += op[i+1].data.size;
3963
3964 nArgs = bCheckUnderflow ? icIntMin(nIfArgs, nElseArgs) : icIntMax(nIfArgs, nElseArgs) ;
3965 i++;
3966 i+=incI;
3967 }
3968 else {
3969 p = i+1;
3970 nIfArgs = CheckUnderflowOverflow(&op[p], icIntMin(nOps-p, op[i].data.size), nArgs, bCheckUnderflow, sReport);
3971 if (nIfArgs<0)
3972 return -1;
3973 nArgs = bCheckUnderflow ? icIntMin(nArgs, nIfArgs) : icIntMax(nArgs, nIfArgs);
3974
3975 i+= op[i].data.size;
3976 }
3977 }
3978 else if (op[i].sig == icSigSelectOp) {
3980 nSelArgs = nArgs;
3981
3982 for (n=1; i+n<nOps; ) {
3983 if (op[i+n].sig==icSigCaseOp)
3984 n++;
3985 else if (n>1 && op[i+n].sig==icSigDefaultOp) {
3986 n++;
3987 break;
3988 }
3989 else
3990 break;
3991 }
3992 n--;
3993
3994 if (!n)
3995 return -1;
3996
3997 icUInt32Number pos = i+1 + n;
3998 for (p=0; p<n; p++) {
3999 SIccCalcOp *sop = &op[i+1+p];
4000 int len = sop->data.size;
4001 if (pos>=nOps)
4002 return -1;
4003
4004 nCaseArgs = CheckUnderflowOverflow(&op[pos], icIntMin(nOps-pos, len), nArgs, bCheckUnderflow, sReport);
4005 if (nCaseArgs<0)
4006 return -1;
4007
4008 if (!p)
4009 nSelArgs = nCaseArgs;
4010 else
4011 nSelArgs = bCheckUnderflow ? icIntMin(nSelArgs, nCaseArgs) : icIntMax(nSelArgs, nCaseArgs);
4012
4013 pos += sop->data.size;
4014 }
4015 nArgs = nSelArgs;
4016
4017 i = pos - 1;
4018 }
4019 }
4020
4021 return nArgs;
4022}
@ icSigCaseOp
Definition IccMpeCalc.h:215
#define icMaxDataStackSize
Definition IccMpeCalc.h:95
icUInt32Number icIntMax(icUInt32Number v1, icUInt32Number v2)
Definition IccUtil.cpp:913
icUInt32Number icIntMin(icUInt32Number v1, icUInt32Number v2)
Definition IccUtil.cpp:908
int CheckUnderflowOverflow(SIccCalcOp *op, icUInt32Number nOps, int nArgs, bool bCheckUnderflow, std::string &sReport) const
Name: CIccCalculatorFunc::CheckUnderflow.
icUInt16Number ArgsUsed(CIccMpeCalculator *pCalc)
Name: SIccCalcOp::ArgsUsed.
void Describe(std::string &desc, int nVerboseness=100)
Name: SIccCalcOp::Describe.
icUInt16Number ArgsPushed(CIccMpeCalculator *pCalc)
Name: SIccCalcOp::ArgsPushed.

References SIccCalcOp::ArgsPushed(), SIccCalcOp::ArgsUsed(), CheckUnderflowOverflow(), SIccCalcOp::data, SIccCalcOp::Describe(), icIntMax(), icIntMin(), icMaxDataStackSize, icSigCaseOp, icSigDefaultOp, icSigElseOp, icSigIfOp, icSigSelectOp, m_pCalc, sig, and SIccCalcOp::size.

Referenced by CheckUnderflowOverflow(), and DoesStackUnderflowOverflow().

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

◆ Describe()

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

Name: CIccCalculatorFunc::Describe.

Purpose:

Args:

Return:

Definition at line 2956 of file IccMpeCalc.cpp.

2957{
2958 if (m_nOps) {
2959 DescribeSequence(sDescription, m_nOps, m_Op, nBlanks);
2960 }
2961 else {
2962 sDescription += "Undefined Function!\n";
2963 }
2964}
void DescribeSequence(std::string &sDescription, icUInt32Number nOps, SIccCalcOp *op, int nBlanks)

References DescribeSequence(), m_nOps, and m_Op.

Referenced by CIccMpeCalculator::Describe().

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

◆ DescribeSequence()

void CIccCalculatorFunc::DescribeSequence ( std::string & sDescription,
icUInt32Number nOps,
SIccCalcOp * op,
int nBlanks )
protected

Definition at line 2843 of file IccMpeCalc.cpp.

2845{
2847 int pos;
2848 std::string opName;
2849 std::string funcDesc;
2850
2851 InsertBlanks(funcDesc, nBlanks);
2852 funcDesc += "{ ";
2853
2854 pos = nBlanks + 2;
2855
2856 for (i=0; i<nOps;) {
2857 if (pos >nBlanks + 65) {
2858 funcDesc += "\n";
2859 InsertBlanks(funcDesc, nBlanks + 2);
2860 pos = nBlanks + 2;
2861 }
2862
2863 op->Describe(opName, 100); // TODO - propogate nVerboseness
2864 funcDesc += opName;
2865 funcDesc += " ";
2866 pos += (int)opName.size() + 1;
2867
2868 if (op->sig == icSigIfOp) {
2869 SIccCalcOp *ifop = op;
2870
2871 if (i+1<nOps && op[1].sig == icSigElseOp) {
2872 SIccCalcOp *elseop = &op[1];
2873 icUInt32Number nSubOps = (icUInt32Number)icIntMin(nOps-i, ifop->data.size);
2874 op++;
2875 i++;
2876 funcDesc += "\n";
2877 DescribeSequence(funcDesc, nSubOps, &op[1], nBlanks+2);
2878 op += nSubOps;
2879 i += nSubOps;
2880
2881 InsertBlanks(funcDesc, nBlanks+2);
2882 funcDesc += "else\n";
2883 pos = 0;
2884
2885 nSubOps = (icUInt32Number)icIntMin(nOps-i, elseop->data.size);
2886 DescribeSequence(funcDesc, nSubOps, &op[1], nBlanks+2);
2887 op += nSubOps;
2888 i += nSubOps;
2889 }
2890 else {
2891 icUInt32Number nSubOps = (icUInt32Number)icIntMin(nOps-i, ifop->data.size);
2892 funcDesc += "\n";
2893 DescribeSequence(funcDesc, nSubOps, &op[1], nBlanks+2);
2894 op += nSubOps;
2895 i += nSubOps;
2896 }
2897
2898 InsertBlanks(funcDesc, nBlanks + 2);
2899 pos = nBlanks + 2;
2900 }
2901 else if (op->sig == icSigSelectOp) {
2902 op++;
2903 i++;
2904 funcDesc += "\n";
2905
2906 int j, n;
2907
2908 for (n=0; i+n<nOps; ) {
2909 if (op[n].sig==icSigCaseOp)
2910 n++;
2911 else if (n>1 && op[n].sig==icSigDefaultOp) {
2912 n++;
2913 break;
2914 }
2915 else
2916 break;
2917 }
2918
2919 int p = n;
2920 for (j=0; j<n; j++) {
2921 icUInt32Number nSubOps = (icUInt32Number)icIntMin(nOps-(i+p), op[j].data.size);
2922 InsertBlanks(funcDesc, nBlanks+2);
2923 if (op[j].sig==icSigCaseOp)
2924 funcDesc += "case\n";
2925 else
2926 funcDesc += "dflt\n";
2927
2928 DescribeSequence(funcDesc, nSubOps, &op[p], nBlanks+2);
2929 p += nSubOps;
2930 }
2931
2932 op += p-1;
2933 i += p-1;
2934
2935 InsertBlanks(funcDesc, nBlanks + 2);
2936 pos = nBlanks + 2;
2937 }
2938 op++;
2939 i++;
2940 }
2941 funcDesc += "}\n";
2942
2943 sDescription += funcDesc;
2944}
void InsertBlanks(std::string &sDescription, int nBlanks)

References SIccCalcOp::data, SIccCalcOp::Describe(), DescribeSequence(), icIntMin(), icSigCaseOp, icSigDefaultOp, icSigElseOp, icSigIfOp, icSigSelectOp, InsertBlanks(), SIccCalcOp::sig, sig, and SIccCalcOp::size.

Referenced by Describe(), and DescribeSequence().

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

◆ DoesOverflowInput()

bool CIccCalculatorFunc::DoesOverflowInput ( icUInt16Number nInputChannels) const

Name: CIccChannelFunc::DoesOverflowInput.

Purpose:

Args:

Return:

Definition at line 4154 of file IccMpeCalc.cpp.

4155{
4157 for (i=0; i<m_nOps; i++) {
4158 if (m_Op[i].sig == icSigInputChanOp) {
4159 if (m_Op[i].data.select.v1+m_Op[i].data.select.v2 >= nInputChannels)
4160 return true;
4161 }
4162 }
4163 return false;
4164}
@ icSigInputChanOp
Definition IccMpeCalc.h:119
icUInt16Number v2
Definition IccMpeCalc.h:242
icUInt16Number v1
Definition IccMpeCalc.h:243
struct SIccCalcOp::@1::@2 select

References SIccCalcOp::data, icSigInputChanOp, m_nOps, m_Op, SIccCalcOp::select, sig, SIccCalcOp::v1, and SIccCalcOp::v2.

Referenced by Begin(), and Validate().

+ Here is the caller graph for this function:

◆ DoesOverflowOutput()

bool CIccCalculatorFunc::DoesOverflowOutput ( icUInt16Number nOutputChannels) const

Name: CIccChannelFunc::DoesOverflowOutput.

Purpose:

Args:

Return:

Definition at line 4177 of file IccMpeCalc.cpp.

4178{
4180 for (i=0; i<m_nOps; i++) {
4181 if (m_Op[i].sig == icSigOutputChanOp) {
4182 if (m_Op[i].data.select.v1 + m_Op[i].data.select.v2 >= nOutputChannels)
4183 return true;
4184 }
4185 }
4186 return false;
4187}
@ icSigOutputChanOp
Definition IccMpeCalc.h:120

References SIccCalcOp::data, icSigOutputChanOp, m_nOps, m_Op, SIccCalcOp::select, sig, SIccCalcOp::v1, and SIccCalcOp::v2.

Referenced by Begin(), and Validate().

+ Here is the caller graph for this function:

◆ DoesStackUnderflowOverflow()

icFuncParseStatus CIccCalculatorFunc::DoesStackUnderflowOverflow ( std::string & sReport) const

Name: CIccCalculatorFunc::DoesStackUnderflowOverflow.

Purpose:

Args:

Return:

Definition at line 4034 of file IccMpeCalc.cpp.

4035{
4036 int rv = CheckUnderflowOverflow(m_Op, m_nOps, 0, true, sReport);
4037
4038 if (rv==-1)
4040 else if (rv<0)
4042
4043 rv = CheckUnderflowOverflow(m_Op, m_nOps, 0, false, sReport);
4044
4045 if (rv==-1)
4047 else if (rv<0)
4049
4050 return icFuncParseNoError;
4051}
@ icFuncParseStackOverflow
Definition IccMpeCalc.h:313
@ icFuncParseStackUnderflow
Definition IccMpeCalc.h:312

References CheckUnderflowOverflow(), icFuncParseNoError, icFuncParseStackOverflow, icFuncParseStackUnderflow, m_nOps, and m_Op.

Referenced by Begin(), SetFunction(), and Validate().

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

◆ GetClassName()

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

Definition at line 373 of file IccMpeCalc.h.

373{ return "CIccChannelFunction"; }

◆ GetMaxTemp()

icUInt32Number CIccCalculatorFunc::GetMaxTemp ( ) const

Name: CIccCalculatorFunc::GetMaxTemp.

Purpose:

Args:

Return:

Definition at line 3785 of file IccMpeCalc.cpp.

3786{
3787 icUInt32Number i, nMaxTemp = 0;
3788
3789 for (i=0; i<m_nOps; i++) {
3791 icUInt32Number last = (icUInt32Number)(m_Op[i].data.select.v1) + (icUInt32Number)(m_Op[i].data.select.v2);
3792 if (last>nMaxTemp)
3793 nMaxTemp = last;
3794 }
3795 }
3796 return nMaxTemp;
3797}
@ icSigTempPutChanOp
Definition IccMpeCalc.h:122
@ icSigTempSaveChanOp
Definition IccMpeCalc.h:123
@ icSigTempGetChanOp
Definition IccMpeCalc.h:121

References icSigTempGetChanOp, icSigTempPutChanOp, icSigTempSaveChanOp, m_nOps, m_Op, SIccCalcOp::select, sig, SIccCalcOp::v1, and SIccCalcOp::v2.

Referenced by CIccMpeCalculator::Begin(), and Validate().

+ Here is the caller graph for this function:

◆ GetType()

virtual icChannelFuncSignature CIccCalculatorFunc::GetType ( ) const
inlinevirtual

Definition at line 372 of file IccMpeCalc.h.

372{ return icSigChannelFunction; }
@ icSigChannelFunction
Definition IccMpeCalc.h:103

References icSigChannelFunction.

Referenced by Read(), and Write().

+ Here is the caller graph for this function:

◆ HasUnsupportedOperations()

bool CIccCalculatorFunc::HasUnsupportedOperations ( std::string & sReport,
const CIccProfile * pProfile ) const

Name: CIccCalculatorFunc::HasUnsupportedOperations.

Purpose:

Args:

Return:

Definition at line 4111 of file IccMpeCalc.cpp.

4112{
4114 if (pProfile) {
4115 icUInt32Number version = pProfile->m_Header.version;
4116
4117 icCalcOpMap map;
4118 for (i = 0; i < m_nOps; i++) {
4119 if (version < icVersionNumberV5_1 &&
4120 (m_Op[i].sig == icSigNotOp ||
4121 m_Op[i].sig == icSigNotEqualOp)) {
4122 map[m_Op[i].sig] = NULL;
4123 }
4124 }
4125 if (map.size()) {
4126 icCalcOpMap::iterator sig;
4127 sReport += "Calculator operator(s) not supported by profile version:";
4128 for (sig = map.begin(); sig != map.end(); sig++) {
4129 SIccCalcOp op;
4130 op.sig = sig->first;
4131 std::string opname;
4132 op.Describe(opname, 100);
4133 sReport += std::string(" (") + opname + ")";
4134 }
4135 sReport += "\n";
4136
4137 return true;
4138 }
4139 }
4140 return false;
4141}
std::map< icSigCalcOp, IIccOpDef * > icCalcOpMap
@ icSigNotOp
Definition IccMpeCalc.h:197
@ icSigNotEqualOp
Definition IccMpeCalc.h:193
#define icVersionNumberV5_1

References SIccCalcOp::Describe(), icSigNotEqualOp, icSigNotOp, icVersionNumberV5_1, m_nOps, m_Op, SIccCalcOp::sig, and sig.

Referenced by Validate().

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

◆ HasValidOperations()

bool CIccCalculatorFunc::HasValidOperations ( std::string & sReport) const

Name: CIccCalculatorFunc::HasValidOperations.

Purpose:

Args:

Return:

Definition at line 4063 of file IccMpeCalc.cpp.

4064{
4066 for (i=0; i<m_nOps; i++) {
4067 if (!m_Op[i].IsValidOp(m_pCalc)) {
4068 std::string opDesc;
4069 m_Op[i].Describe(opDesc, 100); // TODO - propogate nVerboseness
4070 sReport += "Invalid Operation (" + opDesc + ")\n";
4071 return false;
4072 }
4073 if (m_Op[i].sig==icSigSelectOp && i+1<m_nOps && m_Op[i+1].sig!=icSigCaseOp) {
4074 sReport += "A case operator does not follow a sel operator\n";
4075 return false;
4076 }
4077 if (i) {
4078 if (m_Op[i].sig==icSigElseOp) {
4079 if (m_Op[i-1].sig!=icSigIfOp) {
4080 sReport += "An else operator has no proceeding if operator\n";
4081 return false;
4082 }
4083 }
4084 else if (m_Op[i].sig==icSigCaseOp) {
4085 if (m_Op[i-1].sig!=icSigSelectOp && m_Op[i-1].sig!=icSigCaseOp) {
4086 sReport += "A case operator has no proceeding sel or case operator\n";
4087 return false;
4088 }
4089 }
4090 else if (m_Op[i].sig==icSigDefaultOp) {
4091 if (m_Op[i-1].sig!=icSigCaseOp) {
4092 sReport += "An dflt operator has no proceeding case operator\n";
4093 return false;
4094 }
4095 }
4096 }
4097 }
4098 return true;
4099}

References SIccCalcOp::Describe(), icSigCaseOp, icSigDefaultOp, icSigElseOp, icSigIfOp, icSigSelectOp, m_nOps, m_Op, m_pCalc, and sig.

Referenced by Begin(), SetFunction(), and Validate().

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

◆ InitSelectOp()

bool CIccCalculatorFunc::InitSelectOp ( SIccCalcOp * ops,
icUInt32Number nOps )
protected

Name: CIccCalculatorFunc::InitSelectOp.

Purpose:

Args:

Return:

Definition at line 3522 of file IccMpeCalc.cpp.

3523{
3524
3525 if (ops->sig != icSigSelectOp)
3526 return false;
3527
3528 if (ops->extra)
3529 return true;
3530
3531
3532 icUInt32Number i, n, pos;
3533 for (n=0; n<nOps && ops[n+1].sig==icSigCaseOp; n++);
3534 ops->extra=n;
3535 if (ops[n+1].sig==icSigDefaultOp) {
3536 n++;
3537 }
3538 pos = n;
3539 for (i=1; i<=n && pos<nOps; i++) {
3540 ops[i].extra = pos;
3541 pos += ops[i].data.size;
3542 }
3543
3544 if (i<=n)
3545 return false;
3546
3547 return true;
3548}

References SIccCalcOp::data, SIccCalcOp::extra, icSigCaseOp, icSigDefaultOp, icSigSelectOp, SIccCalcOp::sig, sig, and SIccCalcOp::size.

Referenced by InitSelectOps().

+ Here is the caller graph for this function:

◆ InitSelectOps()

bool CIccCalculatorFunc::InitSelectOps ( )
protected

Name: CIccCalculatorFunc::InitSelectOps.

Purpose:

Args:

Return:

Definition at line 3498 of file IccMpeCalc.cpp.

3499{
3501
3502 for (i=0; i<m_nOps; i++) {
3503 if (m_Op[i].sig==icSigSelectOp) {
3504 if (!InitSelectOp(&m_Op[i], m_nOps-i))
3505 return false;
3506 }
3507 }
3508
3509 return true;
3510}
bool InitSelectOp(SIccCalcOp *ops, icUInt32Number nOps)
Name: CIccCalculatorFunc::InitSelectOp.

References icSigSelectOp, InitSelectOp(), m_nOps, m_Op, and sig.

Referenced by Begin().

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

◆ InsertBlanks()

void CIccCalculatorFunc::InsertBlanks ( std::string & sDescription,
int nBlanks )
protected

Definition at line 2830 of file IccMpeCalc.cpp.

2831{
2832 char blanks[21]=" ";
2833 int i;
2834
2835 while (nBlanks>0) {
2836 i = nBlanks < 20 ? nBlanks : 20;
2837 blanks[i] = 0;
2838 sDescription += blanks;
2839 nBlanks -= i;
2840 }
2841}

Referenced by DescribeSequence().

+ Here is the caller graph for this function:

◆ NeedTempReset()

bool CIccCalculatorFunc::NeedTempReset ( icUInt8Number * tempUsage,
icUInt32Number nMaxTemp )

Name: CIccCalculatorFunc::NeedTempReset.

Purpose:

Args:

Return:

Definition at line 3809 of file IccMpeCalc.cpp.

3810{
3811 return SequenceNeedTempReset(m_Op, m_nOps, tempUsage, nMaxTemp);
3812}
bool SequenceNeedTempReset(SIccCalcOp *op, icUInt32Number nOps, icUInt8Number *tempUsage, icUInt32Number nMaxTemp)
Name: CIccCalculatorFunc::SequenceNeedTempReset.

References m_nOps, m_Op, and SequenceNeedTempReset().

Referenced by CIccMpeCalculator::Begin().

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

◆ NewCopy()

virtual CIccCalculatorFunc * CIccCalculatorFunc::NewCopy ( ) const
inlinevirtual

Definition at line 369 of file IccMpeCalc.h.

369{ return new CIccCalculatorFunc(*this);}
CIccCalculatorFunc(CIccMpeCalculator *pCalc)
Name: CIccCalculatorFunc::CIccCalculatorFunc.

Referenced by CIccMpeCalculator::CIccMpeCalculator(), and CIccMpeCalculator::operator=().

+ Here is the caller graph for this function:

◆ operator=()

CIccCalculatorFunc & CIccCalculatorFunc::operator= ( const CIccCalculatorFunc & func)

Name: &CIccCalculatorFunc::operator=.

Purpose:

Args:

Return:

Definition at line 2792 of file IccMpeCalc.cpp.

2793{
2794 m_pCalc = func.m_pCalc;
2795
2797
2798 if (m_Op)
2799 free(m_Op);
2800
2801 m_nOps = func.m_nOps;
2802
2803 if (m_nOps) {
2804 m_Op = (SIccCalcOp*)malloc(m_nOps * sizeof(SIccCalcOp));
2805 memcpy(m_Op, func.m_Op, m_nOps*sizeof(SIccCalcOp));
2806 }
2807 else
2808 m_Op = NULL;
2809
2810 return (*this);
2811}

References m_nOps, m_nReserved, m_Op, and m_pCalc.

◆ ParseFuncDef()

const char * CIccCalculatorFunc::ParseFuncDef ( const char * szFuncDef,
CIccCalcOpList & scanList,
std::string & sReport )
protected

Name: CIccCalculatorFunc::ParseFuncDef.

Purpose:

Args:

Return:

Definition at line 2985 of file IccMpeCalc.cpp.

2986{
2987 SIccCalcOp op;
2988 op.extra = 0;
2989 op.def=NULL;
2990
2991 scanList.clear();
2992
2993 if (!szFuncDef)
2994 return szFuncDef;
2995
2996 CIccFuncTokenizer scan(szFuncDef);
2997 if (!scan.GetNext())
2998 return NULL;
2999
3000 if (scan.GetSig() != icSigBeginBlockOp)
3001 return NULL;
3002
3003 while(scan.GetNext()) {
3004 op.sig = scan.GetSig();
3005
3006 if (op.sig == icSigEndBlockOp)
3007 return scan.GetPos();
3008
3009 switch(op.sig) {
3010 case icSigDataOp:
3011 op.data.num = scan.GetValue();
3012 scanList.push_back(op);
3013 break;
3014
3015 case icSigIfOp:
3016 {
3017 CIccCalcOpList trueList, falseList;
3018 bool bHasElse;
3019
3020 szFuncDef = ParseFuncDef(scan.GetPos(), trueList, sReport);
3021 if (!szFuncDef)
3022 return NULL;
3023
3024 scan.SetPos(szFuncDef);
3025 bHasElse = false;
3026 if (scan.GetNext() && scan.GetSig()==icSigElseOp) {
3027 bHasElse = true;
3028 szFuncDef = ParseFuncDef(scan.GetPos(), falseList, sReport);
3029
3030 if (!szFuncDef)
3031 return NULL;
3032 }
3033
3034 scan.SetPos(szFuncDef);
3035 op.data.size = (icUInt32Number)trueList.size();
3036 scanList.push_back(op);
3037
3038 if (bHasElse) {
3039 op.sig = icSigElseOp;
3040 op.data.size = (icUInt32Number)falseList.size();
3041 scanList.push_back(op);
3042
3043 AppendOpList(scanList, trueList);
3044 AppendOpList(scanList, falseList);
3045 }
3046 else {
3047 AppendOpList(scanList, trueList);
3048 }
3049 }
3050 break;
3051
3052 case icSigSelectOp:
3053 {
3054 op.sig = icSigSelectOp;
3055 op.data.size = 0;
3056 scanList.push_back(op);
3057
3058 int c;
3059 CIccCalcOpListPtrList selList;
3060 for (c=0; ; c++) {
3061 szFuncDef = scan.GetPos();
3062 scan.GetNext();
3063 if (scan.GetSig()==icSigCaseOp) {
3064 CIccCalcOpListPtr pCaseList = new CIccCalcOpList();
3065
3066 szFuncDef = ParseFuncDef(scan.GetPos(), *pCaseList, sReport);
3067
3068 if (!szFuncDef) {
3069 delete pCaseList;
3070 return NULL;
3071 }
3072
3073 scan.SetPos(szFuncDef);
3074 op.sig = icSigCaseOp;
3075 op.data.size = (icUInt32Number)pCaseList->size();
3076 scanList.push_back(op);
3077
3078 selList.push_back(pCaseList);
3079 }
3080 else if (c && scan.GetSig()==icSigDefaultOp) {
3081 CIccCalcOpListPtr pDefaultList = new CIccCalcOpList();
3082
3083 szFuncDef = ParseFuncDef(scan.GetPos(), *pDefaultList, sReport);
3084
3085 if (!szFuncDef) {
3086 delete pDefaultList;
3087 return NULL;
3088 }
3089
3090 scan.SetPos(szFuncDef);
3091 op.sig = icSigDefaultOp;
3092 op.data.size = (icUInt32Number)pDefaultList->size();
3093 scanList.push_back(op);
3094
3095 selList.push_back(pDefaultList);
3096 break;
3097 }
3098 else {
3099 scan.SetPos(szFuncDef);
3100 break;
3101 }
3102 }
3103 CIccCalcOpListPtrList::iterator l;
3104 for (l=selList.begin(); l!=selList.end(); l++) {
3105 CIccCalcOpListPtr pCaseList = *l;
3106
3107 AppendOpList(scanList, *pCaseList);
3108 delete pCaseList;
3109 }
3110 }
3111 break;
3112
3113 case icSigInputChanOp:
3114 case icSigOutputChanOp:
3115 case icSigTempGetChanOp:
3116 case icSigTempPutChanOp:
3118 if (!scan.GetIndex(op.data.select.v1, op.data.select.v2, 0, 1))
3119 return NULL;
3120 scanList.push_back(op);
3121 break;
3122
3123 case icSigEnvVarOp:
3124 {
3125 icSigCmmEnvVar envSig;
3126 if (!scan.GetEnvSig(envSig))
3127 return NULL;
3128 op.data.size = (icUInt32Number)envSig;
3129 scanList.push_back(op);
3130 }
3131 break;
3132
3133 case icSigCopyOp:
3134 case icSigRotateLeftOp:
3135 case icSigRotateRightOp:
3136 case icSigPositionDupOp:
3137 case icSigSolveOp:
3138 case icSigTransposeOp:
3139 if (!scan.GetIndex(op.data.select.v1, op.data.select.v2, 1, 1))
3140 return NULL;
3141 scanList.push_back(op);
3142 break;
3143
3144 case icSigPopOp:
3145 if (!scan.GetIndex(op.data.select.v1, op.data.select.v2, 1))
3146 return NULL;
3147 op.data.select.v2 = 0;
3148 scanList.push_back(op);
3149 break;
3150
3151 case icSigFlipOp:
3152 case icSigSumOp:
3153 case icSigProductOp:
3154 case icSigMinimumOp:
3155 case icSigMaximumOp:
3156 case icSigAndOp:
3157 case icSigOrOp:
3158 if (!scan.GetIndex(op.data.select.v1, op.data.select.v2, 2))
3159 return NULL;
3160 op.data.select.v2 = 0;
3161 scanList.push_back(op);
3162 break;
3163
3164 case icSigApplyCurvesOp:
3165 case icSigApplyMatrixOp:
3166 case icSigApplyCLutOp:
3167 case icSigApplyTintOp:
3168 case icSigApplyToJabOp:
3170 case icSigApplyCalcOp:
3171 case icSigApplyElemOp:
3172 if (!scan.GetIndex(op.data.select.v1, op.data.select.v2))
3173 return NULL;
3174 op.data.select.v2 = 0;
3175 scanList.push_back(op);
3176 break;
3177
3178 case icSigGammaOp:
3179 case icSigScalarAddOp:
3183 case icSigAddOp:
3184 case icSigSubtractOp:
3185 case icSigMultiplyOp:
3186 case icSigDivideOp:
3187 case icSigModulusOp:
3188 case icSigPowOp:
3189 case icSigArcTan2Op:
3190 case icSigLessThanOp:
3192 case icSigEqualOp:
3193 case icSigNotEqualOp:
3194 case icSigNearOp:
3196 case icSigGreaterThanOp:
3197 case icSigSquareOp:
3198 case icSigSquareRootOp:
3199 case icSigCubeOp:
3200 case icSigCubeRootOp:
3201 case icSigSignOp:
3202 case icSigAbsoluteValOp:
3203 case icSigTruncateOp:
3204 case icSigFloorOp:
3205 case icSigCeilingOp:
3206 case icSigRoundOp:
3207 case icSigRealNumberOp:
3208 case icSigNegOp:
3209 case icSigExpOp:
3210 case icSigLogrithmOp:
3211 case icSigNaturalLogOp:
3212 case icSigSineOp:
3213 case icSigCosineOp:
3214 case icSigTangentOp:
3215 case icSigArcSineOp:
3216 case icSigArcCosineOp:
3217 case icSigArcTangentOp:
3220 case icSigNotOp:
3221 case icSigToLabOp:
3222 case icSigToXYZOp:
3225 case icSigVectorAndOp:
3226 case icSigVectorOrOp:
3227 if (!scan.GetIndex(op.data.select.v1, op.data.select.v2, 1))
3228 return NULL;
3229 op.data.select.v2 = 0;
3230 scanList.push_back(op);
3231 break;
3232
3233 default:
3234 if (!SIccCalcOp::IsValidOp(op.sig)) {
3235 std::string opDesc;
3236
3237 op.Describe(opDesc, 100); // TODO - propogate nVerboseness
3238 sReport += "Invalid Operator \"";
3239 sReport += opDesc;
3240 sReport += "\"\n";
3241
3242 if (scanList.rbegin()!=scanList.rend()) {
3243 sReport += "Last Few operators in reverse:\n";
3244
3245 CIccCalcOpList::reverse_iterator opi;
3246 int i;
3247 for (i=0, opi=scanList.rbegin(); i<10 && opi!=scanList.rend(); i++, opi++) {
3248 opi->Describe(opDesc, 100); // TODO - propogate nVerboseness
3249 sReport += " ";
3250 sReport += opDesc;
3251 }
3252 sReport += "\n";
3253 }
3254 return NULL;
3255 }
3256 op.data.select.v1 = 0;
3257 op.data.select.v2 = 0;
3258 scanList.push_back(op);
3259 break;
3260 }
3261 }
3262 return NULL;
3263}
static void AppendOpList(CIccCalcOpList &toList, const CIccCalcOpList &fromList)
@ icSigCubeOp
Definition IccMpeCalc.h:169
@ icSigEnvVarOp
Definition IccMpeCalc.h:126
@ icSigArcTangentOp
Definition IccMpeCalc.h:185
@ icSigSquareRootOp
Definition IccMpeCalc.h:168
@ icSigFloorOp
Definition IccMpeCalc.h:173
@ icSigApplyFromJabOp
Definition IccMpeCalc.h:134
@ icSigOrOp
Definition IccMpeCalc.h:152
@ icSigScalarAddOp
Definition IccMpeCalc.h:163
@ icSigMinimumOp
Definition IccMpeCalc.h:149
@ icSigApplyCLutOp
Definition IccMpeCalc.h:131
@ icSigSineOp
Definition IccMpeCalc.h:180
@ icSigSumOp
Definition IccMpeCalc.h:147
@ icSigSignOp
Definition IccMpeCalc.h:171
@ icSigProductOp
Definition IccMpeCalc.h:148
@ icSigPolarToCartesianOp
Definition IccMpeCalc.h:188
@ icSigCosineOp
Definition IccMpeCalc.h:181
@ icSigNaturalLogOp
Definition IccMpeCalc.h:179
@ icSigLessThanOp
Definition IccMpeCalc.h:190
@ icSigAndOp
Definition IccMpeCalc.h:151
@ icSigSquareOp
Definition IccMpeCalc.h:167
@ icSigGreaterThanOp
Definition IccMpeCalc.h:196
@ icSigRotateRightOp
Definition IccMpeCalc.h:141
@ icSigModulusOp
Definition IccMpeCalc.h:160
@ icSigNegOp
Definition IccMpeCalc.h:155
@ icSigGammaOp
Definition IccMpeCalc.h:162
@ icSigApplyCurvesOp
Definition IccMpeCalc.h:129
@ icSigFlipOp
Definition IccMpeCalc.h:143
@ icSigArcSineOp
Definition IccMpeCalc.h:183
@ icSigEqualOp
Definition IccMpeCalc.h:192
@ icSigNearOp
Definition IccMpeCalc.h:194
@ icSigDataOp
Definition IccMpeCalc.h:112
@ icSigPowOp
Definition IccMpeCalc.h:161
@ icSigVectorMaximumOp
Definition IccMpeCalc.h:201
@ icSigScalarSubtractOp
Definition IccMpeCalc.h:164
@ icSigCartesianToPolarOp
Definition IccMpeCalc.h:187
@ icSigArcCosineOp
Definition IccMpeCalc.h:184
@ icSigAddOp
Definition IccMpeCalc.h:156
@ icSigRealNumberOp
Definition IccMpeCalc.h:189
@ icSigRoundOp
Definition IccMpeCalc.h:176
@ icSigApplyElemOp
Definition IccMpeCalc.h:136
@ icSigAbsoluteValOp
Definition IccMpeCalc.h:172
@ icSigLessThanEqualOp
Definition IccMpeCalc.h:191
@ icSigCopyOp
Definition IccMpeCalc.h:139
@ icSigSubtractOp
Definition IccMpeCalc.h:157
@ icSigCubeRootOp
Definition IccMpeCalc.h:170
@ icSigPopOp
Definition IccMpeCalc.h:144
@ icSigLogrithmOp
Definition IccMpeCalc.h:178
@ icSigScalarDivideOp
Definition IccMpeCalc.h:166
@ icSigApplyToJabOp
Definition IccMpeCalc.h:133
@ icSigDivideOp
Definition IccMpeCalc.h:159
@ icSigTangentOp
Definition IccMpeCalc.h:182
@ icSigApplyTintOp
Definition IccMpeCalc.h:132
@ icSigTruncateOp
Definition IccMpeCalc.h:175
@ icSigRotateLeftOp
Definition IccMpeCalc.h:140
@ icSigApplyCalcOp
Definition IccMpeCalc.h:135
@ icSigApplyMatrixOp
Definition IccMpeCalc.h:130
@ icSigScalarMultiplyOp
Definition IccMpeCalc.h:165
@ icSigPositionDupOp
Definition IccMpeCalc.h:142
@ icSigArcTan2Op
Definition IccMpeCalc.h:186
@ icSigGreaterThanEqualOp
Definition IccMpeCalc.h:195
@ icSigToXYZOp
Definition IccMpeCalc.h:199
@ icSigVectorOrOp
Definition IccMpeCalc.h:203
@ icSigSolveOp
Definition IccMpeCalc.h:206
@ icSigToLabOp
Definition IccMpeCalc.h:198
@ icSigVectorMinimumOp
Definition IccMpeCalc.h:200
@ icSigExpOp
Definition IccMpeCalc.h:177
@ icSigTransposeOp
Definition IccMpeCalc.h:207
@ icSigVectorAndOp
Definition IccMpeCalc.h:202
@ icSigMultiplyOp
Definition IccMpeCalc.h:158
@ icSigMaximumOp
Definition IccMpeCalc.h:150
@ icSigCeilingOp
Definition IccMpeCalc.h:174
std::list< SIccCalcOp > CIccCalcOpList
Definition IccMpeCalc.h:259
CIccCalcOpList * CIccCalcOpListPtr
Definition IccMpeCalc.h:260
#define icSigEndBlockOp
Definition IccMpeCalc.h:319
std::list< CIccCalcOpListPtr > CIccCalcOpListPtrList
Definition IccMpeCalc.h:261
#define icSigBeginBlockOp
Definition IccMpeCalc.h:318
const char * ParseFuncDef(const char *szFuncDef, CIccCalcOpList &m_list, std::string &sReport)
Name: CIccCalculatorFunc::ParseFuncDef.
icSigCmmEnvVar
static bool IsValidOp(icSigCalcOp sig)
Name: SIccCalcOp::IsValidOp.
icFloat32Number num
Definition IccMpeCalc.h:235

References AppendOpList(), SIccCalcOp::data, SIccCalcOp::def, SIccCalcOp::Describe(), SIccCalcOp::extra, CIccFuncTokenizer::GetEnvSig(), CIccFuncTokenizer::GetIndex(), CIccFuncTokenizer::GetNext(), CIccFuncTokenizer::GetPos(), CIccFuncTokenizer::GetSig(), CIccFuncTokenizer::GetValue(), icSigAbsoluteValOp, icSigAddOp, icSigAndOp, icSigApplyCalcOp, icSigApplyCLutOp, icSigApplyCurvesOp, icSigApplyElemOp, icSigApplyFromJabOp, icSigApplyMatrixOp, icSigApplyTintOp, icSigApplyToJabOp, icSigArcCosineOp, icSigArcSineOp, icSigArcTan2Op, icSigArcTangentOp, icSigBeginBlockOp, icSigCartesianToPolarOp, icSigCaseOp, icSigCeilingOp, icSigCopyOp, icSigCosineOp, icSigCubeOp, icSigCubeRootOp, icSigDataOp, icSigDefaultOp, icSigDivideOp, icSigElseOp, icSigEndBlockOp, icSigEnvVarOp, icSigEqualOp, icSigExpOp, icSigFlipOp, icSigFloorOp, icSigGammaOp, icSigGreaterThanEqualOp, icSigGreaterThanOp, icSigIfOp, icSigInputChanOp, icSigLessThanEqualOp, icSigLessThanOp, icSigLogrithmOp, icSigMaximumOp, icSigMinimumOp, icSigModulusOp, icSigMultiplyOp, icSigNaturalLogOp, icSigNearOp, icSigNegOp, icSigNotEqualOp, icSigNotOp, icSigOrOp, icSigOutputChanOp, icSigPolarToCartesianOp, icSigPopOp, icSigPositionDupOp, icSigPowOp, icSigProductOp, icSigRealNumberOp, icSigRotateLeftOp, icSigRotateRightOp, icSigRoundOp, icSigScalarAddOp, icSigScalarDivideOp, icSigScalarMultiplyOp, icSigScalarSubtractOp, icSigSelectOp, icSigSignOp, icSigSineOp, icSigSolveOp, icSigSquareOp, icSigSquareRootOp, icSigSubtractOp, icSigSumOp, icSigTangentOp, icSigTempGetChanOp, icSigTempPutChanOp, icSigTempSaveChanOp, icSigToLabOp, icSigToXYZOp, icSigTransposeOp, icSigTruncateOp, icSigVectorAndOp, icSigVectorMaximumOp, icSigVectorMinimumOp, icSigVectorOrOp, SIccCalcOp::IsValidOp(), SIccCalcOp::num, ParseFuncDef(), SIccCalcOp::select, CIccFuncTokenizer::SetPos(), SIccCalcOp::sig, SIccCalcOp::size, SIccCalcOp::v1, and SIccCalcOp::v2.

Referenced by ParseFuncDef(), and SetFunction().

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

◆ Read()

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

Name: CIccCalculatorFunc::Read.

Purpose:

Args:

Return:

Definition at line 3334 of file IccMpeCalc.cpp.

3335{
3336 icUInt32Number headerSize = sizeof(icUInt32Number);
3337
3338 headerSize += sizeof(icChannelFuncSignature) + sizeof(icUInt32Number);
3339
3340 if (headerSize > size)
3341 return false;
3342
3343 if (!pIO) {
3344 return false;
3345 }
3346
3348
3349 if (!pIO->Read32(&sig))
3350 return false;
3351
3352 if (sig!= GetType())
3353 return false;
3354
3355 if (!pIO->Read32(&m_nReserved))
3356 return false;
3357
3358 if (!pIO->Read32(&m_nOps))
3359 return false;
3360
3361 if ((icUInt64Number)m_nOps * sizeof(icUInt32Number) * 2 > (icUInt64Number)size - headerSize)
3362 return false;
3363
3364 if (m_Op) {
3365 free(m_Op);
3366 }
3367
3368 if (m_nOps) {
3369 m_Op = (SIccCalcOp*)calloc(m_nOps, sizeof(SIccCalcOp));
3370
3371 if (!m_Op) {
3372 m_nOps = 0;
3373 return false;
3374 }
3375
3377 for (i=0; i<m_nOps; i++) {
3378 if (!pIO->Read32(&m_Op[i].sig))
3379 return false;
3380 if (!pIO->Read32(&m_Op[i].data.num))
3381 return false;
3382 }
3383 }
3384
3385 return true;
3386}
icChannelFuncSignature
Definition IccMpeCalc.h:102
virtual icChannelFuncSignature GetType() const
Definition IccMpeCalc.h:372
icInt32Number Read32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:143
icUInt32Number icUInt64Number[2]

References SIccCalcOp::data, GetType(), m_nOps, m_nReserved, m_Op, SIccCalcOp::num, CIccIO::Read32(), SIccCalcOp::sig, and sig.

Referenced by CIccMpeCalculator::Read().

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

◆ SequenceNeedTempReset()

bool CIccCalculatorFunc::SequenceNeedTempReset ( SIccCalcOp * op,
icUInt32Number nOps,
icUInt8Number * tempUsage,
icUInt32Number nMaxTemp )
protected

Name: CIccCalculatorFunc::SequenceNeedTempReset.

Purpose:

Args:

Return:

Definition at line 3824 of file IccMpeCalc.cpp.

3825{
3826 icUInt32Number i, j;
3827
3828 for (i=0; i<nOps; i++) {
3829 icSigCalcOp sig = op[i].sig;
3830 if (sig==icSigTempGetChanOp) {
3831 icUInt32Number p = op[i].data.select.v1;
3832 icUInt32Number n = op[i].data.select.v2+1;
3833 for (j=0; j<n; j++) {
3834 if (!tempUsage[p+j]) {
3835 return true;
3836 }
3837 }
3838 }
3839 else if (sig==icSigTempPutChanOp) {
3840 icUInt32Number p = op[i].data.select.v1;
3841 icUInt32Number n = op[i].data.select.v2+1;
3842 memset(tempUsage+p, 1, n);
3843 }
3844 else if (sig==icSigTempSaveChanOp) {
3845 icUInt32Number p = op[i].data.select.v1;
3846 icUInt32Number n = op[i].data.select.v2+1;
3847 memset(tempUsage+p, 1, n);
3848 }
3849 else if (sig==icSigIfOp) {
3850 bool rv = false;
3851 icUInt8Number *ifTemps = (icUInt8Number *)malloc(nMaxTemp);
3853 if (!ifTemps)
3854 return true;
3855
3856 memcpy(ifTemps, tempUsage, nMaxTemp);
3857
3858 p=i+2;
3859 rv = rv || SequenceNeedTempReset(&op[p], icIntMin(nOps-p, op[i].data.size), ifTemps, nMaxTemp);
3860
3861 if (i<nOps && op[i+1].sig==icSigElseOp) {
3862 icUInt8Number *elseTemps = (icUInt8Number *)malloc(nMaxTemp);
3863 if (!elseTemps) {
3864 free(ifTemps);
3865 return true;
3866 }
3867
3868 memcpy(elseTemps, tempUsage, nMaxTemp);
3869
3870 p=i+2+op[i].data.size;
3871 rv = rv || SequenceNeedTempReset(&op[p], icIntMin(nOps-p, op[i+1].data.size), elseTemps, nMaxTemp);
3872
3873 if (!rv) {
3874 for (j=0; j<nMaxTemp; j++) {
3875 tempUsage[j] |= (ifTemps[j] && elseTemps[j]);
3876 }
3877 }
3878
3879 free(elseTemps);
3880
3881 i += 1 + op[i].data.size + op[i+1].data.size;
3882 }
3883 else {
3884 i += op[i].data.size;
3885 }
3886
3887 free(ifTemps);
3888
3889 if (rv)
3890 return true;
3891 }
3892 }
3893 return false;
3894}
icSigCalcOp
Definition IccMpeCalc.h:110
unsigned char icUInt8Number
Number definitions.

References SIccCalcOp::data, icIntMin(), icSigElseOp, icSigIfOp, icSigTempGetChanOp, icSigTempPutChanOp, icSigTempSaveChanOp, SIccCalcOp::select, SequenceNeedTempReset(), SIccCalcOp::sig, sig, SIccCalcOp::size, SIccCalcOp::v1, and SIccCalcOp::v2.

Referenced by NeedTempReset(), and SequenceNeedTempReset().

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

◆ SetFunction() [1/2]

icFuncParseStatus CIccCalculatorFunc::SetFunction ( CIccCalcOpList & opList,
std::string & sReport )

Name: CIccCalculatorFunc::SetFunction.

Purpose:

Args:

Return:

Definition at line 3296 of file IccMpeCalc.cpp.

3297{
3298 if (m_Op) {
3299 free(m_Op);
3300 }
3301
3302 m_nOps = (icUInt32Number)opList.size();
3303
3304 if (m_nOps) {
3305 CIccCalcOpList::iterator i;
3306 int j;
3307
3308 m_Op = (SIccCalcOp*)calloc(m_nOps , sizeof(SIccCalcOp));
3309
3310 for (i=opList.begin(), j=0; i!= opList.end(); i++, j++) {
3311 m_Op[j] = *i;
3312 }
3313 }
3314 else {
3316 }
3317
3318 if (!HasValidOperations(sReport))
3320
3321 return DoesStackUnderflowOverflow(sReport);
3322}
@ icFuncParseEmptyFunction
Definition IccMpeCalc.h:315
@ icFuncParseInvalidOperation
Definition IccMpeCalc.h:311

References DoesStackUnderflowOverflow(), HasValidOperations(), icFuncParseEmptyFunction, icFuncParseInvalidOperation, m_nOps, and m_Op.

+ Here is the call graph for this function:

◆ SetFunction() [2/2]

icFuncParseStatus CIccCalculatorFunc::SetFunction ( const char * szFuncDef,
std::string & sReport )

Name: CIccCalculatorFunc::SetFunction.

Purpose:

Args:

Return:

Definition at line 3276 of file IccMpeCalc.cpp.

3277{
3278 CIccCalcOpList opList;
3279
3280 if (ParseFuncDef(szFuncDef, opList, sReport)) {
3281 return SetFunction(opList, sReport);
3282 }
3284}
@ icFuncParseSyntaxError
Definition IccMpeCalc.h:310
icFuncParseStatus SetFunction(const char *szFuncDef, std::string &sReport)
Name: CIccCalculatorFunc::SetFunction.

References icFuncParseSyntaxError, ParseFuncDef(), and SetFunction().

Referenced by CIccMpeCalculator::SetCalcFunc(), and SetFunction().

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

◆ SetOpDefs()

bool CIccCalculatorFunc::SetOpDefs ( )

Name: CIccCalculatorFunc::SetOpDefs.

Purpose:

Args:

Return:

Definition at line 3436 of file IccMpeCalc.cpp.

3437{
3438 if (!m_Op)
3439 return false;
3440
3442 for (i=0; i<m_nOps; i++) {
3444 if (!m_Op[i].def)
3445 return false;
3446 }
3447 return true;
3448}
static IIccOpDef * getOpDef(icSigCalcOp opSig)

References SIccCalcOp::def, CIccCalcOpMgr::getOpDef(), m_nOps, m_Op, and sig.

Referenced by Begin().

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

◆ Validate()

icValidateStatus CIccCalculatorFunc::Validate ( std::string sigPath,
std::string & sReport,
const CIccMpeCalculator * pChannelCalc = NULL,
const CIccProfile * pProfile = NULL ) const
virtual

Name: CIccCalculatorFunc::Validate.

Purpose:

Args:

Return:

Definition at line 3711 of file IccMpeCalc.cpp.

3714{
3715 CIccInfo Info;
3716 std::string sSigPathName = Info.GetSigPathName(sigPath);
3717
3719 if (m_nReserved) {
3720 sReport += icMsgValidateWarning;
3721 sReport += sSigPathName;
3722 sReport += " function has non zero reserved data.\n";
3723 rv = icValidateWarning;
3724 }
3725
3726 if (GetMaxTemp()>65535) {
3727 sReport += icMsgValidateCriticalError;
3728 sReport += sSigPathName;
3729 sReport += " accesses illegal temporary channels.\n";
3731 }
3732
3733 if (!HasValidOperations(sReport)) {
3734 sReport += icMsgValidateCriticalError;
3735 sReport += sSigPathName;
3736 sReport += " function has invalid operations.\n";
3738 }
3739
3740 if (HasUnsupportedOperations(sReport, pProfile)) {
3741 sReport += icMsgValidateWarning;
3742 sReport += sSigPathName;
3743 sReport += " function has unsupported operations.\r\n";
3744 rv = icValidateWarning;
3745 }
3746
3747 if (DoesOverflowInput(pChannelCalc->NumInputChannels())) {
3748 sReport += icMsgValidateCriticalError;
3749 sReport += sSigPathName;
3750 sReport += " accesses illegal input channels.\n";
3752 }
3753
3754 if (DoesOverflowOutput(pChannelCalc->NumOutputChannels())) {
3755 sReport += icMsgValidateCriticalError;
3756 sReport += sSigPathName;
3757 sReport += " accesses illegal output channels.\n";
3759 }
3760
3761 icFuncParseStatus parseStat = DoesStackUnderflowOverflow(sReport);
3762 if (parseStat!=icFuncParseNoError) {
3763 sReport += icMsgValidateCriticalError;
3764 sReport += sSigPathName;
3765 if (parseStat==icFuncParseStackUnderflow)
3766 sReport += " causes an evaluation stack underflow.\n";
3767 else
3768 sReport += " causes an evaluation stack overflow.\n";
3770 }
3771
3772 return rv;
3773}
icValidateStatus
Definition IccDefs.h:118
@ icValidateOK
Definition IccDefs.h:119
@ icValidateWarning
Definition IccDefs.h:120
@ icValidateCriticalError
Definition IccDefs.h:122
icFuncParseStatus
Definition IccMpeCalc.h:308
const char * icMsgValidateWarning
Definition IccUtil.cpp:90
const char * icMsgValidateCriticalError
Definition IccUtil.cpp:92
icUInt32Number GetMaxTemp() const
Name: CIccCalculatorFunc::GetMaxTemp.
bool HasUnsupportedOperations(std::string &sReport, const CIccProfile *pProfile) const
Name: CIccCalculatorFunc::HasUnsupportedOperations.
Type: Class.
Definition IccUtil.h:303
std::string GetSigPathName(std::string sigPath)
Definition IccUtil.cpp:1614

References DoesOverflowInput(), DoesOverflowOutput(), DoesStackUnderflowOverflow(), GetMaxTemp(), CIccInfo::GetSigPathName(), HasUnsupportedOperations(), HasValidOperations(), icFuncParseNoError, icFuncParseStackUnderflow, icMsgValidateCriticalError, icMsgValidateWarning, icValidateCriticalError, icValidateOK, icValidateWarning, m_nReserved, CIccMultiProcessElement::NumInputChannels(), and CIccMultiProcessElement::NumOutputChannels().

Referenced by CIccMpeCalculator::Validate().

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

◆ Write()

bool CIccCalculatorFunc::Write ( CIccIO * pIO)
virtual

Name: CIccCalculatorFunc::Write.

Purpose:

Args:

Return:

Definition at line 3398 of file IccMpeCalc.cpp.

3399{
3400 if (!pIO)
3401 return false;
3402
3404 sig = GetType();
3405 if (!pIO->Write32(&sig))
3406 return false;
3407
3408 if (!pIO->Write32(&m_nReserved))
3409 return false;
3410
3411 if (!pIO->Write32(&m_nOps))
3412 return false;
3413
3415 for (i=0; i<m_nOps; i++) {
3416 if (!pIO->Write32(&m_Op[i].sig))
3417 return false;
3418 if (!pIO->Write32(&m_Op[i].data.num))
3419 return false;
3420 }
3421
3422 return true;
3423}
icInt32Number Write32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:152

References SIccCalcOp::data, GetType(), m_nOps, m_nReserved, m_Op, SIccCalcOp::num, SIccCalcOp::sig, sig, and CIccIO::Write32().

Referenced by CIccMpeCalculator::Write().

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

Member Data Documentation

◆ m_nOps

◆ m_nReserved

icUInt32Number CIccCalculatorFunc::m_nReserved
protected

Definition at line 414 of file IccMpeCalc.h.

Referenced by CIccCalculatorFunc(), CIccCalculatorFunc(), operator=(), Read(), Validate(), and Write().

◆ m_Op

◆ m_pCalc

CIccMpeCalculator* CIccCalculatorFunc::m_pCalc
protected

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