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

Public Member Functions

 CIccFormulaCurveSegmentXml (icFloatNumber start, icFloatNumber end)
 
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
 
bool ParseXml (xmlNode *pNode, std::string &parseStr)
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 
void SetFunction (icUInt16Number functionType, icUInt8Number num_parameters, icFloatNumber *parameters)
 
icFloatNumber StartPoint ()
 
bool ToXml (std::string &xml, std::string blanks)
 
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

Constructor & Destructor Documentation

◆ CIccFormulaCurveSegmentXml()

CIccFormulaCurveSegmentXml::CIccFormulaCurveSegmentXml ( icFloatNumber  start,
icFloatNumber  end 
)
inline
130: CIccFormulaCurveSegment(start, end) {}
Definition IccMpeBasic.h:133

References CIccFormulaCurveSegment::CIccFormulaCurveSegment().

Referenced by CIccSegmentedCurveXml::ParseXml().

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

Member Function Documentation

◆ Apply()

icFloatNumber CIccFormulaCurveSegment::Apply ( icFloatNumber  v) const
virtualinherited

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
float icFloatNumber
Definition IccDefs.h:101
ICCPROFLIB_API icFloatNumber icMax(icFloatNumber v1, icFloatNumber v2)
Definition IccUtil.cpp:903
icUInt16Number m_nFunctionType
Definition IccMpeBasic.h:158
icUInt16Number m_nShortcutType
Definition IccMpeBasic.h:159
icFloatNumber * m_params
Definition IccMpeBasic.h:160

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

+ Here is the call graph for this function:

◆ Begin()

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

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
icUInt8Number m_nParameters
Definition IccMpeBasic.h:157

References icIsNear(), CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, CIccFormulaCurveSegment::m_nShortcutType, and CIccFormulaCurveSegment::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:172

References CIccFormulaCurveSegment::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 
)
virtualinherited

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
icFloatNumber m_startPoint
Definition IccMpeBasic.h:119
icFloatNumber m_endPoint
Definition IccMpeBasic.h:120

References icIsNear(), CIccCurveSegment::m_endPoint, CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, CIccFormulaCurveSegment::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
inlinevirtualinherited

Implements CIccCurveSegment.

142{ return "CIccFormulaCurveSegment"; }

◆ GetType()

virtual icCurveSegSignature CIccFormulaCurveSegment::GetType ( ) const
inlinevirtualinherited

Implements CIccCurveSegment.

141{ return icSigFormulaCurveSeg; }

References icSigFormulaCurveSeg.

Referenced by CIccFormulaCurveSegment::Write().

+ Here is the caller graph for this function:

◆ NewCopy()

virtual CIccCurveSegment * CIccFormulaCurveSegment::NewCopy ( ) const
inlinevirtualinherited

Implements CIccCurveSegment.

138{ return new CIccFormulaCurveSegment(*this);}

References CIccFormulaCurveSegment::CIccFormulaCurveSegment().

+ Here is the call graph for this function:

◆ ParseXml()

bool CIccFormulaCurveSegmentXml::ParseXml ( xmlNode *  pNode,
std::string &  parseStr 
)
194{
195 xmlAttr *funcType = icXmlFindAttr(pNode, "FunctionType");
196
197 if (!funcType) {
198 parseStr += "Bad FunctionType in Formula Segment\n";
199 return false;
200 }
201
202 m_nReserved2 = atoi(icXmlAttrValue(pNode, "Reserved2"));
203 m_nFunctionType = atoi(icXmlAttrValue(funcType));
204
205
206 switch(m_nFunctionType) {
207 case 0x0000:
208 m_nParameters = 4;
209 break;
210
211 case 0x0001:
212 case 0x0002:
213 case 0x0003:
214 case 0x0004:
215 m_nParameters = 5;
216 break;
217
218 case 0x0005:
219 case 0x0007:
220 m_nParameters = 6;
221 break;
222
223 case 0x0006:
224 m_nParameters = 7;
225 break;
226
227 default:
228 parseStr += "Unsupported FunctionType value in Formula Segment\n";
229 return false;
230 }
231
232 CIccFloatArray args;
233
234 if (!args.ParseArray(pNode->children))
235 return false;
236
237 if (args.GetSize()<m_nParameters)
238 return false;
239
240 if (m_params) {
241 free(m_params);
242 }
243
244 if (m_nParameters) {
246 if (!m_params)
247 return false;
248
249 memcpy(m_params, args.GetBuf(), m_nParameters * sizeof(icFloatNumber));
250 }
251 else
252 m_params = NULL;
253
254 return true;
255}
xmlAttr * icXmlFindAttr(xmlNode *pNode, const char *szAttrName)
Definition IccUtilXml.cpp:669
const char * icXmlAttrValue(xmlAttr *attr, const char *szDefault="")
Definition IccUtilXml.cpp:572
icUInt16Number m_nReserved2
Definition IccMpeBasic.h:156
Definition IccUtilXml.h:145
static bool ParseArray(T *buf, icUInt32Number nBufSize, xmlNode *pNode)
Definition IccUtilXml.cpp:1034
T * GetBuf()
Definition IccUtilXml.h:165
icUInt32Number GetSize()
Definition IccUtilXml.h:166

