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

#include <IccMpeBasic.h>

+ Inheritance diagram for CIccFormulaCurveSegment:
+ Collaboration diagram for CIccFormulaCurveSegment:

Public Member Functions

 CIccFormulaCurveSegment (const CIccFormulaCurveSegment &seg)
 
 CIccFormulaCurveSegment (icFloatNumber start, icFloatNumber end)
 
virtual ~CIccFormulaCurveSegment ()
 
virtual icFloatNumber Apply (icFloatNumber v) const
 
virtual bool Begin (CIccCurveSegment *pPrevSeg)
 
virtual void Describe (std::string &sDescription, int nVerboseness)
 
icFloatNumber EndPoint ()
 
virtual const icCharGetClassName () const
 
virtual icCurveSegSignature GetType () const
 
virtual CIccCurveSegmentNewCopy () const
 
CIccFormulaCurveSegmentoperator= (const CIccFormulaCurveSegment &seg)
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 
void SetFunction (icUInt16Number functionType, icUInt8Number num_parameters, icFloatNumber *parameters)
 
icFloatNumber StartPoint ()
 
virtual icValidateStatus Validate (std::string sigPath, std::string &sReport, const CIccTagMultiProcessElement *pMPE=NULL, const CIccProfile *pProfile=NULL) const
 
virtual bool Write (CIccIO *pIO)
 

Static Public Member Functions

static CIccCurveSegmentCreate (icCurveSegSignature sig, icFloatNumber start, icFloatNumber end)
 

Protected Attributes

icFloatNumber m_endPoint
 
icUInt16Number m_nFunctionType
 
icUInt8Number m_nParameters
 
icUInt32Number m_nReserved
 
icUInt16Number m_nReserved2
 
icUInt16Number m_nShortcutType
 
icFloatNumberm_params
 
icFloatNumber m_startPoint
 

Detailed Description

Class: CIccTagFormulaCurveSegment

Purpose: The parametric curve segment

Constructor & Destructor Documentation

◆ CIccFormulaCurveSegment() [1/2]

CIccFormulaCurveSegment::CIccFormulaCurveSegment ( icFloatNumber  start,
icFloatNumber  end 
)

Name: CIccFormulaCurveSegment::CIccFormulaCurveSegment

Purpose:

Args:

Return:

101{
102 m_nReserved = 0;
103 m_nReserved2 = 0;
104 m_startPoint = start;
105 m_endPoint = end;
106
107 m_nFunctionType = 0;
108 m_nShortcutType = 0;
109 m_nParameters = 0;
110 m_params = NULL;
111}
icFloatNumber m_startPoint
Definition IccMpeBasic.h:119
icFloatNumber m_endPoint
Definition IccMpeBasic.h:120
icUInt32Number m_nReserved
Definition IccMpeBasic.h:121
icUInt8Number m_nParameters
Definition IccMpeBasic.h:157
icUInt16Number m_nFunctionType
Definition IccMpeBasic.h:158
icUInt16Number m_nReserved2
Definition IccMpeBasic.h:156
icUInt16Number m_nShortcutType
Definition IccMpeBasic.h:159
icFloatNumber * m_params
Definition IccMpeBasic.h:160

References CIccCurveSegment::m_endPoint, m_nFunctionType, m_nParameters, CIccCurveSegment::m_nReserved, m_nReserved2, m_nShortcutType, m_params, and CIccCurveSegment::m_startPoint.

Referenced by CIccFormulaCurveSegmentXml::CIccFormulaCurveSegmentXml(), and CIccCurveSegment::Create().

+ Here is the caller graph for this function:

◆ CIccFormulaCurveSegment() [2/2]

CIccFormulaCurveSegment::CIccFormulaCurveSegment ( const CIccFormulaCurveSegment seg)

Name: CIccFormulaCurveSegment::CIccFormulaCurveSegment

Purpose:

Args:

Return:

