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

#include <IccMpeCalc.h>

+ Collaboration diagram for CIccCalculatorFunc:

Public Member Functions

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

Protected Member Functions

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

Protected Attributes

icUInt32Number m_nOps
 
icUInt32Number m_nReserved
 
SIccCalcOpm_Op
 
CIccMpeCalculatorm_pCalc
 

Detailed Description

Class: CIccCalculatorFunc

Purpose: The Calculator function sequence

Constructor & Destructor Documentation

◆ CIccCalculatorFunc() [1/2]

CIccCalculatorFunc::CIccCalculatorFunc ( CIccMpeCalculator pCalc)

Name: CIccCalculatorFunc::CIccCalculatorFunc

Purpose:

Args:

Return:

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.

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

+ Here is the caller graph for this function:

◆ CIccCalculatorFunc() [2/2]

CIccCalculatorFunc::CIccCalculatorFunc ( const CIccCalculatorFunc func)

Name: CIccCalculatorFunc::CIccCalculatorFunc

Purpose:

Args:

Return:

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}
Definition IccMpeCalc.h:231

References m_nOps, m_nReserved, m_Op, and m_pCalc.

Referenced by NewCopy().

+ Here is the caller graph for this function:

◆ ~CIccCalculatorFunc()

CIccCalculatorFunc::~CIccCalculatorFunc ( )
virtual

Name: CIccCalculatorFunc::~CIccChannelFunc

Purpose:

Args:

Return:

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:

3686{
3687 CIccFloatVector *pStack = pApply->GetStack();
3688
3689 pStack->clear();
3690
3691 if (!ApplySequence(pApply, m_nOps, m_Op)) {
3692 icFloatNumber *pOut = pApply->GetOutput();
3694 for (i=0; i<m_pCalc->NumOutputChannels(); i++)
3695 pOut[i] = -1;
3696 return false;
3697 }
3698
3699 return true;
3700}
unsigned long icUInt32Number
Definition icProfileHeader.h:262
std::vector< icFloatNumber > CIccFloatVector
Definition IccMpeCalc.h:263
float icFloatNumber
Definition IccDefs.h:101
virtual icUInt16Number NumOutputChannels() const
Definition IccTagMPE.h:160
bool ApplySequence(CIccApplyMpeCalculator *pApply, icUInt32Number nOps, SIccCalcOp *op) const
Definition IccMpeCalc.cpp:3561
CIccFloatVector * GetStack()
Definition IccMpeCalc.h:517
icFloatNumber * GetOutput()
Definition IccMpeCalc.h:514

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:

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

References IIccCalcDebugger::AfterOp(), ApplySequence(), IIccCalcDebugger::BeforeOp(), 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, SIccOpState::output, SIccOpState::pApply, SIccOpState::pixel, SIccOpState::pScratch, SIccOpState::pStack, SIccCalcOp::sig, 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:

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

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:

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

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

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:

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)
Definition IccMpeCalc.cpp:2843

References DescribeSequence(), m_nOps, and m_Op.

Referenced by CIccMpeCalculator::Describe(), and CIccMpeXmlCalculator::ToXml().

+ 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
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)
Definition IccMpeCalc.cpp:2830

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

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:

4156{
4158 for (i=0; i<m_nOps; i++) {
4159 if (m_Op[i].sig == icSigInputChanOp) {
4160 if (m_Op[i].data.select.v1+m_Op[i].data.select.v2 >= nInputChannels)
4161 return true;
4162 }
4163 }
4164 return false;
4165}
@ icSigInputChanOp
Definition IccMpeCalc.h:119

References icSigInputChanOp, m_nOps, m_Op, and SIccCalcOp::sig.

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:

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

References icSigOutputChanOp, m_nOps, m_Op, and SIccCalcOp::sig.

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:

4036{
4037 int rv = CheckUnderflowOverflow(m_Op, m_nOps, 0, true, sReport);
4038
4039 if (rv==-1)
4041 else if (rv<0)
4043
4044 rv = CheckUnderflowOverflow(m_Op, m_nOps, 0, false, sReport);
4045
4046 if (rv==-1)
4048 else if (rv<0)
4050
4051 return icFuncParseNoError;
4052}
@ 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
373{ return "CIccChannelFunction"; }

