IccMAX 2.1.27
Color Profile Tools
Loading...
Searching...
No Matches
CIccMinMaxEval Class Reference
+ Inheritance diagram for CIccMinMaxEval:
+ Collaboration diagram for CIccMinMaxEval:

Public Member Functions

 CIccMinMaxEval ()
 
 CIccMinMaxEval ()
 
void Compare (icFloatNumber *pixel, icFloatNumber *deviceLab, icFloatNumber *lab1, icFloatNumber *lab2)
 
void Compare (icFloatNumber *pixel, icFloatNumber *deviceLab, icFloatNumber *lab1, icFloatNumber *lab2)
 
icStatusCMM ICCPROFLIB_API EvaluateProfile (CIccProfile *pProfile, icUInt8Number nGran=0, icRenderingIntent nIntent=icUnknownIntent, icXformInterp nInterp=icInterpLinear, bool buseMpeTags=true)
 
icStatusCMM ICCPROFLIB_API EvaluateProfile (const icChar *szProfilePath, icUInt8Number nGran=0, icRenderingIntent nIntent=icUnknownIntent, icXformInterp nInterp=icInterpLinear, bool buseMpeTags=true)
 
icFloatNumber GetMean1 ()
 
icFloatNumber GetMean1 ()
 
icFloatNumber GetMean2 ()
 
icFloatNumber GetMean2 ()
 

Data Fields

icUInt32Number m_nTotal
 
icFloatNumber maxDE1
 
icFloatNumber maxDE2
 
icFloatNumber maxLab1 [3]
 
icFloatNumber maxLab2 [3]
 
icFloatNumber minDE1
 
icFloatNumber minDE2
 
icUInt32Number num3
 

Protected Attributes

icFloatNumber num1
 
icFloatNumber num2
 
icFloatNumber sum1
 
icFloatNumber sum2
 

Detailed Description

Constructor & Destructor Documentation

◆ CIccMinMaxEval() [1/2]

CIccMinMaxEval::CIccMinMaxEval ( )
102{
103 minDE1 = minDE2 = 10000;
104 maxDE1 = maxDE2 = -1;
105 sum1 = sum2 = 0;
106 num1 = num2 = 0.0;
107 num3 = m_nTotal = 0;
108
109 memset(&maxLab1[0], 0, sizeof(maxLab1));
110 memset(&maxLab2[0], 0, sizeof(maxLab2));
111}
icFloatNumber maxLab2[3]
Definition iccRoundTrip.cpp:93
icFloatNumber minDE2
Definition iccRoundTrip.cpp:89
icFloatNumber maxLab1[3]
Definition iccRoundTrip.cpp:93
icUInt32Number num3
Definition iccRoundTrip.cpp:91
icFloatNumber minDE1
Definition iccRoundTrip.cpp:89
icUInt32Number m_nTotal
Definition iccRoundTrip.cpp:91
icFloatNumber num1
Definition iccRoundTrip.cpp:98
icFloatNumber sum1
Definition iccRoundTrip.cpp:97
icFloatNumber num2
Definition iccRoundTrip.cpp:98
icFloatNumber sum2
Definition iccRoundTrip.cpp:97
icFloatNumber maxDE2
Definition iccRoundTrip.cpp:90
icFloatNumber maxDE1
Definition iccRoundTrip.cpp:90

References m_nTotal, maxDE1, maxDE2, maxLab1, maxLab2, minDE1, minDE2, num1, num2, num3, sum1, and sum2.

◆ CIccMinMaxEval() [2/2]

CIccMinMaxEval::CIccMinMaxEval ( )

Member Function Documentation

◆ Compare() [1/2]

void CIccMinMaxEval::Compare ( icFloatNumber pixel,
icFloatNumber deviceLab,
icFloatNumber lab1,
icFloatNumber lab2 
)
virtual

Implements CIccEvalCompare.