124{
129
133
134 if (seg.m_params) {
136 if (m_params)
137 memcpy(m_params, seg.m_params, m_nParameters*sizeof(icFloatNumber));
138 }
139 else
140 m_params = NULL;
141}
float icFloatNumber
Definition IccDefs.h:101

References CIccCurveSegment::m_endPoint, m_nFunctionType, m_nParameters, CIccCurveSegment::m_nReserved, m_nReserved2, m_nShortcutType, m_params, and CIccCurveSegment::m_startPoint.

Referenced by NewCopy().

+ Here is the caller graph for this function:

◆ ~CIccFormulaCurveSegment()

CIccFormulaCurveSegment::~CIccFormulaCurveSegment ( )
virtual

Name: CIccFormulaCurveSegment::~CIccFormulaCurveSegment

Purpose: Releases any dynamic memory associated with the curve segment.

Args: None

Return: None

199{
200 if (m_params) {
201 free(m_params);
202 m_params = nullptr; // Defensive: avoid UAF in case of lingering references
203 }
204}

References m_params.

Member Function Documentation

◆ Apply()

icFloatNumber CIccFormulaCurveSegment::Apply ( icFloatNumber  v) const
virtual

Name: CIccFormulaCurveSegment::Apply

Purpose:

Args:

Return:

Implements CIccCurveSegment.

632{
633 switch (m_nFunctionType) {
634 case 0x0000:
635 //Y = (a * X + b) ^ g + c : g a b c
636 switch (m_nShortcutType) {
637 case 0:
638 default:
639 return (icFloatNumber)(pow(m_params[1] * v + m_params[2], m_params[0]) + m_params[3]);
640 case 1:
641 return (m_params[1] * v);
642 case 2:
643 return (m_params[1] * v + m_params[3]);
644 case 3:
645 return (m_params[1] * v + m_params[2]);
646 case 4:
647 return (m_params[1] * v + m_params[2] + m_params[3]);
648 }
649
650 case 0x0001:
651 // Y = a * log (b * X^g + c) + d : g a b c d
652 return (icFloatNumber)(m_params[1] * log10(m_params[2] * pow(v, m_params[0]) + m_params[3]) + m_params[4]);
653
654 case 0x0002:
655 //Y = a * b^(c*X+d) + e : a b c d e
656 return (icFloatNumber)(m_params[0] * pow(m_params[1], m_params[2] * v + m_params[3]) + m_params[4]);
657
658 case 0x0003:
659 //Y = a * (b * X + c) ^ g + d : g a b c d
660 return (icFloatNumber)(m_params[1] * clipPow(m_params[2] * v + m_params[3], m_params[0]) + m_params[4]);
661
662 case 0x0004:
663 //Y = a * ln(d * X^g - b) + c : g a b c d
664 if (m_nShortcutType != 1)
665 return (icFloatNumber)(m_params[1] * log(m_params[4] * pow(v, m_params[0]) - m_params[2]) + m_params[3]);
666 else
667 return (icFloatNumber)(m_params[1] * log(m_params[4] * v - m_params[2]) + m_params[3]);
668
669 case 0x0005:
670 //Y = e * exp((d * X^g - c) / a) + b : g a b c d e
671 if (m_nShortcutType != 1)
672 return (icFloatNumber)(m_params[5] * exp((m_params[4] * pow(v, m_params[0]) - m_params[3]) / m_params[1]) + m_params[2]);
673 else
674 return (icFloatNumber)(m_params[5] * exp((m_params[4] * v - m_params[3]) / m_params[1]) + m_params[2]);
675
676 case 0x0006:
677 //Y = d * (max(e * X^g - a, 0)/(b - c * X^g))^w : w g a b c d e
678 if (m_nShortcutType!=1) {
679 return (icFloatNumber)(m_params[5] * pow(icMax((icFloatNumber)(m_params[6] * pow(v, m_params[1]) - m_params[2]), 0.0f) /
680 (m_params[3] - m_params[4] * pow(v, m_params[1])), m_params[0]));
681 }
682 else { //m_nShortcutType == 1
683 return (icFloatNumber)(m_params[5] * pow(icMax((icFloatNumber)(m_params[6] * v - m_params[2]), 0.0f) /
684 (m_params[3] - m_params[4] * v), m_params[0]));
685 }
686
687 case 0x0007:
688 //Y = d * ((a + b * X^g)/(1 + c * X^g)) ^ w : w g a b c d
689 if (m_nShortcutType != 1) {
690 return (icFloatNumber)(m_params[5] * pow((m_params[2] + m_params[3] * pow(v, m_params[1])) /
691 (1.0 + m_params[4] * pow(v, m_params[1])), m_params[0]));
692 }
693 else { //m_nShortcutType == 1
694 return (icFloatNumber)(m_params[5] * pow((m_params[2] + m_params[3] * v) /
695 (1.0 + m_params[4] * v), m_params[0]));
696 }
697 }
698
699 //Shouldn't get here!
700 return v;
701}
static icFloatNumber clipPow(double v, double g)
Definition IccMpeBasic.cpp:614
ICCPROFLIB_API icFloatNumber icMax(icFloatNumber v1, icFloatNumber v2)
Definition IccUtil.cpp:903

