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

Public Member Functions

 CIccDefaultEncProfileConverter ()
 
virtual icStatusEncConvert ConvertFromParams (CIccProfilePtr &newIcc, CIccTagStruct *pParams, icHeader *pHeader)
 

Static Public Member Functions

static IIccEncProfileConverterGetHandler ()
 
static void SetEncProfileConverter (IIccEncProfileConverter *pConverter)
 

Detailed Description

Constructor & Destructor Documentation

◆ CIccDefaultEncProfileConverter()

CIccDefaultEncProfileConverter::CIccDefaultEncProfileConverter ( )
inline
120{}

Referenced by IIccEncProfileConverter::GetHandler().

+ Here is the caller graph for this function:

Member Function Documentation

◆ ConvertFromParams()

icStatusEncConvert CIccDefaultEncProfileConverter::ConvertFromParams ( CIccProfilePtr &  newIcc,
CIccTagStruct pParams,
icHeader pHeader 
)
virtual

Implements IIccEncProfileConverter.

143{
144 newIcc = NULL;
145
146 if (!pParams || pParams->GetTagStructType() != icSigColorEncodingParamsSruct || !pHeader)
148
151
152 if (!pWhitePt || pWhitePt->GetNumValues() < 2) {
154 }
155
156 if (!pMediaWhitePt)
157 pMediaWhitePt = pWhitePt;
158
159 if (!pMediaWhitePt || pMediaWhitePt->GetNumValues() < 2) {
161 }
162
163 CIccProfile* pIcc = new CIccProfile;
164 pIcc->m_Header = *pHeader;
165
166 struct tm* newtime;
167 time_t long_time;
168
169 time(&long_time); /* Get time as long integer. */
170 newtime = gmtime(&long_time);
171
172 pIcc->m_Header.date.year = newtime->tm_year + 1900;
173 pIcc->m_Header.date.month = newtime->tm_mon + 1;
174 pIcc->m_Header.date.day = newtime->tm_mday;
175 pIcc->m_Header.date.hours = newtime->tm_hour;
176 pIcc->m_Header.date.minutes = newtime->tm_min;
177 pIcc->m_Header.date.seconds = newtime->tm_sec;
178
179 float XYZWhite[3];
180 icYxy2XYZVector(XYZWhite, 1.0f, &(*pWhitePt)[0], 1);
181 //Fill header from pParams
182 pIcc->m_Header.pcs = icSigXYZPcsData;
183 pIcc->m_Header.deviceClass = icSigDisplayClass;
184 pIcc->m_Header.illuminant.X = icDtoF(XYZWhite[0]);
185 pIcc->m_Header.illuminant.Y = icDtoF(XYZWhite[1]);
186 pIcc->m_Header.illuminant.Z = icDtoF(XYZWhite[2]);
187
188 //Fill Media White Point tag
189 CIccTagXYZ* pXYZ = new CIccTagXYZ();
190 float XYZMedia[3];
191 icYxy2XYZVector(XYZMedia, 1.0f, &(*pMediaWhitePt)[0], 1);
192 if (!pXYZ->SetSize(1)) {
193 delete pIcc;
195 }
196
197 (*pXYZ)[0].X = icDtoF(XYZMedia[0]);
198 (*pXYZ)[0].Y = icDtoF(XYZMedia[1]);
199 (*pXYZ)[0].Z = icDtoF(XYZMedia[2]);
200 pIcc->AttachTag(icSigMediaWhitePointTag, pXYZ);
201
202 //Create A2B tag from pParams
204 if (!pMpeTag) {
205 delete pIcc;
207 }
208
209 pMpeTag->SetChannels(3, 3);
210
211 CIccMpeMatrix *pMtx;
213 icFloatNumber lumMtx[9];
214 bool bHaveLumMtx = false;
215 if (pLumMtx) {
216 if (pLumMtx->GetSize()<9) {
217 delete pMpeTag;
218 delete pIcc;
220 }
222 if (!pMtx) {
223 delete pMpeTag;
224 delete pIcc;
226 }
227 if (!pMtx->SetSize(3, 3))
229
230 pLumMtx->GetValues(pMtx->GetMatrix(), 0, 9);
231 pLumMtx->GetValues(&lumMtx[0], 0, 9);
232 pMpeTag->Attach(pMtx);
233 delete pLumMtx;
234 bHaveLumMtx = true;
235 }
236
238 if (pSegCurve && pSegCurve->GetCurve()) {
239 CIccSegmentedCurve *pCurve = pSegCurve->GetCurve();
241 if (!pCurves) {
242 delete pMpeTag;
243 delete pIcc;
245 }
246 pCurves->SetSize(3);
247 pCurves->SetCurve(0, pCurve->NewCopy());
248 pCurves->SetCurve(1, pCurve->NewCopy());
249 pCurves->SetCurve(2, pCurve->NewCopy());
250 pMpeTag->Attach(pCurves);
251 }
253 if (!pMtx) {
254 delete pMpeTag;
255 delete pIcc;
257 }
258
259 CIccTagFloat32 *pxy;
260 if (!pMtx->SetSize(3,3)) {
261 delete pMtx;
262 delete pMpeTag;
263 delete pIcc;
265 }
266 icFloatNumber *mtx=pMtx->GetMatrix();
267
269 if (!pxy || pxy->GetSize()<2) {
270 delete pMpeTag;
271 delete pIcc;
273 }
274 mtx[0]=(*pxy)[0] * XYZMedia[0];
275 mtx[3]=(*pxy)[1] * XYZMedia[1];
276 mtx[6]=(1.0f - (*pxy)[0] - (*pxy)[1]) * XYZMedia[2];
277
279 if (!pxy || pxy->GetSize()<2) {
280 delete pMpeTag;
281 delete pIcc;
283 }
284 mtx[1]=(*pxy)[0] * XYZMedia[0];
285 mtx[4]=(*pxy)[1] * XYZMedia[1];
286 mtx[7]=(1.0f - (*pxy)[0] - (*pxy)[1]) * XYZMedia[2];
287
289 if (!pxy || pxy->GetSize()<2) {
290 delete pMpeTag;
291 delete pIcc;
293 }
294 mtx[2]=(*pxy)[0] * XYZMedia[0];
295 mtx[5]=(*pxy)[1] * XYZMedia[1];
296 mtx[8]=(1.0f - (*pxy)[0] - (*pxy)[1]) * XYZMedia[2];
297
298 CIccMpeMatrix *pMtx2 = (CIccMpeMatrix*)pMtx->NewCopy();
299 pMpeTag->Attach(pMtx);
300
301 pIcc->AttachTag(icSigAToB3Tag, pMpeTag);
302
303 if (!icMatrixInvert3x3(pMtx2->GetMatrix())) {
304 delete pMtx2;
305 delete pIcc;
307 }
308
309 //Create B2A tag from pParams
311 if (!pMpeTag) {
312 delete pMtx2;
313 delete pIcc;
315 }
316
317 pMpeTag->SetChannels(3, 3);
318
319 pMpeTag->Attach(pMtx2);
320
322 if (pSegCurve && pSegCurve->GetCurve()) {
323 CIccSegmentedCurve *pCurve = pSegCurve->GetCurve();
325 if (!pCurves || !pCurves->SetSize(3)) {
326 delete pMpeTag;
327 delete pIcc;
329 }
330 pCurves->SetCurve(0, pCurve->NewCopy());
331 pCurves->SetCurve(1, pCurve->NewCopy());
332 pCurves->SetCurve(2, pCurve->NewCopy());
333 pMpeTag->Attach(pCurves);
334 }
335
336 if (bHaveLumMtx) {
337 if (!icMatrixInvert3x3(&lumMtx[0])) {
338 delete pMpeTag;
339 delete pIcc;
341 }
342
344 if (!pMtx) {
345 delete pMpeTag;
346 delete pIcc;
348 }
349 pMpeTag->Attach(pMtx);
350 }
351 pIcc->AttachTag(icSigBToA3Tag, pMpeTag);
352
353 //Add ProfileConnectionConditions (if needed)
354 if (pIcc->m_Header.illuminant.X!=icDtoF(icD50XYZ[0]) ||
355 pIcc->m_Header.illuminant.Y!=icDtoF(icD50XYZ[1]) ||
356 pIcc->m_Header.illuminant.Z!=icDtoF(icD50XYZ[2])) {
357
358 //Set Spectral Viewing Conditions
360 if (!pCond) {
361 delete pIcc;
363 }
364
365 icFloatNumber illXYZ[3];
367 pCond->setIlluminant(XYZWhite);
368 //pCond->m_stdIlluminant = icIlluminantCustom;
369 illXYZ[0] = pCond->m_illuminantXYZ.X = Lw * XYZWhite[0];
370 illXYZ[1] = pCond->m_illuminantXYZ.Y = Lw * XYZWhite[1];
371 illXYZ[2] = pCond->m_illuminantXYZ.Z = Lw * XYZWhite[2];
372
375 if (pSurround && pSurround->GetSize()>=2) {
376 icFloatNumber XYZSurround[3];
377 icYxy2XYZVector(XYZSurround, 1, &(*pSurround)[0], 1);
378 pCond->m_surroundXYZ.X = La * XYZSurround[0];
379 pCond->m_surroundXYZ.Y = La * XYZSurround[1];
380 pCond->m_surroundXYZ.Z = La * XYZSurround[2];
381 }
382 else {
383 pCond->m_surroundXYZ.X = La * XYZWhite[0];
384 pCond->m_surroundXYZ.Y = La * XYZWhite[1];
385 pCond->m_surroundXYZ.Z = La * XYZWhite[2];
386 }
387
388 pIcc->AttachTag(icSigSpectralViewingConditionsTag, pCond);
389
390 icFloatNumber Lsw=pParams->GetElemNumberValue(icSigCeptViewingSurroundMbr, Lw/5.0f - 0.001f);
391 CIccCamConverter *pCstmConvert = new CIccCamConverter();
392 if (!pCstmConvert) {
393 delete pIcc;
395 }
396 pCstmConvert->SetParameter_WhitePoint(&illXYZ[0]);
397 pCstmConvert->SetParameter_La(La);
398 pCstmConvert->SetParameter_Yb(Lw);
399
400 icFloatNumber SWr = Lsw / Lw;
401
402 if (SWr>0.2) { //Average Surround
403 pCstmConvert->SetParameter_C(0.69f);
404 pCstmConvert->SetParameter_Nc(1.0f);
405 pCstmConvert->SetParameter_F(1.0f);
406 }
407 else if (SWr>0.0) { //Dim Surround
408 pCstmConvert->SetParameter_C(0.59f);
409 pCstmConvert->SetParameter_Nc(0.95f);
410 pCstmConvert->SetParameter_F(0.9f);
411 }
412 else { //Dark Surround
413 pCstmConvert->SetParameter_C(0.525f);
414 pCstmConvert->SetParameter_Nc(0.8f);
415 pCstmConvert->SetParameter_F(0.8f);
416 }
417
418 CIccCamConverter *pCstmConvert2 = new CIccCamConverter();
419 if (!pCstmConvert2) {
420 delete pCstmConvert;
421 delete pIcc;
423 }
424 *pCstmConvert2 = *pCstmConvert;
425
426 //By default New CIccCamConverter objects are initialized with default PCS conditions
427 CIccCamConverter *pStdConvert = new CIccCamConverter();
428 if (!pStdConvert) {
429 delete pCstmConvert;
430 delete pCstmConvert2;
431 delete pIcc;
433 }
434 CIccCamConverter *pStdConvert2 = new CIccCamConverter();
435 if (!pStdConvert2) {
436 delete pCstmConvert;
437 delete pCstmConvert2;
438 delete pStdConvert;
439 delete pIcc;
441 }
442
443 CIccMpeCAM *pCam;
445 if (!pMpeTag) {
446 delete pCstmConvert;
447 delete pStdConvert;
448 delete pCstmConvert2;
449 delete pStdConvert2;
450 delete pIcc;
452 }
453 pMpeTag->SetChannels(3, 3);
454
456 if (!pCam) {
457 delete pCstmConvert;
458 delete pStdConvert;
459 delete pCstmConvert2;
460 delete pStdConvert2;
461 delete pIcc;
463 }
464 pCam->SetCAM(pCstmConvert);
465 pMpeTag->Attach(pCam);
466
468 if (!pCam) {
469 delete pStdConvert;
470 delete pCstmConvert2;
471 delete pStdConvert2;
472 delete pIcc;
474 }
475 pCam->SetCAM(pStdConvert);
476 pMpeTag->Attach(pCam);
477 pIcc->AttachTag(icSigCustomToStandardPccTag, pMpeTag);
478
480 if (!pMpeTag) {
481 delete pCstmConvert2;
482 delete pStdConvert2;
483 delete pIcc;
485 }
486 pMpeTag->SetChannels(3,3);
487
489 if (!pCam) {
490 delete pCstmConvert2;
491 delete pStdConvert2;
492 delete pIcc;
494 }
495 pCam->SetCAM(pStdConvert2);
496 pMpeTag->Attach(pCam);
497
499 if (!pCam) {
500 delete pCstmConvert2;
501 delete pIcc;
503 }
504 pCam->SetCAM(pCstmConvert2);
505 pMpeTag->Attach(pCam);
506 pIcc->AttachTag(icSigStandardToCustomPccTag, pMpeTag);
507 }
508
509#if 1 && defined(_DEBUG)
510 SaveIccProfile("WEncConv.icc", pIcc);
511#endif
512
513 newIcc = pIcc;
514 return icEncConvertOk;
515}
@ icSigDisplayClass
Definition icProfileHeader.h:953
@ icSigCeptViewingSurroundMbr
Definition icProfileHeader.h:749
@ icSigCeptLumaChromaMatrixMbr
Definition icProfileHeader.h:742
@ icSigCeptWhitePointLuminanceMbr
Definition icProfileHeader.h:743
@ icSigCeptMediumWhitePointChromaticityMbr
Definition icProfileHeader.h:756
@ icSigCeptRedPrimaryXYZMbr
Definition icProfileHeader.h:739
@ icSigCeptInverseTransferFunctionMbr
Definition icProfileHeader.h:741
@ icSigCeptTransferFunctionMbr
Definition icProfileHeader.h:740
@ icSigCeptAmbientWhitePointChromaticityMbr
Definition icProfileHeader.h:752
@ icSigCeptGreenPrimaryXYZMbr
Definition icProfileHeader.h:738
@ icSigCeptWhitePointChromaticityMbr
Definition icProfileHeader.h:744
@ icSigCeptBluePrimaryXYZMbr
Definition icProfileHeader.h:737
@ icSigCeptAmbientWhitePointLuminanceMbr
Definition icProfileHeader.h:751
#define icSigXYZPcsData
Definition icProfileHeader.h:940
@ icSigCurveSetElemType
Definition icProfileHeader.h:643
@ icSigXYZToJabElemType
Definition icProfileHeader.h:651
@ icSigJabToXYZElemType
Definition icProfileHeader.h:652
@ icSigMatrixElemType
Definition icProfileHeader.h:644
icFloat32Number Z
Definition icProfileHeader.h:1443
@ icSigSegmentedCurveType
Definition icProfileHeader.h:558
@ icSigMultiProcessElementType
Definition icProfileHeader.h:550
@ icSigSpectralViewingConditionsType
Definition icProfileHeader.h:561
@ icSigFloat32ArrayType
Definition icProfileHeader.h:541
@ icSigColorEncodingParamsSruct
Definition icProfileHeader.h:601
icFloat32Number Y
Definition icProfileHeader.h:1442
@ icSigSpectralViewingConditionsTag
Definition icProfileHeader.h:470
@ icSigAToB3Tag
Definition icProfileHeader.h:345
@ icSigCustomToStandardPccTag
Definition icProfileHeader.h:394
@ icSigMediaWhitePointTag
Definition icProfileHeader.h:439
@ icSigBToA3Tag
Definition icProfileHeader.h:377
@ icSigStandardToCustomPccTag
Definition icProfileHeader.h:471
icFloat32Number X
Definition icProfileHeader.h:1441
class ICCPROFLIB_API CIccProfile
Definition IccPcc.h:80
bool SaveIccProfile(const icChar *szFilename, CIccProfile *pIcc, icProfileIDSaveMethod nWriteId)
Definition IccProfile.cpp:3681
float icFloatNumber
Definition IccDefs.h:101
static void icYxy2XYZVector(icFloatNumber *XYZ, icFloatNumber Y, icFloatNumber *xy, icUInt8Number idxOffset=1)
Definition IccEncoding.cpp:135
ICCPROFLIB_API icFloatNumber icD50XYZ[3]
Definition IccUtil.cpp:782
ICCPROFLIB_API icS15Fixed16Number icDtoF(icFloatNumber num)
Definition IccUtil.cpp:545
ICCPROFLIB_API bool icMatrixInvert3x3(icFloatNumber *matrix)
Definition IccUtil.cpp:391
@ icEncConvertBadParams
Definition IccEncoding.h:79
@ icEncConvertOk
Definition IccEncoding.h:75
@ icEncConvertMemoryError
Definition IccEncoding.h:80
CIccTag * FindElemOfType(icSignature sig, icTagTypeSignature sigType)
Definition IccTagComposite.cpp:698
icFloatNumber GetElemNumberValue(icSignature sig, icFloatNumber defaultValue=0)
Definition IccTagComposite.cpp:726
virtual icStructSignature GetTagStructType() const
Definition IccTagComposite.h:168
Definition IccCAM.h:85
void SetParameter_Nc(icFloatNumber Nc)
Definition IccCAM.cpp:402
void SetParameter_La(icFloatNumber La)
Definition IccCAM.cpp:375
void SetParameter_F(icFloatNumber F)
Definition IccCAM.cpp:411
void SetParameter_C(icFloatNumber c)
Definition IccCAM.cpp:393
void SetParameter_Yb(icFloatNumber YB)
Definition IccCAM.cpp:384
void SetParameter_WhitePoint(icFloatNumber *whitePoint)
Definition IccCAM.cpp:364
Definition IccMpeBasic.h:249
virtual CIccCurveSetCurve * NewCopy() const
Definition IccMpeBasic.h:254
Definition IccMpeBasic.h:425
bool SetSize(int nNewSize)
Definition IccMpeBasic.cpp:3112
bool SetCurve(int nIndex, icCurveSetCurvePtr newCurve)
Definition IccMpeBasic.cpp:3168
Definition IccMpeBasic.h:600
icFloatNumber * GetMatrix() const
Definition IccMpeBasic.h:618
bool SetSize(icUInt16Number nInputChannels, icUInt16Number nOutputChannels, bool bUseConstants=true)
Definition IccMpeBasic.cpp:4974
virtual CIccMultiProcessElement * NewCopy() const
Definition IccMpeBasic.h:605
Definition IccMpeBasic.h:756
void SetCAM(CIccCamConverter *pCAM)
Definition IccMpeBasic.cpp:6244
static CIccTag * Create(icTagTypeSignature sig)
Definition IccTagBasic.cpp:143
Definition IccTagBasic.h:668
bool SetSize(icUInt32Number nSize, bool bZeroNew=true)
Definition IccTagBasic.cpp:3699
Definition IccTagBasic.h:1058
virtual bool GetValues(icFloatNumber *DstVector, icUInt32Number nStart=0, icUInt32Number nVectorSize=1) const
Definition IccTagBasic.cpp:6528
virtual icUInt32Number GetNumValues() const
Definition IccTagBasic.h:1085
icUInt32Number GetSize() const
Returns the size of the data array.
Definition IccTagBasic.h:1079
Definition IccTagBasic.h:1692
icFloatXYZNumber m_surroundXYZ
Definition IccTagBasic.h:1724
icFloatXYZNumber m_illuminantXYZ
Definition IccTagBasic.h:1723
bool setIlluminant(icIlluminant illumId, const icSpectralRange &illumRange, const icFloatNumber *illum, icFloatNumber illumCCT=0.0f)
Definition IccTagBasic.cpp:11420
Definition IccTagLut.h:221
CIccSegmentedCurve * GetCurve()
Definition IccTagLut.h:239
static CIccMultiProcessElement * Create(icElemTypeSignature sig)
Definition IccTagMPE.cpp:131
Definition IccTagMPE.h:358
virtual void Attach(CIccMultiProcessElement *pElement)
Definition IccTagMPE.cpp:922
void SetChannels(icUInt16Number nInputChannels, icUInt16Number nOutputChannels)
Definition IccTagMPE.h:396