114{
115 icFloatNumber DE1 = icDeltaE(deviceLab, lab1);
116 icFloatNumber DE2 = icDeltaE(lab1, lab2);
117
118 if (DE1<minDE1) {
119 minDE1 = DE1;
120 }
121
122 if (DE1>maxDE1) {
123 maxDE1 = DE1;
124 memcpy(&maxLab1[0], deviceLab, sizeof(maxLab1));
125 }
126
127 if (DE2<minDE2) {
128 minDE2 = DE2;
129 }
130
131 if (DE2>maxDE2) {
132 maxDE2 = DE2;
133 memcpy(&maxLab2[0], deviceLab, sizeof(maxLab2));
134 }
135
136 if(DE2 <= 1.0)
137 num3 += 1;
138
139 sum1 += DE1;
140 num1 += 1.0;
141
142 sum2 += DE2;
143 num2 += 1.0;
144
145 m_nTotal += 1;
146}
float icFloatNumber
Definition IccDefs.h:101
ICCPROFLIB_API icFloatNumber icDeltaE(const icFloatNumber *Lab1, const icFloatNumber *Lab2)
Definition IccUtil.cpp:527

References icDeltaE(), m_nTotal, maxDE1, maxDE2, maxLab1, maxLab2, minDE1, minDE2, num1, num2, num3, sum1, and sum2.

+ Here is the call graph for this function:

◆ Compare() [2/2]

void CIccMinMaxEval::Compare ( icFloatNumber pixel,
icFloatNumber deviceLab,
icFloatNumber lab1,
icFloatNumber lab2 
)
virtual

Implements CIccEvalCompare.

◆ EvaluateProfile() [1/2]

