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

#include <IccMpeBasic.h>

+ Inheritance diagram for CIccSegmentedCurve:
+ Collaboration diagram for CIccSegmentedCurve:

Public Member Functions

 CIccSegmentedCurve ()
 
 CIccSegmentedCurve (const CIccSegmentedCurve &ITPC)
 
virtual ~CIccSegmentedCurve ()
 
virtual icFloatNumber Apply (icFloatNumber v) const
 
virtual bool Begin (icElemInterp nInterp, CIccTagMultiProcessElement *pMPE)
 
virtual void Describe (std::string &sDescription, int nVerboseness)
 
virtual const icCharGetClassName () const
 
virtual icCurveElemSignature GetType () const
 
bool Insert (CIccCurveSegment *pCurveSegment)
 
virtual CIccCurveSetCurveNewCopy () const
 
CIccSegmentedCurveoperator= (const CIccSegmentedCurve &ParamCurveTag)
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 
void Reset ()
 
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 CIccCurveSetCurveCreate (icCurveElemSignature sig)
 

Protected Attributes

CIccCurveSegmentListm_list
 
icUInt32Number m_nReserved1
 
icUInt32Number m_nReserved2
 

Detailed Description

Class: CIccSegmentedCurve

Purpose: The Curve Set Segmented Curve Type

Constructor & Destructor Documentation

◆ CIccSegmentedCurve() [1/2]

CIccSegmentedCurve::CIccSegmentedCurve ( )

Name: CIccSegmentedCurve::CIccSegmentedCurve

Purpose:

Args:

Return:

2541{
2543 m_nReserved1 = 0;
2544 m_nReserved2 = 0;
2545
2546}
std::list< CIccCurveSegment * > CIccCurveSegmentList
Definition IccMpeBasic.h:239
icUInt32Number m_nReserved2
Definition IccMpeBasic.h:275
CIccCurveSegmentList * m_list
Definition IccMpeBasic.h:273
icUInt32Number m_nReserved1
Definition IccMpeBasic.h:274

References m_list, m_nReserved1, and m_nReserved2.

Referenced by CIccCurveSetCurve::Create(), and CIccTagSegmentedCurve::Read().

+ Here is the caller graph for this function:

◆ CIccSegmentedCurve() [2/2]

CIccSegmentedCurve::CIccSegmentedCurve ( const CIccSegmentedCurve curve)

Name: CIccSegmentedCurve::CIccSegmentedCurve

Purpose:

Args:

Return:

2560{
2561 CIccCurveSegmentList::iterator i;
2562
2564
2565 for (i=curve.m_list->begin(); i!=curve.m_list->end(); i++) {
2566 m_list->push_back((*i)->NewCopy());
2567 }
2568 m_nReserved1 = curve.m_nReserved1;
2569 m_nReserved2 = curve.m_nReserved2;
2570}

References m_list, m_nReserved1, m_nReserved2, and CIccCurveSegment::NewCopy().

Referenced by NewCopy().

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

◆ ~CIccSegmentedCurve()

CIccSegmentedCurve::~CIccSegmentedCurve ( )
virtual

Name: CIccSegmentedCurve::~CIccSegmentedCurve

Purpose:

Args:

Return:

2610{
2611 Reset();
2612 delete m_list;
2613}
void Reset()
Definition IccMpeBasic.cpp:2821

References m_list, and Reset().

+ Here is the call graph for this function:

Member Function Documentation

◆ Apply()

icFloatNumber CIccSegmentedCurve::Apply ( icFloatNumber  v) const
virtual

Name: CIccSegmentedCurve::Apply

Purpose:

Args:

Return:

Implements CIccCurveSetCurve.

2900{
2901 CIccCurveSegmentList::iterator i;
2902
2903 for (i=m_list->begin(); i!=m_list->end(); i++) {
2904 if (v <= (*i)->EndPoint())
2905 return (*i)->Apply(v);
2906 }
2907 return v;
2908}

References CIccCurveSegment::Apply(), CIccCurveSegment::EndPoint(), and m_list.

Referenced by CIccTagSegmentedCurve::Apply().

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

◆ Begin()

bool CIccSegmentedCurve::Begin ( icElemInterp  nInterp,
CIccTagMultiProcessElement pMPE 
)
virtual

Name: CIccSegmentedCurve::Begin

Purpose:

Args:

Return:

Implements CIccCurveSetCurve.

2872{
2873 if (m_list->size()==0)
2874 return false;
2875
2876 CIccCurveSegmentList::iterator i;
2877 CIccCurveSegment *pLast = NULL;
2878
2879 for (i=m_list->begin(); i!=m_list->end(); i++) {
2880 if (!(*i)->Begin(pLast))
2881 return false;
2882 pLast = *i;
2883 }
2884
2885 return true;
2886}
Definition IccMpeBasic.h:95