References CIccCamConverter::CIccCamConverter(), CIccTagXYZ::CIccTagXYZ(), CIccTagMultiProcessElement::Attach(), CIccProfile, CIccMultiProcessElement::Create(), CIccTag::Create(), icHeader::date, icDateTimeNumber::day, icHeader::deviceClass, CIccTagStruct::FindElemOfType(), CIccTagSegmentedCurve::GetCurve(), CIccTagStruct::GetElemNumberValue(), CIccMpeMatrix::GetMatrix(), CIccTagFloatNum< T, Tsig >::GetNumValues(), CIccTagFloatNum< T, Tsig >::GetSize(), CIccTagStruct::GetTagStructType(), CIccTagFloatNum< T, Tsig >::GetValues(), icDateTimeNumber::hours, icD50XYZ, icDtoF(), icEncConvertBadParams, icEncConvertMemoryError, icEncConvertOk, icMatrixInvert3x3(), icSigAToB3Tag, icSigBToA3Tag, icSigCeptAmbientWhitePointChromaticityMbr, icSigCeptAmbientWhitePointLuminanceMbr, icSigCeptBluePrimaryXYZMbr, icSigCeptGreenPrimaryXYZMbr, icSigCeptInverseTransferFunctionMbr, icSigCeptLumaChromaMatrixMbr, icSigCeptMediumWhitePointChromaticityMbr, icSigCeptRedPrimaryXYZMbr, icSigCeptTransferFunctionMbr, icSigCeptViewingSurroundMbr, icSigCeptWhitePointChromaticityMbr, icSigCeptWhitePointLuminanceMbr, icSigColorEncodingParamsSruct, icSigCurveSetElemType, icSigCustomToStandardPccTag, icSigDisplayClass, icSigFloat32ArrayType, icSigJabToXYZElemType, icSigMatrixElemType, icSigMediaWhitePointTag, icSigMultiProcessElementType, icSigSegmentedCurveType, icSigSpectralViewingConditionsTag, icSigSpectralViewingConditionsType, icSigStandardToCustomPccTag, icSigXYZToJabElemType, icYxy2XYZVector(), icHeader::illuminant, CIccTagSpectralViewingConditions::m_illuminantXYZ, CIccTagSpectralViewingConditions::m_surroundXYZ, icDateTimeNumber::minutes, icDateTimeNumber::month, CIccSegmentedCurve::NewCopy(), CIccMpeMatrix::NewCopy(), CIccCamConverter::operator=(), CIccTagFloatNum< T, Tsig >::operator[](), CIccTagXYZ::operator[](), icHeader::pcs, icDateTimeNumber::seconds, CIccMpeCAM::SetCAM(), CIccTagMultiProcessElement::SetChannels(), CIccMpeCurveSet::SetCurve(), CIccTagSpectralViewingConditions::setIlluminant(), CIccCamConverter::SetParameter_C(), CIccCamConverter::SetParameter_F(), CIccCamConverter::SetParameter_La(), CIccCamConverter::SetParameter_Nc(), CIccCamConverter::SetParameter_WhitePoint(), CIccCamConverter::SetParameter_Yb(), CIccMpeMatrix::SetSize(), CIccTagXYZ::SetSize(), CIccMpeCurveSet::SetSize(), icXYZNumber::X, icFloatXYZNumber::X, icXYZNumber::Y, icFloatXYZNumber::Y, icDateTimeNumber::year, icXYZNumber::Z, and icFloatXYZNumber::Z.

+ Here is the call graph for this function:

◆ GetHandler()

IIccEncProfileConverter * IIccEncProfileConverter::GetHandler ( )
staticinherited
520{
523 }
525}
static IIccEncProfileConverter * g_pEncProfileConverter
Definition IccEncoding.cpp:517
Definition IccEncoding.cpp:118

References CIccDefaultEncProfileConverter(), and g_pEncProfileConverter.

Referenced by icConvertEncodingProfile().

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

◆ SetEncProfileConverter()

void IIccEncProfileConverter::SetEncProfileConverter ( IIccEncProfileConverter pConverter)
staticinherited
528{
529 if (pConverter) {
532 }
533 g_pEncProfileConverter = pConverter;
534 }
535}

References g_pEncProfileConverter.


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