icStatusCMM CIccEvalCompare::EvaluateProfile ( CIccProfile pProfile,
icUInt8Number  nGran = 0,
icRenderingIntent  nIntent = icUnknownIntent,
icXformInterp  nInterp = icInterpLinear,
bool  buseMpeTags = true 
)
inherited
85{
86 if (!pProfile)
87 {
89 }
90
91 if (pProfile->m_Header.deviceClass!=icSigInputClass &&
92 pProfile->m_Header.deviceClass!=icSigDisplayClass &&
93 pProfile->m_Header.deviceClass!=icSigOutputClass &&
94 pProfile->m_Header.deviceClass!=icSigColorSpaceClass)
95 {
97 }
98
99 CIccCmm dev2Lab(icSigUnknownData, icSigLabData);
100 CIccCmm Lab2Dev2Lab(icSigLabData, icSigLabData, false);
101
102 icStatusCMM result;
103
104 result = dev2Lab.AddXform(*pProfile, nIntent, nInterp, NULL, icXformLutColorimetric, buseMpeTags);
105
106 if (result!=icCmmStatOk) {
107 return result;
108 }
109
110 result = dev2Lab.Begin();
111 if (result != icCmmStatOk) {
112 return result;
113 }
114
115 result = Lab2Dev2Lab.AddXform(*pProfile, nIntent, nInterp, NULL, icXformLutColorimetric, buseMpeTags);
116 if (result != icCmmStatOk) {
117 return result;
118 }
119
120 result = Lab2Dev2Lab.AddXform(*pProfile, nIntent, nInterp, NULL, icXformLutColorimetric, buseMpeTags);
121 if (result != icCmmStatOk) {
122 return result;
123 }
124
125 result = Lab2Dev2Lab.Begin();
126 if (result != icCmmStatOk) {
127 return result;
128 }
129
130 icFloatNumber sPixel[15];
131 icFloatNumber devPcs[15], roundPcs1[15], roundPcs2[15];
132
133 int ndim = icGetSpaceSamples(pProfile->m_Header.colorSpace);
134 int ndim1 = ndim+1;
135
136 // determine granularity
137 if (!nGran)
138 {
139 CIccTagLutAtoB* pTag = (CIccTagLutAtoB*)pProfile->FindTag(icSigAToB0Tag+(nIntent==icAbsoluteColorimetric ? icRelativeColorimetric : nIntent));
140 if (!pTag || ndim==3)
141 {
142 nGran = 33;
143 }
144 else {
145 CIccCLUT* pClut = pTag->GetCLUT();
146 if (pClut)
147 nGran = pClut->GridPoints()+2;
148 else
149 nGran = 33;
150 }
151 }
152
153 int i, j;
154 icFloatNumber stepsize = (icFloatNumber)(1.0 / (icFloatNumber)(nGran - 1));
155 icFloatNumber* steps = new icFloatNumber[ndim1];
156
157 icFloatNumber nstart = 0.0;
158 icFloatNumber nEnd = (icFloatNumber)(1.0 + stepsize / 2.0);
159
160 // Initialize all step values to zero
161 for (j = 0; j < ndim1; j++) {
162 steps[j] = nstart;
163 }
164
165 // Multidimensional iterator loop
166 while (steps[0] == nstart) {
167 for (j = 0; j < ndim; j++) {
168 sPixel[j] = icMin(steps[j + 1], 1.0);
169 }
170
171 // Increment step value
172 steps[ndim] += stepsize;
173
174 // Carry over logic
175 for (i = ndim; i > 0; i--) {
176 if (steps[i] > nEnd) {
177 steps[i] = nstart;
178 steps[i - 1] += stepsize;
179 }
180 else {
181 break;
182 }
183 }
184
185 dev2Lab.Apply(devPcs, sPixel); //Convert device value to pcs from input table
186 Lab2Dev2Lab.Apply(roundPcs1, devPcs); //First round trip gets color into output gamut
187 Lab2Dev2Lab.Apply(roundPcs2, roundPcs1); //Second round trip find reproducibility error
188
189 icLabFromPcs(devPcs);
190 icLabFromPcs(roundPcs1);
191 icLabFromPcs(roundPcs2);
192
193 Compare(sPixel, devPcs, roundPcs1, roundPcs2);
194 }
195
196 delete[] steps;
197
198 return icCmmStatOk;
199}
@ icSigDisplayClass
Definition icProfileHeader.h:953
@ icSigOutputClass
Definition icProfileHeader.h:954
@ icSigInputClass
Definition icProfileHeader.h:952
@ icSigColorSpaceClass
Definition icProfileHeader.h:957
@ icSigLabData
Definition icProfileHeader.h:847
#define icSigUnknownData
Definition icProfileHeader.h:903
@ icSigAToB0Tag
Definition icProfileHeader.h:342
@ icRelativeColorimetric
Definition icProfileHeader.h:1144
@ icAbsoluteColorimetric
Definition icProfileHeader.h:1147
@ icXformLutColorimetric
Definition IccCmm.h:135
icStatusCMM
CMM return status values.
Definition IccCmm.h:90
@ icCmmStatInvalidProfile
Definition IccCmm.h:95
@ icCmmStatCantOpenProfile
Definition IccCmm.h:93
@ icCmmStatOk
Definition IccCmm.h:92
ICCPROFLIB_API icFloatNumber icMin(icFloatNumber v1, icFloatNumber v2)
Definition IccUtil.cpp:898
ICCPROFLIB_API icUInt32Number icGetSpaceSamples(icColorSpaceSignature sig)
Definition IccUtil.cpp:1303
ICCPROFLIB_API void icLabFromPcs(icFloatNumber *Lab)
Here are some conversion routines to convert to regular Lab encoding.
Definition IccUtil.cpp:919
Definition IccTagLut.h:326
icUInt8Number GridPoints() const
Definition IccTagLut.h:349
CIccCLUT * GetCLUT() const
Definition IccTagLut.h:469
Definition IccTagLut.h:502
virtual void Compare(icFloatNumber *pPixel, icFloatNumber *deviceLab, icFloatNumber *destLab1, icFloatNumber *destLab2)=0

References icHeader::colorSpace, CIccEvalCompare::Compare(), icHeader::deviceClass, CIccMBB::GetCLUT(), CIccCLUT::GridPoints(), icAbsoluteColorimetric, icCmmStatCantOpenProfile, icCmmStatInvalidProfile, icCmmStatOk, icGetSpaceSamples(), icLabFromPcs(), icMin(), icRelativeColorimetric, icSigAToB0Tag, icSigColorSpaceClass, icSigDisplayClass, icSigInputClass, icSigLabData, icSigOutputClass, and icXformLutColorimetric.