References CIccCurveSegment::Begin(), and m_list.

Referenced by CIccTagSegmentedCurve::Begin().

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

◆ Create()

CIccCurveSetCurve * CIccCurveSetCurve::Create ( icCurveElemSignature  sig)
staticinherited

Name: CIccCurveSetCurve::Create

Purpose:

Args:

Return:

2961{
2962 switch (sig) {
2964 return new CIccSegmentedCurve();
2966 return new CIccSingleSampledCurve();
2968 return new CIccSampledCalculatorCurve();
2969 default:
2970 return NULL;
2971 }
2972}
@ icSigSegmentedCurve
Definition icProfileHeader.h:1057
@ icSigSampledCalculatorCurve
Definition icProfileHeader.h:1059
@ icSigSingleSampledCurve
Definition icProfileHeader.h:1058
Definition IccMpeBasic.h:249
Definition IccMpeBasic.h:287
Definition IccMpeBasic.h:354

References CIccSampledCalculatorCurve::CIccSampledCalculatorCurve(), CIccSegmentedCurve(), CIccSingleSampledCurve::CIccSingleSampledCurve(), icSigSampledCalculatorCurve, icSigSegmentedCurve, and icSigSingleSampledCurve.

Referenced by CIccMpeCurveSet::Read(), and CIccMpeToneMap::Read().

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

◆ Describe()

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

Name: CIccSegmentedCurve::Describe

Purpose:

Args:

Return:

Implements CIccCurveSetCurve.

2627{
2628 CIccCurveSegmentList::iterator i;
2629
2630 sDescription += "BEGIN_CURVE\n";
2631 for (i=m_list->begin(); i!=m_list->end(); i++) {
2632 (*i)->Describe(sDescription, nVerboseness);
2633 }
2634}

References CIccCurveSegment::Describe(), and m_list.

Referenced by CIccTagSegmentedCurve::Describe().

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

◆ GetClassName()

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

Implements CIccCurveSetCurve.

258{ return "CIccSegmentedCurve"; }

◆ GetType()

virtual icCurveElemSignature CIccSegmentedCurve::GetType ( ) const
inlinevirtual

Implements CIccCurveSetCurve.

257{ return icSigSegmentedCurve; }

References icSigSegmentedCurve.

Referenced by Read(), Validate(), and Write().

+ Here is the caller graph for this function:

◆ Insert()

bool CIccSegmentedCurve::Insert ( CIccCurveSegment pCurveSegment)

Name: CIccSegmentedCurve::Insert

Purpose:

Args:

Return:

2843{
2844 CIccCurveSegmentList::reverse_iterator last = m_list->rbegin();
2845
2846 if (last!=m_list->rend()) {
2847 if (pCurveSegment->StartPoint() == (*last)->EndPoint()) {
2848 m_list->push_back(pCurveSegment);
2849 return true;
2850 }
2851 }
2852 else {
2853 m_list->push_back(pCurveSegment);
2854 return true;
2855 }
2856
2857 return false;
2858}
icFloatNumber StartPoint()
Definition IccMpeBasic.h:115

References CIccCurveSegment::EndPoint(), m_list, and CIccCurveSegment::StartPoint().

+ Here is the call graph for this function:

◆ NewCopy()

virtual CIccCurveSetCurve * CIccSegmentedCurve::NewCopy ( ) const
inlinevirtual

Implements CIccCurveSetCurve.

254{ return new CIccSegmentedCurve(*this);}
CIccSegmentedCurve()
Definition IccMpeBasic.cpp:2540

References CIccSegmentedCurve().

Referenced by CIccTagSegmentedCurve::CIccTagSegmentedCurve(), CIccDefaultEncProfileConverter::ConvertFromParams(), and CIccTagSegmentedCurve::operator=().

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

◆ operator=()

CIccSegmentedCurve & CIccSegmentedCurve::operator= ( const CIccSegmentedCurve curve)

Name: &CIccSegmentedCurve::operator=

Purpose:

Args:

Return:

2584{
2585 Reset();
2586
2587 CIccCurveSegmentList::iterator i;
2588
2589 for (i=curve.m_list->begin(); i!=curve.m_list->end(); i++) {
2590 m_list->push_back((*i)->NewCopy());
2591 }
2592 m_nReserved1 = curve.m_nReserved1;
2593 m_nReserved2 = curve.m_nReserved2;
2594
2595 return (*this);
2596}

References m_list, m_nReserved1, m_nReserved2, CIccCurveSegment::NewCopy(), and Reset().