References clipPow(), icMax(), m_nFunctionType, m_nShortcutType, and m_params.

+ Here is the call graph for this function:

◆ Begin()

bool CIccFormulaCurveSegment::Begin ( CIccCurveSegment pPrevSeg = NULL)
virtual

Name: CIccFormulaCurveSegment::Begin

Purpose:

Args:

Return:

Implements CIccCurveSegment.

525{
526 switch (m_nFunctionType) {
527 case 0x0000:
528 if (!m_params || m_nParameters<4)
529 return false;
530
531 if (icIsNear(m_params[0], 1.0)) { //don't apply gamma
532 if (icIsNear(m_params[2], 0.0) && icIsNear(m_params[3], 0.0))
533 m_nShortcutType = 1;
534 else if (icIsNear(m_params[2], 0.0))
535 m_nShortcutType = 2;
536 else if (icIsNear(m_params[3], 0.0))
537 m_nShortcutType = 3;
538 else
539 m_nShortcutType = 4;
540 }
541 else {
542 m_nShortcutType = 0;
543 }
544
545 return true;
546
547 case 0x0001:
548 if (!m_params || m_nParameters<5)
549 return false;
550
551 return true;
552
553 case 0x0002:
554 case 0x0003:
555 if (!m_params || m_nParameters < 5)
556 return false;
557
558 case 0x0004:
559 if (!m_params || m_nParameters < 5)
560 return false;
561
562 if (icIsNear(m_params[0], 1.0)) { //don't apply gamma
563 m_nShortcutType = 1;
564 }
565 else {
566 m_nShortcutType = 0;
567 }
568 return true;
569
570 case 0x0005:
571 if (!m_params || m_nParameters < 6)
572 return false;
573
574 if (icIsNear(m_params[0], 1.0)) { //don't apply gamma
575 m_nShortcutType = 1;
576 }
577 else {
578 m_nShortcutType = 0;
579 }
580 return true;
581
582 case 0x0006:
583 if (!m_params || m_nParameters < 7)
584 return false;
585
586 if (icIsNear(m_params[1], 1.0)) { //don't apply gamma
587 m_nShortcutType = 1;
588 }
589 else {
590 m_nShortcutType = 0;
591 }
592 return true;
593
594 case 0x0007:
595 if (!m_params || m_nParameters < 6)
596 return false;
597
598 if (icIsNear(m_params[1], 1.0)) { //don't apply gamma
599 m_nShortcutType = 1;
600 }
601 else {
602 m_nShortcutType = 0;
603 }
604 return true;
605
606
607 default:
608 return false;
609 }
610
611 return true;
612}
ICCPROFLIB_API bool icIsNear(icFloatNumber v1, icFloatNumber v2, icFloatNumber nearRange=1.0e-8)
Definition IccUtil.cpp:142