References CIccXmlArrayType< T, Tsig >::GetBuf(), CIccXmlArrayType< T, Tsig >::GetSize(), icXmlAttrValue(), icXmlAttrValue(), icXmlFindAttr(), CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, CIccFormulaCurveSegment::m_nReserved2, CIccFormulaCurveSegment::m_params, and CIccXmlArrayType< T, Tsig >::ParseArray().

Referenced by CIccSegmentedCurveXml::ParseXml().

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

◆ Read()

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

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
icUInt32Number m_nReserved
Definition IccMpeBasic.h:121
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 CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, CIccCurveSegment::m_nReserved, CIccFormulaCurveSegment::m_nReserved2, CIccFormulaCurveSegment::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 
)
inherited

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 CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, and CIccFormulaCurveSegment::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:

◆ ToXml()

bool CIccFormulaCurveSegmentXml::ToXml ( std::string &  xml,
std::string  blanks 
)
162{
163 char buf[256];
164 char line[256];
165
166 sprintf(line, "<FormulaSegment Start=\"%s\"", icSegPos(buf, m_startPoint));
167 xml += blanks + line;
168
169 sprintf(line, " End=\"%s\"",icSegPos(buf, m_endPoint));
170 xml += line;
171
172 sprintf(line, " FunctionType=\"%d\"", m_nFunctionType);
173 xml += line;
174
175 if (m_nReserved) {
176 sprintf(line, " Reserved=\"%d\"", m_nReserved);
177 xml += line;
178 }
179 if (m_nReserved2) {
180 sprintf(line, " Reserved2=\"%d\"", m_nReserved2);
181 xml += line;
182 }
183 xml += ">\n";
184
186
187 xml += blanks + "</FormulaSegment>\n";
188
189 return true;
190}
@ icConvertFloat
Definition IccXmlConfig.h:70
static char * icSegPos(char *buf, icFloatNumber pos)
Definition IccMpeXml.cpp:136
static bool DumpArray(std::string &xml, std::string blanks, T *buf, icUInt32Number nBufSize, icConvertType nType, icUInt8Number nColumns)
Definition IccUtilXml.cpp:820

References CIccXmlArrayType< T, Tsig >::DumpArray(), icConvertFloat, icSegPos(), CIccCurveSegment::m_endPoint, CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, CIccCurveSegment::m_nReserved, CIccFormulaCurveSegment::m_nReserved2, CIccFormulaCurveSegment::m_params, and CIccCurveSegment::m_startPoint.

Referenced by CIccSegmentedCurveXml::ToXml().

+ Here is the call graph for this function:
+ 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
virtualinherited

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, CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, CIccCurveSegment::m_nReserved, CIccFormulaCurveSegment::m_nReserved2, and CIccFormulaCurveSegment::m_params.

+ Here is the call graph for this function:

◆ Write()

bool CIccFormulaCurveSegment::Write ( CIccIO pIO)
virtualinherited

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 CIccFormulaCurveSegment::GetType(), CIccFormulaCurveSegment::m_nFunctionType, CIccFormulaCurveSegment::m_nParameters, CIccCurveSegment::m_nReserved, CIccFormulaCurveSegment::m_nReserved2, CIccFormulaCurveSegment::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

◆ m_params

◆ m_startPoint


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