+ Here is the call graph for this function:

◆ Read()

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

Name: CIccSegmentedCurve::Read

Purpose:

Args:

Return:

Implements CIccCurveSetCurve.

2649{
2651
2652 icUInt32Number startPos = pIO->Tell();
2653
2654 icUInt32Number headerSize = sizeof(icCurveElemSignature) +
2655 sizeof(icUInt32Number) +
2656 sizeof(icUInt16Number) +
2657 sizeof(icUInt16Number);
2658
2659 if (headerSize > size)
2660 return false;
2661
2662 if (!pIO) {
2663 return false;
2664 }
2665
2666 if (!pIO->Read32(&sig))
2667 return false;
2668
2669 if (sig!=GetType())
2670 return false;
2671
2672 if (!pIO->Read32(&m_nReserved1))
2673 return false;
2674
2675 icUInt16Number nSegments;
2676
2677 if (!pIO->Read16(&nSegments))
2678 return false;
2679
2680 if (!pIO->Read16(&m_nReserved2))
2681 return false;
2682
2683 Reset();
2684
2685 icUInt32Number pos = pIO->Tell();
2686 icCurveSegSignature segSig;
2687 CIccCurveSegment *pSeg;
2688
2689 if (nSegments==1) {
2690 if (sizeof(segSig) > size - headerSize)
2691 return false;
2692
2693 if (!pIO->Read32(&segSig))
2694 return false;
2696 if (!pSeg)
2697 return false;
2698
2699 pIO->Seek(pos, icSeekSet);
2700
2701 if (!pSeg->Read(size-(pos-startPos), pIO)) {
2702 delete pSeg;
2703 return false;
2704 }
2705
2706 m_list->push_back(pSeg);
2707 }
2708 else if (nSegments) {
2709 if (nSegments > size - headerSize)
2710 return false;
2711
2712 icFloatNumber *breakpoints=(icFloatNumber*)calloc(nSegments-1, sizeof(icFloatNumber));
2713
2714 if (!breakpoints)
2715 return false;
2716
2717 if (pIO->ReadFloat32Float(breakpoints, nSegments-1)!=nSegments-1) {
2718 free(breakpoints);
2719 return false;
2720 }
2721
2722 int i;
2723 for (i=0; i<nSegments; i++) {
2724 pos = pIO->Tell();
2725 if (!pIO->Read32(&segSig)) {
2726 free(breakpoints);
2727 return false;
2728 }
2729 if (pIO->Seek(pos, icSeekSet)!=(icInt32Number)pos)
2730 return false;;
2731
2732 if (!i)
2733 pSeg = CIccCurveSegment::Create(segSig, icMinFloat32Number, breakpoints[i]);
2734 else if (i==nSegments-1)
2735 pSeg = CIccCurveSegment::Create(segSig, breakpoints[i-1], icMaxFloat32Number);
2736 else
2737 pSeg = CIccCurveSegment::Create(segSig, breakpoints[i-1], breakpoints[i]);
2738
2739 if (!pSeg) {
2740 free(breakpoints);
2741 return false;
2742 }
2743
2744 if (!pSeg->Read(size-(pos-startPos), pIO)) {
2745 delete pSeg;
2746 free(breakpoints);
2747 return false;
2748 }
2749
2750 m_list->push_back(pSeg);
2751 }
2752
2753 free(breakpoints);
2754 }
2755
2756 return true;
2757}
icCurveElemSignature
Definition icProfileHeader.h:1056
unsigned short icUInt16Number
Definition icProfileHeader.h:256
long icInt32Number
Definition icProfileHeader.h:291
icCurveSegSignature
Definition icProfileHeader.h:1045
unsigned long icUInt32Number
Definition icProfileHeader.h:262
#define icMinFloat32Number
Definition icProfileHeader.h:318
#define icMaxFloat32Number
Definition icProfileHeader.h:317
float icFloatNumber
Definition IccDefs.h:101
@ icSeekSet
Definition IccIO.h:83
virtual bool Read(icUInt32Number size, CIccIO *pIO)=0
static CIccCurveSegment * Create(icCurveSegSignature sig, icFloatNumber start, icFloatNumber end)
Definition IccMpeBasic.cpp:2517
virtual icCurveElemSignature GetType() const
Definition IccMpeBasic.h:257
icInt32Number ReadFloat32Float(void *pBufFloat, icInt32Number nNum=1)
Definition IccIO.cpp:302
icInt32Number Read16(void *pBuf16, icInt32Number nNum=1)
Definition IccIO.cpp:114
virtual icInt32Number Tell()
Definition IccIO.h:133
virtual icInt32Number Seek(icInt32Number nOffset, icSeekVal pos)
Definition IccIO.h:132
icInt32Number Read32(void *pBuf32, icInt32Number nNum=1)
Definition IccIO.cpp:143