References icIsNear(), m_nFunctionType, m_nParameters, m_nShortcutType, and m_params.

+ Here is the call graph for this function:

◆ Create()

CIccCurveSegment * CIccCurveSegment::Create ( icCurveSegSignature  sig,
icFloatNumber  start,
icFloatNumber  end 
)
staticinherited

Name: CIccCurveSegment::Create

Purpose:

Args:

Return:

2518{
2519 switch(sig) {
2521 return new CIccFormulaCurveSegment(start, end);
2523 return new CIccSampledCurveSegment(start, end);
2524 default:
2525 return NULL;
2526 }
2527
2528}
@ icSigSampledCurveSeg
Definition icProfileHeader.h:1047
@ icSigFormulaCurveSeg
Definition icProfileHeader.h:1046
Definition IccMpeBasic.h:133
Definition IccMpeBasic.h:172

References CIccFormulaCurveSegment(), CIccSampledCurveSegment::CIccSampledCurveSegment(), icSigFormulaCurveSeg, and icSigSampledCurveSeg.

Referenced by CIccSegmentedCurve::Read().

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

◆ Describe()

void CIccFormulaCurveSegment::Describe ( std::string &  sDescription,
int  nVerboseness 
)
virtual

Name: CIccFormulaCurveSegment::Describe

Purpose:

Args:

Return:

Implements CIccCurveSegment.