◆ GetMaxTemp()

icUInt32Number CIccCalculatorFunc::GetMaxTemp ( ) const

Name: CIccCalculatorFunc::GetMaxTemp

Purpose:

Args:

Return:

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

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

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

+ Here is the caller graph for this function:

◆ GetType()

virtual icChannelFuncSignature CIccCalculatorFunc::GetType ( ) const
inlinevirtual
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:

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

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

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:

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

References SIccCalcOp::Describe(), icSigCaseOp, icSigDefaultOp, icSigElseOp, icSigIfOp, icSigSelectOp, SIccCalcOp::IsValidOp(), m_nOps, m_Op, m_pCalc, and SIccCalcOp::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:

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

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

Referenced by InitSelectOps().

+ Here is the caller graph for this function:

◆ InitSelectOps()

bool CIccCalculatorFunc::InitSelectOps ( )
protected

Name: CIccCalculatorFunc::InitSelectOps

Purpose:

Args:

Return:

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

References icSigSelectOp, InitSelectOp(), m_nOps, m_Op, and SIccCalcOp::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
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:

3811{
3812 return SequenceNeedTempReset(m_Op, m_nOps, tempUsage, nMaxTemp);
3813}
bool SequenceNeedTempReset(SIccCalcOp *op, icUInt32Number nOps, icUInt8Number *tempUsage, icUInt32Number nMaxTemp)
Definition IccMpeCalc.cpp:3825

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
369{ return new CIccCalculatorFunc(*this);}
Definition IccMpeCalc.h:364

References CIccCalculatorFunc().

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

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

◆ operator=()

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

Name: &CIccCalculatorFunc::operator=

Purpose:

Args:

Return:

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:

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}
icSigCmmEnvVar
Definition icProfileHeader.h:631
@ 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
static void AppendOpList(CIccCalcOpList &toList, const CIccCalcOpList &fromList)
Definition IccMpeCalc.cpp:2966
static bool IsValidOp(icSigCalcOp sig)
Definition IccMpeCalc.cpp:2073
Definition IccMpeCalc.h:323
const char * ParseFuncDef(const char *szFuncDef, CIccCalcOpList &m_list, std::string &sReport)
Definition IccMpeCalc.cpp:2985

References CIccFuncTokenizer::CIccFuncTokenizer(), AppendOpList(), 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, icSigCartesianToPolarOp, icSigCaseOp, icSigCeilingOp, icSigCopyOp, icSigCosineOp, icSigCubeOp, icSigCubeRootOp, icSigDataOp, icSigDefaultOp, icSigDivideOp, icSigElseOp, 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(), ParseFuncDef(), CIccFuncTokenizer::SetPos(), and SIccCalcOp::sig.

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:

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

References GetType(), m_nOps, m_nReserved, m_Op, CIccIO::Read32(), and SIccCalcOp::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:

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

References icIntMin(), icSigElseOp, icSigIfOp, icSigTempGetChanOp, icSigTempPutChanOp, icSigTempSaveChanOp, SequenceNeedTempReset(), and SIccCalcOp::sig.

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:

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

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

Referenced by SetFunction().

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

◆ SetFunction() [2/2]

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

Name: CIccCalculatorFunc::SetFunction

Purpose:

Args:

Return:

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)
Definition IccMpeCalc.cpp:3276

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

Referenced by CIccMpeCalculator::SetCalcFunc().

+ 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:

3438{
3439 if (!m_Op)
3440 return false;
3441
3443 for (i=0; i<m_nOps; i++) {
3444 m_Op[i].def = CIccCalcOpMgr::getOpDef(m_Op[i].sig);
3445 if (!m_Op[i].def)
3446 return false;
3447 }
3448 return true;
3449}
static IIccOpDef * getOpDef(icSigCalcOp opSig)
Definition IccMpeCalc.cpp:2170

References SIccCalcOp::def, CIccCalcOpMgr::getOpDef(), m_nOps, m_Op, and SIccCalcOp::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:

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

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:

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

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

Referenced by CIccMpeCalculator::Write().

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

Field Documentation

◆ m_nOps

◆ m_nReserved

icUInt32Number CIccCalculatorFunc::m_nReserved
protected

◆ m_Op

◆ m_pCalc


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