References CIccCurveSegment::Create(), GetType(), icSeekSet, m_list, m_nReserved1, m_nReserved2, CIccCurveSegment::Read(), CIccIO::Read16(), CIccIO::Read32(), CIccIO::ReadFloat32Float(), Reset(), CIccIO::Seek(), and CIccIO::Tell().

Referenced by CIccTagSegmentedCurve::Read().

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

◆ Reset()

void CIccSegmentedCurve::Reset ( )

Name: CIccSegmentedCurve::Reset

Purpose:

Args:

Return:

2822{
2823 CIccCurveSegmentList::iterator i;
2824
2825 for (i=m_list->begin(); i!=m_list->end(); i++) {
2826 delete (*i);
2827 }
2828 m_list->clear();
2829}

References m_list.

Referenced by ~CIccSegmentedCurve(), operator=(), and Read().

+ Here is the caller graph for this function:

◆ Validate()

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

Name: CIccSegmentedCurve::Validate

Purpose:

Args:

Return:

Implements CIccCurveSetCurve.

2921{
2922 CIccInfo Info;
2923 std::string sSigPathName = Info.GetSigPathName(sigPath);
2924
2926 if (m_nReserved1 || m_nReserved2) {
2927 sReport += icMsgValidateWarning;
2928 sReport += sSigPathName;
2929 sReport += " Segmented curve has non zero reserved data.\n";
2930 rv = icValidateWarning;
2931 }
2932
2933 if (m_list->size()==0) {
2934 sReport += icMsgValidateCriticalError;
2935 sReport += sSigPathName;
2936 sReport += " Has Empty CurveSegment!\n";
2938 }
2939
2940 CIccCurveSegmentList::iterator i;
2941
2942 for (i=m_list->begin(); i!=m_list->end(); i++) {
2943 rv = icMaxStatus(rv, (*i)->Validate(sigPath+icGetSigPath(GetType()), sReport, pMPE, pProfile));
2944 }
2945
2946 return rv;
2947}
icValidateStatus
Definition IccDefs.h:119
@ icValidateOK
Definition IccDefs.h:120
@ icValidateWarning
Definition IccDefs.h:121
@ icValidateCriticalError
Definition IccDefs.h:123
ICCPROFLIB_API std::string icGetSigPath(icUInt32Number sig)
Definition IccUtil.cpp:1191
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(), GetType(), icGetSigPath(), icMaxStatus(), icMsgValidateCriticalError, icMsgValidateWarning, icValidateCriticalError, icValidateOK, icValidateWarning, m_list, m_nReserved1, m_nReserved2, and CIccCurveSegment::Validate().

Referenced by CIccTagSegmentedCurve::Validate().

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

◆ Write()

bool CIccSegmentedCurve::Write ( CIccIO pIO)
virtual

Name: CIccSegmentedCurve::Write

Purpose:

Args:

Return:

Implements CIccCurveSetCurve.

2771{
2773
2774 if (!pIO)
2775 return false;
2776
2777 if (!pIO->Write32(&sig))
2778 return false;
2779
2780 if (!pIO->Write32(&m_nReserved1))
2781 return false;
2782
2783 icUInt16Number nSegments = (icUInt16Number)m_list->size();
2784
2785 if (!pIO->Write16(&nSegments))
2786 return false;
2787
2788 if (!pIO->Write16(&m_nReserved2))
2789 return false;
2790
2791 CIccCurveSegmentList::iterator i;
2792 if (nSegments>1) {
2793 icFloatNumber breakpoint;
2794
2795 i=m_list->begin();
2796 for (i++; i!=m_list->end(); i++) {
2797 breakpoint = (*i)->StartPoint();
2798 if (!pIO->WriteFloat32Float(&breakpoint))
2799 return false;
2800 }
2801 }
2802 for (i=m_list->begin(); i!=m_list->end(); i++) {
2803 if (!(*i)->Write(pIO))
2804 return false;
2805 }
2806
2807 return true;
2808}
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_list, m_nReserved1, m_nReserved2, CIccCurveSegment::StartPoint(), CIccCurveSegment::Write(), CIccIO::Write16(), CIccIO::Write32(), and CIccIO::WriteFloat32Float().

Referenced by CIccTagSegmentedCurve::Write().

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

Field Documentation

◆ m_list

◆ m_nReserved1

icUInt32Number CIccSegmentedCurve::m_nReserved1
protected

◆ m_nReserved2

icUInt32Number CIccSegmentedCurve::m_nReserved2
protected

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