217{
218 icChar buf[256];
219
220 sDescription += "Segment [";
222 sDescription += "-Infinity, ";
223 else {
224 sprintf(buf, "%.8f, ", m_startPoint);
225 sDescription += buf;
226 }
228 sDescription += "+Infinity";
229 else {
230 sprintf(buf, "%.8f", m_endPoint);
231 sDescription += buf;
232 }
233 sprintf(buf, "]\nFunctionType: %04Xh\n", m_nFunctionType);
234 sDescription += buf;
235
236 switch(m_nFunctionType) {
237 case 0x0000:
238 if (icIsNear(m_params[1], 0.0) && icIsNear(m_params[2], 0.0))
239 sprintf(buf, "Y = %.8f\n\n", m_params[3]);
240 else if (icIsNear(m_params[0], 1.0) && icIsNear(m_params[1], 1.0) &&
241 icIsNear(m_params[2], 0.0) && icIsNear(m_params[3], 0.0))
242 sprintf(buf, "Y = X\n\n");
243 else if (icIsNear(m_params[0], 1.0) && icIsNear(m_params[2], 0.0))
244 sprintf(buf, "Y = %.8f * X + %.8f\n\n",
245 m_params[1], m_params[3]);
246 else
247 sprintf(buf, "Y = (%.8f * X + %.8f)^%.4f + %.8f\n\n",
248 m_params[1], m_params[2], m_params[0], m_params[3]);
249 sDescription += buf;
250 return;
251
252 case 0x0001:
253 sprintf(buf, "Y = %.8f * log (%.8f * (X ^ %.8f) + %.8f) + %.8f\n\n",
254 m_params[1], m_params[2], m_params[0], m_params[3], m_params[4]);
255 sDescription += buf;
256 return;
257
258 case 0x0002:
259 sprintf(buf, "Y = %.8f * (%.8f ^ (%.8f * X + %.8f)) + %.8f\n\n",
260 m_params[0], m_params[1], m_params[2], m_params[3], m_params[4]);
261 sDescription += buf;
262 return;
263
264 case 0x0003:
265 if (icIsNear(m_params[1],0.0) && icIsNear(m_params[2], 0.0))
266 sprintf(buf, "Y = %.8f\n\n", m_params[3]);
267 else if (icIsNear(m_params[0], 1.0) && icIsNear(m_params[1], 1.0) &&
268 icIsNear(m_params[2], 1.0) && icIsNear(m_params[3], 0.0) &&
269 icIsNear(m_params[4], 0.0))
270 sprintf(buf, "Y = X\n\n");
271 else if (icIsNear(m_params[0], 1.0) && icIsNear(m_params[1], 1.0) &&
272 icIsNear(m_params[3], 0.0))
273 sprintf(buf, "Y = %.8f * X + %.8f\n\n",
274 m_params[2], m_params[3]);
275 else if (icIsNear(m_params[0], 1.0) && icIsNear(m_params[2], 1.0) &&
276 icIsNear(m_params[3], 0.0))
277 sprintf(buf, "Y = %.8f * X + %.8f\n\n",
278 m_params[1], m_params[3]);
279 else
280 sprintf(buf, "Y = %8f * (%.8f * X + %.8f)^%.4f + %.8f\n\n",
281 m_params[1], m_params[2], m_params[3], m_params[0], m_params[4]);
282 sDescription += buf;
283 return;
284
285 case 0x0004:
286 if (!icIsNear(m_params[0], 1.0))
287 sprintf(buf, "Y = %.8f * ln(%.8f * X^%8.f - %.8f) + %.8f\n\n",
288 m_params[1], m_params[4], m_params[0], m_params[2], m_params[3]);
289 else
290 sprintf(buf, "Y = %.8f * ln(%.8f * X - %.8f) + %.8f\n\n",
291 m_params[1], m_params[4], m_params[2], m_params[3]);
292
293 sDescription += buf;
294 return;
295
296 case 0x0005:
297 if (!icIsNear(m_params[0], 1.0))
298 sprintf(buf, "Y = %.8f * exp((%.8f * X^%.8f - %.8f) / %.8f) + %.8f\n\n",
299 m_params[5], m_params[4], m_params[0], m_params[3], m_params[1], m_params[2]);
300 else
301 sprintf(buf, "Y = %.8f * exp((%.8f * X - %.8f) / %.8f) + %.8f\n\n",
302 m_params[5], m_params[4], m_params[3], m_params[1], m_params[2]);
303
304 sDescription += buf;
305 return;
306
307 case 0x0006:
308 if (!icIsNear(m_params[1], 1.0))
309 sprintf(buf, "Y = %.8f * (max[(%.8f * X^%.8f - %.8f), 0] / (%.8f - %.8f * X^%.8f))^%.8f\n\n",
310 m_params[5], m_params[6], m_params[1], m_params[2], m_params[3], m_params[4], m_params[1], m_params[0]);
311 else
312 sprintf(buf, "Y = %.8f * (max[(%.8f * X - %.8f), 0] / (%.8f - %.8f * X))^%.8f\n\n",
313 m_params[5], m_params[6], m_params[2], m_params[3], m_params[4], m_params[0]);
314 sDescription += buf;
315 return;
316
317 case 0x0007:
318 if (!icIsNear(m_params[1], 1.0))
319 sprintf(buf, "Y = %.8f * ((%.8f + %.8f * X^%.8f) / (1 + %.8f * X^%.8f))^%.8f\n\n",
320 m_params[5], m_params[2], m_params[3], m_params[1], m_params[4], m_params[1], m_params[0]);
321 else
322 sprintf(buf, "Y = %.8f * ((%.8f + %.8f * X) / (1 + %.8f * X))^%.8f\n\n",
323 m_params[5], m_params[2], m_params[3], m_params[4], m_params[0]);
324 sDescription += buf;
325 return;
326
327 default:
328 int i;
329 sprintf(buf, "Unknown Function with %d parameters:\n\n", m_nParameters);
330 sDescription += buf;
331
332 for (i=0; i<m_nParameters; i++) {
333 sprintf(buf, "Param[%d] = %.8lf\n\n", i, m_params[i]);
334 sDescription += buf;
335 }
336 }
337}
#define icMinFloat32Number
Definition icProfileHeader.h:318
#define icMaxFloat32Number
Definition icProfileHeader.h:317
char icChar
Definition IccDefs.h:110

References icIsNear(), CIccCurveSegment::m_endPoint, m_nFunctionType, m_nParameters, m_params, and CIccCurveSegment::m_startPoint.