Referenced by CIccEvalCompare::EvaluateProfile().

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

◆ EvaluateProfile() [2/2]

icStatusCMM CIccEvalCompare::EvaluateProfile ( const icChar szProfilePath,
icUInt8Number  nGran = 0,
icRenderingIntent  nIntent = icUnknownIntent,
icXformInterp  nInterp = icInterpLinear,
bool  buseMpeTags = true 
)
inherited
203{
204 CIccProfile *pProfile = ReadIccProfile(szProfilePath);
205
206 if (!pProfile)
208
209 icStatusCMM result = EvaluateProfile(pProfile, nGrid, nIntent, nInterp, buseMpeTags);
210
211 delete pProfile;
212
213 return result;
214}
class ICCPROFLIB_API CIccProfile
Definition IccPcc.h:80
CIccProfile * ReadIccProfile(const icChar *szFilename, bool bUseSubProfile)
Definition IccProfile.cpp:3274
icStatusCMM ICCPROFLIB_API EvaluateProfile(CIccProfile *pProfile, icUInt8Number nGran=0, icRenderingIntent nIntent=icUnknownIntent, icXformInterp nInterp=icInterpLinear, bool buseMpeTags=true)
Definition IccEval.cpp:82

References CIccProfile, CIccEvalCompare::EvaluateProfile(), icCmmStatCantOpenProfile, and ReadIccProfile().

Referenced by main().

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

◆ GetMean1() [1/2]

icFloatNumber CIccMinMaxEval::GetMean1 ( )
inline
86{ return sum1 / num1; }

References num1, and sum1.

Referenced by main().

+ Here is the caller graph for this function:

◆ GetMean1() [2/2]

icFloatNumber CIccMinMaxEval::GetMean1 ( )
inline
896{ return sum1 / num1; }

◆ GetMean2() [1/2]

icFloatNumber CIccMinMaxEval::GetMean2 ( )
inline
87{ return sum2 / num2; }

References num2, and sum2.

Referenced by main().

+ Here is the caller graph for this function:

◆ GetMean2() [2/2]

icFloatNumber CIccMinMaxEval::GetMean2 ( )
inline
897{ return sum2 / num2; }

Field Documentation

◆ m_nTotal

icUInt32Number CIccMinMaxEval::m_nTotal

Referenced by CIccMinMaxEval(), and Compare().

◆ maxDE1

icFloatNumber CIccMinMaxEval::maxDE1

Referenced by CIccMinMaxEval(), Compare(), and main().

◆ maxDE2

icFloatNumber CIccMinMaxEval::maxDE2

Referenced by CIccMinMaxEval(), Compare(), and main().

◆ maxLab1

icFloatNumber CIccMinMaxEval::maxLab1

Referenced by CIccMinMaxEval(), Compare(), and main().

◆ maxLab2

icFloatNumber CIccMinMaxEval::maxLab2

Referenced by CIccMinMaxEval(), Compare(), and main().

◆ minDE1

icFloatNumber CIccMinMaxEval::minDE1

Referenced by CIccMinMaxEval(), Compare(), and main().

◆ minDE2

icFloatNumber CIccMinMaxEval::minDE2

Referenced by CIccMinMaxEval(), Compare(), and main().

◆ num1

icFloatNumber CIccMinMaxEval::num1
protected

Referenced by CIccMinMaxEval(), Compare(), and GetMean1().

◆ num2

icFloatNumber CIccMinMaxEval::num2
protected

Referenced by CIccMinMaxEval(), Compare(), and GetMean2().

◆ num3

icUInt32Number CIccMinMaxEval::num3

Referenced by CIccMinMaxEval(), and Compare().

◆ sum1

icFloatNumber CIccMinMaxEval::sum1
protected

Referenced by CIccMinMaxEval(), Compare(), and GetMean1().

◆ sum2

icFloatNumber CIccMinMaxEval::sum2
protected

Referenced by CIccMinMaxEval(), Compare(), and GetMean2().


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