IccMAX 2.1.27
Color Profile Tools
Loading...
Searching...
No Matches
CIccEvalCompare Class Referenceabstract

#include <IccEval.h>

+ Inheritance diagram for CIccEvalCompare:

Public Member Functions

virtual void Compare (icFloatNumber *pPixel, icFloatNumber *deviceLab, icFloatNumber *destLab1, icFloatNumber *destLab2)=0
 
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)
 

Detailed Description

Member Function Documentation

◆ Compare()

virtual void CIccEvalCompare::Compare ( icFloatNumber pPixel,
icFloatNumber deviceLab,
icFloatNumber destLab1,
icFloatNumber destLab2 
)
pure virtual

Implemented in CIccMinMaxEval, and CIccMinMaxEval.

Referenced by EvaluateProfile().

+ Here is the caller graph for this function:

◆ EvaluateProfile() [1/2]

icStatusCMM CIccEvalCompare::EvaluateProfile ( CIccProfile pProfile,
icUInt8Number  nGran = 0,
icRenderingIntent  nIntent = icUnknownIntent,
icXformInterp  nInterp = icInterpLinear,
bool  buseMpeTags = true 
)
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
float icFloatNumber
Definition IccDefs.h:101
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, 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 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 
)
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, EvaluateProfile(), icCmmStatCantOpenProfile, and ReadIccProfile().

Referenced by main().

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

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