+ Here is the call graph for this function:

◆ EndPoint()

icFloatNumber CIccCurveSegment::EndPoint ( )
inlineinherited
116{ return m_endPoint;}

References CIccCurveSegment::m_endPoint.

Referenced by CIccSegmentedCurve::Apply(), and CIccSegmentedCurve::Insert().

+ Here is the caller graph for this function:

◆ GetClassName()

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

Implements CIccCurveSegment.

142{ return "CIccFormulaCurveSegment"; }

◆ GetType()

virtual icCurveSegSignature CIccFormulaCurveSegment::GetType ( ) const
inlinevirtual

Implements CIccCurveSegment.

141{ return icSigFormulaCurveSeg; }

References icSigFormulaCurveSeg.

Referenced by Write().

+ Here is the caller graph for this function:

◆ NewCopy()

virtual CIccCurveSegment * CIccFormulaCurveSegment::NewCopy ( ) const
inlinevirtual

Implements CIccCurveSegment.

138{ return new CIccFormulaCurveSegment(*this);}

References CIccFormulaCurveSegment().

+ Here is the call graph for this function:

◆ operator=()

CIccFormulaCurveSegment & CIccFormulaCurveSegment::operator= ( const CIccFormulaCurveSegment seg)

Name: &CIccFormulaCurveSegment::operator=

Purpose:

Args:

Return:

154{
155 if (this == &seg)
156 return *this;
157
158 if (m_params) {
159 free(m_params);
160 m_params = nullptr;
161 }
162
170
171 if (seg.m_params && m_nParameters > 0) {
173 if (m_params)
174 memcpy(m_params, seg.m_params, m_nParameters * sizeof(icFloatNumber));
175 else
176 m_nParameters = 0; // fallback safety
177 }
178 else {
179 m_params = nullptr;
180 }
181
182 return *this;
183}

References CIccCurveSegment::m_endPoint, m_nFunctionType, m_nParameters, CIccCurveSegment::m_nReserved, m_nReserved2, m_nShortcutType, m_params, and CIccCurveSegment::m_startPoint.

◆ Read()

bool CIccFormulaCurveSegment::Read ( icUInt32Number  size,
CIccIO pIO 
)
virtual

Name: CIccFormulaCurveSegment::Read

Purpose:

Args:

Return:

Implements CIccCurveSegment.

378{
380
381 icUInt32Number headerSize = sizeof(icTagTypeSignature) +
382 sizeof(icUInt32Number) +
383 sizeof(icUInt16Number) +
384 sizeof(icUInt16Number);
385
386 if (headerSize > size)
387 return false;
388
389 if (!pIO) {
390 return false;
391 }
392
393 if (!pIO->Read32(&sig))
394 return false;
395
396 if (!pIO->Read32(&m_nReserved))
397 return false;
398
399 if (!pIO->Read16(&m_nFunctionType))
400 return false;
401
402 if (!pIO->Read16(&m_nReserved2))
403 return false;
404
405 if (m_params) {
406 free(m_params);
407 m_params = NULL;
408 }
409
410 switch(m_nFunctionType) {
411 case 0x0000:
412 m_nParameters = 4;
413 break;
414
415 case 0x0001:
416 case 0x0002:
417 case 0x0003:
418 case 0x0004:
419 m_nParameters = 5;
420 break;
421
422 case 0x0005:
423 case 0x0007:
424 m_nParameters = 6;
425 break;
426
427 case 0x0006:
428 m_nParameters = 7;
429 break;
430
431 default:
432 return false;
433 }
434
435 if (m_nParameters) {
436
438 if (!m_params)
439 return false;
440
442 return false;
443 }
444 }
445 else
446 m_params = NULL;
447
448 return true;
449}
unsigned short icUInt16Number
Definition icProfileHeader.h:256
icCurveSegSignature
Definition icProfileHeader.h:1045
unsigned long icUInt32Number
Definition icProfileHeader.h:262
icTagTypeSignature
Definition icProfileHeader.h:526
icInt32Number ReadFloat32Float(void *pBufFloat, icInt32Number nNum=1)
Definition IccIO.cpp:302
icInt32Number Read16(void *pBuf16, icInt32Number nNum=1)
Definition IccIO.cpp:114
icInt32Number Read32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:143

References m_nFunctionType, m_nParameters, CIccCurveSegment::m_nReserved, m_nReserved2, m_params, CIccIO::Read16(), CIccIO::Read32(), and CIccIO::ReadFloat32Float().

+ Here is the call graph for this function:

◆ SetFunction()

void CIccFormulaCurveSegment::SetFunction ( icUInt16Number  functionType,
icUInt8Number  num_parameters,
icFloatNumber parameters 
)

Name: CIccFormulaCurveSegment::SetFunction

Purpose:

Args:

Return:

351{
352 if (m_params)
353 free(m_params);
354
355 if (num_parameters) {
356 m_params = (icFloatNumber*)malloc(num_parameters * sizeof(icFloatNumber));
357 if (m_params)
358 memcpy(m_params, parameters, num_parameters * sizeof(icFloatNumber));
359 }
360 else
361 m_params = NULL;
362
363 m_nFunctionType = functionType;
364 m_nParameters = num_parameters;
365}

References m_nFunctionType, m_nParameters, and m_params.

◆ StartPoint()

icFloatNumber CIccCurveSegment::StartPoint ( )
inlineinherited
115{ return m_startPoint; }

References CIccCurveSegment::m_startPoint.

Referenced by CIccSegmentedCurve::Insert(), and CIccSegmentedCurve::Write().

+ Here is the caller graph for this function:

◆ Validate()

icValidateStatus CIccFormulaCurveSegment::Validate ( std::string  sigPath,
std::string &  sReport,
const CIccTagMultiProcessElement pMPE = NULL,
const CIccProfile pProfile = NULL 
) const
virtual

Name: CIccFormulaCurveSegment::Validate

Purpose:

Args:

Return:

Implements CIccCurveSegment.

714{
715 CIccInfo Info;
716 std::string sSigPathName = Info.GetSigPathName(sigPath);
717
719 if (m_nReserved || m_nReserved2) {
720 sReport += icMsgValidateWarning;
721 sReport += sSigPathName;
722 sReport += " formula curve has non zero reserved data.\n";
724 }
725
726 switch (m_nFunctionType) {
727 case 0x0000:
728 if (!m_params || m_nParameters<4) {
730 sReport += sSigPathName;
731 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
733 }
734 else if (m_nParameters > 4) {
735 sReport += icMsgValidateWarning;
736 sReport += sSigPathName;
737 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
739 }
740 break;
741
742 case 0x0001:
743 if (!m_params || m_nParameters<5) {
745 sReport += sSigPathName;
746 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
748 }
749 else if (m_nParameters > 5) {
750 sReport += icMsgValidateWarning;
751 sReport += sSigPathName;
752 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
754 }
755 break;
756
757 case 0x0002:
758 if (!m_params || m_nParameters<5) {
760 sReport += sSigPathName;
761 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
763 }
764 else if (m_nParameters > 5) {
765 sReport += icMsgValidateWarning;
766 sReport += sSigPathName;
767 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
769 }
770 break;
771
772 case 0x0003:
773 if (!m_params || m_nParameters<5) {
775 sReport += sSigPathName;
776 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
778 }
779 else if (m_nParameters > 5) {
780 sReport += icMsgValidateWarning;
781 sReport += sSigPathName;
782 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
784 }
785 break;
786
787 case 0x0004:
788 if (!m_params || m_nParameters < 5) {
790 sReport += sSigPathName;
791 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
793 }
794 else if (m_nParameters > 5) {
795 sReport += icMsgValidateWarning;
796 sReport += sSigPathName;
797 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
799 }
800 break;
801
802 case 0x0005:
803 if (!m_params || m_nParameters < 6) {
805 sReport += sSigPathName;
806 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
808 }
809 else if (m_nParameters > 6) {
810 sReport += icMsgValidateWarning;
811 sReport += sSigPathName;
812 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
814 }
815 break;
816
817 case 0x0006:
818 if (!m_params || m_nParameters < 6) {
820 sReport += sSigPathName;
821 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
823 }
824 else if (m_nParameters > 6) {
825 sReport += icMsgValidateWarning;
826 sReport += sSigPathName;
827 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
829 }
830 break;
831
832 case 0x0007:
833 if (!m_params || m_nParameters < 6) {
835 sReport += sSigPathName;
836 sReport += " formula curve has Invalid formulaCurveSegment parameters.\n";
838 }
839 else if (m_nParameters > 6) {
840 sReport += icMsgValidateWarning;
841 sReport += sSigPathName;
842 sReport += " formula curve has too many formulaCurveSegment parameters.\n";
844 }
845 break;
846
847 default:
848 {
849 icChar buf[128];
851 sReport += sSigPathName;
852 sprintf(buf, " formula curve uses unknown formulaCurveSegment function type %d\n", m_nFunctionType);
853 sReport += buf;
855 }
856 }
857
858 return rv;
859}
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
ICCPROFLIB_API icValidateStatus icMaxStatus(icValidateStatus s1, icValidateStatus s2)
Definition IccUtil.cpp:244
Definition IccUtil.h:303
std::string GetSigPathName(std::string sigPath)
Definition IccUtil.cpp:1614

References CIccInfo::GetSigPathName(), icMaxStatus(), icMsgValidateCriticalError, icMsgValidateWarning, icValidateCriticalError, icValidateOK, icValidateWarning, m_nFunctionType, m_nParameters, CIccCurveSegment::m_nReserved, m_nReserved2, and m_params.

+ Here is the call graph for this function:

◆ Write()

bool CIccFormulaCurveSegment::Write ( CIccIO pIO)
virtual

Name: CIccFormulaCurveSegment::Write

Purpose:

Args:

Return:

Implements CIccCurveSegment.

462{
464
465 if (!pIO)
466 return false;
467
468 if (!pIO->Write32(&sig))
469 return false;
470
471 if (!pIO->Write32(&m_nReserved))
472 return false;
473
474 if (!pIO->Write16(&m_nFunctionType))
475 return false;
476
477 if (!pIO->Write16(&m_nReserved2))
478 return false;
479
480 switch(m_nFunctionType) {
481 case 0x0000:
482 if (m_nParameters!=4)
483 return false;
484 break;
485
486 case 0x0001:
487 case 0x0002:
488 case 0x0003:
489 case 0x0004:
490 if (m_nParameters!=5)
491 return false;
492 break;
493
494 case 0x0005:
495 case 0x0007:
496 if (m_nParameters != 6)
497 return false;
498 break;
499
500 case 0x0006:
501 if (m_nParameters != 7)
502 return false;
503 break;
504 }
505
506 if (m_nParameters) {
508 return false;
509 }
510
511 return true;
512}
virtual icCurveSegSignature GetType() const
Definition IccMpeBasic.h:141
icInt32Number Write16(void *pBuf16, icInt32Number nNum=1)
Definition IccIO.cpp:122
icInt32Number Write32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:152
icInt32Number WriteFloat32Float(void *pBufFloat, icInt32Number nNum=1)
Definition IccIO.cpp:321

References GetType(), m_nFunctionType, m_nParameters, CIccCurveSegment::m_nReserved, m_nReserved2, m_params, CIccIO::Write16(), CIccIO::Write32(), and CIccIO::WriteFloat32Float().

+ Here is the call graph for this function:

Field Documentation

◆ m_endPoint

◆ m_nFunctionType

◆ m_nParameters

◆ m_nReserved

◆ m_nReserved2

◆ m_nShortcutType

icUInt16Number CIccFormulaCurveSegment::m_nShortcutType
protected

◆ m_params

◆ m_startPoint


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