Hoyt's FORK of DemoIccMAX 2.1.17.hoyt
Documentation for Hoyt's FORK of DemoIccMAX
Loading...
Searching...
No Matches
CIccTagXmlCurve Class Reference

#include <IccTagXml.h>

+ Inheritance diagram for CIccTagXmlCurve:
+ Collaboration diagram for CIccTagXmlCurve:

Public Member Functions

virtual const char * GetClassName () const
 
virtual IIccExtensionTagGetExtension ()
 
virtual bool ParseXml (xmlNode *pNode, icConvertType nType, std::string &parseStr)
 
virtual bool ParseXml (xmlNode *pNode, std::string &parseStr)
 
virtual bool ToXml (std::string &xml, icConvertType nType, std::string blanks="")
 
virtual bool ToXml (std::string &xml, std::string blanks="")
 
virtual ~CIccTagXmlCurve ()
 
- Public Member Functions inherited from CIccTagCurve
virtual icFloatNumber Apply (icFloatNumber v) const
 Name: CIccTagCurve::Apply.
 
virtual void Begin ()
 
 CIccTagCurve (const CIccTagCurve &ITCurve)
 Name: CIccTagCurve::CIccTagCurve.
 
 CIccTagCurve (int nSize=0)
 Name: CIccTagCurve::CIccTagCurve.
 
virtual void Describe (std::string &sDescription, int nVerboseness)
 Name: CIccTagCurve::Describe.
 
virtual void DumpLut (std::string &sDescription, const icChar *szName, icColorSpaceSignature csSig, int nIndex, int nVerboseness)
 Name: CIccTagCurve::DumpLut.
 
icFloatNumberGetData (icUInt32Number index)
 
icUInt32Number GetSize () const
 
virtual icTagTypeSignature GetType () const
 Function: GetType()
 
virtual bool IsIdentity ()
 Name: CIccTagCurve::IsIdentity.
 
virtual CIccTagNewCopy () const
 Function: NewCopy(sDescription) Each derived tag will implement it's own NewCopy() function.
 
CIccTagCurveoperator= (const CIccTagCurve &CurveTag)
 Name: CIccTagCurve::operator=.
 
icFloatNumberoperator[] (icUInt32Number index)
 
virtual bool Read (icUInt32Number size, CIccIO *pIO)
 Name: CIccTagCurve::Read.
 
bool SetGamma (icFloatNumber gamma)
 Name: refIccMAX::CIccTagCurve::SetGamma.
 
bool SetSize (icUInt32Number nSize, icTagCurveSizeInit nSizeOpt=icInitZero)
 Name: CIccTagCurve::SetSize.
 
virtual icValidateStatus Validate (std::string sigPath, std::string &sReport, const CIccProfile *pProfile=NULL) const
 Name: CIccTagCurve::Validate.
 
virtual bool Write (CIccIO *pIO)
 Name: CIccTagCurve::Write.
 
virtual ~CIccTagCurve ()
 Name: CIccTagCurve::~CIccTagCurve.
 
- Public Member Functions inherited from CIccCurve
 CIccCurve ()
 
icFloatNumber Find (icFloatNumber v)
 
virtual ~CIccCurve ()
 
- Public Member Functions inherited from CIccTag
 CIccTag ()
 Name: CIccTag::CIccTag.
 
virtual void DetachIO ()
 Function: ReadAll() - Read All sub data for tag from file.
 
virtual icArraySignature GetTagArrayType () const
 
virtual icStructSignature GetTagStructType () const
 
virtual bool IsArrayType ()
 
virtual bool IsMBBType ()
 
virtual bool IsNumArrayType () const
 
virtual bool IsSupported ()
 Function: IsSupported(size, pIO) - Check if tag fully supported for apply purposes.
 
virtual bool Read (icUInt32Number size, CIccIO *pIO, CIccProfile *pProfile)
 Function: Read(size, pIO) - Read tag from file.
 
virtual bool ReadAll ()
 Function: ReadAll() - Read All sub data for tag from file.
 
virtual ~CIccTag ()
 Name: CIccTag::CIccTag.
 
- Public Member Functions inherited from CIccCurveXml
virtual const char * GetExtDerivedClassName () const
 
virtual ~CIccCurveXml ()
 
- Public Member Functions inherited from CIccTagXml
virtual const char * GetExtClassName () const
 
virtual ~CIccTagXml (void)
 

Additional Inherited Members

- Static Public Member Functions inherited from CIccTag
static CIccTagCreate (icTagTypeSignature sig)
 Name: CIccTag::Create.
 
- Public Attributes inherited from CIccTag
icUInt32Number m_nReserved
 
- Protected Member Functions inherited from CIccCurve
icFloatNumber Find (icFloatNumber v, icFloatNumber p0, icFloatNumber v0, icFloatNumber p1, icFloatNumber v1)
 Name: CIccCurve::Find.
 
- Protected Attributes inherited from CIccTagCurve
icFloatNumberm_Curve
 
icUInt16Number m_nMaxIndex
 
icUInt32Number m_nSize
 

Detailed Description

Definition at line 498 of file IccTagXml.h.

Constructor & Destructor Documentation

◆ ~CIccTagXmlCurve()

virtual CIccTagXmlCurve::~CIccTagXmlCurve ( )
inlinevirtual

Definition at line 501 of file IccTagXml.h.

501{}

Member Function Documentation

◆ GetClassName()

virtual const char * CIccTagXmlCurve::GetClassName ( ) const
inlinevirtual

Reimplemented from CIccTagCurve.

Definition at line 503 of file IccTagXml.h.

503{return "CIccTagXmlCurve"; }

◆ GetExtension()

virtual IIccExtensionTag * CIccTagXmlCurve::GetExtension ( )
inlinevirtual

Reimplemented from CIccTag.

Definition at line 505 of file IccTagXml.h.

505{return this; }

◆ ParseXml() [1/2]

bool CIccTagXmlCurve::ParseXml ( xmlNode * pNode,
icConvertType nType,
std::string & parseStr )
virtual

Implements CIccCurveXml.

Definition at line 2570 of file IccTagXml.cpp.

2571{
2572 xmlNode *pCurveNode;
2573 pCurveNode = icXmlFindNode(pNode, "Curve");
2574
2575 if(pCurveNode){
2576 const char *filename = icXmlAttrValue(pCurveNode, "File");
2577
2578 // file exists
2579 if (filename[0]) {
2580 CIccIO *file = IccOpenFileIO(filename, "rb");
2581 if (!file){
2582 parseStr += "Error! - File '";
2583 parseStr += filename;
2584 parseStr +="' not found.\n";
2585 delete file;
2586 return false;
2587 }
2588
2589 const char *format = icXmlAttrValue(pCurveNode, "Format");
2590
2591 // format is text
2592 if (!strcmp(format, "text")) {
2593 icUInt32Number num = file->GetLength();
2594 char *buf = (char *) new char[num];
2595
2596 if (!buf) {
2597 perror("Memory Error");
2598 parseStr += "'";
2599 parseStr += filename;
2600 parseStr += "' may not be a valid text file.\n";
2601 free(buf);
2602 delete file;
2603 return false;
2604 }
2605
2606 if (file->Read8(buf, num) !=num) {
2607 perror("Read-File Error");
2608 parseStr += "'";
2609 parseStr += filename;
2610 parseStr += "' may not be a valid text file.\n";
2611 free(buf);
2612 delete file;
2613 return false;
2614 }
2615
2616 // lut8type
2617 if (nType == icConvert8Bit) {
2618 CIccUInt8Array data;
2619
2620 //if (!data.ParseTextArray(buf)) {
2621 if (!data.ParseTextArrayNum(buf, num, parseStr)){
2622 parseStr += "File '";
2623 parseStr += filename;
2624 parseStr += "' is not a valid text file.\n";
2625 SetSize(0);
2626 free(buf);
2627 delete file;
2628 return false;
2629 }
2630
2631 else {
2632 SetSize(data.GetSize());
2633 icUInt8Number *src = data.GetBuf();
2634 icFloatNumber *dst = GetData(0);
2635
2637 for (i=0; i<data.GetSize(); i++) {
2638 *dst = (icFloatNumber)(*src) / 255.0f;
2639 dst++;
2640 src++;
2641 }
2642
2643 //if (i!=256) {
2644 //printf("Error! - Input/Output table does not have 256 entries.\n");
2645 //SetSize(0);
2646 //return false;
2647 //}
2648 delete file;
2649 return true;
2650 }
2651 }
2652
2653 //lut16type
2654 else if (nType == icConvert16Bit || nType == icConvertVariable) {
2655 CIccUInt16Array data;
2656
2657 //if (!data.ParseTextArray(buf)) {
2658 if (!data.ParseTextArrayNum(buf, num, parseStr)){
2659 parseStr += "File '";
2660 parseStr += filename;
2661 parseStr += "' is not a valid text file.\n";
2662 SetSize(0);
2663 free(buf);
2664 delete file;
2665 return false;
2666 }
2667
2668 else {
2669 SetSize(data.GetSize());
2670
2671 icUInt16Number *src = data.GetBuf();
2672 icFloatNumber *dst = GetData(0);
2673
2675 for (i=0; i<data.GetSize(); i++) {
2676 *dst = (icFloatNumber)(*src) / 65535.0f;
2677 dst++;
2678 src++;
2679 }
2680 }
2681 delete file;
2682 return true;
2683 }
2684
2685 //float type
2686 else if (nType == icConvertFloat){
2687 CIccFloatArray data;
2688
2689 //if (!data.ParseTextArray(buf)) {
2690 if (!data.ParseTextArrayNum(buf, num, parseStr)){
2691 parseStr += "File '";
2692 parseStr += filename;
2693 parseStr += "' is not a valid text file.\n";
2694 SetSize(0);
2695 free(buf);
2696 delete file;
2697 return false;
2698 }
2699
2700 else {
2701 SetSize(data.GetSize());
2702 icFloatNumber *src = data.GetBuf();
2703 icFloatNumber *dst = GetData(0);
2704
2706 for (i=0; i<data.GetSize(); i++) {
2707 *dst = *src;
2708 dst++;
2709 src++;
2710 }
2711 }
2712 delete file;
2713 return true;
2714 }
2715 else {
2716 delete file;
2717 return false;
2718 }
2719 }
2720 // format is binary
2721 else if (!strcmp(format, "binary")) {
2722 const char *order = icXmlAttrValue(pCurveNode, "Endian");
2723 bool little_endian = !strcmp(order, "little");
2724
2725 if (nType == icConvert8Bit){
2726 icUInt32Number num = file->GetLength();
2727 icUInt8Number value;
2728
2729 SetSize(num);
2730 icFloatNumber *dst = GetData(0);
2732 for (i=0; i<num; i++) {
2733 if (!file->Read8(&value)) {
2734 perror("Read-File Error");
2735 parseStr += "'";
2736 parseStr += filename;
2737 parseStr += "' may not be a valid binary file.\n";
2738 delete file;
2739 return false;
2740 }
2741 *dst++ = (icFloatNumber)value / 255.0f;
2742 }
2743 delete file;
2744 return true;
2745 }
2746 else if (nType == icConvert16Bit || nType == icConvertVariable){
2747 icUInt32Number num = file->GetLength() / sizeof(icUInt16Number);
2748 icUInt16Number value;
2749 icUInt8Number *ptr = (icUInt8Number*)&value;
2750
2751 SetSize(num);
2752 icFloatNumber *dst = GetData(0);
2754 for (i=0; i<num; i++) {
2755 if (!file->Read16(&value)) { //this assumes data is big endian
2756 perror("Read-File Error");
2757 parseStr += "'";
2758 parseStr += filename;
2759 parseStr += "' may not be a valid binary file.\n";
2760 delete file;
2761 return false;
2762 }
2763#ifdef ICC_BYTE_ORDER_LITTLE_ENDIAN
2764 if (little_endian) {
2765#else
2766 if (!little_endian) {
2767#endif
2768 icUInt8Number t = ptr[0];
2769 ptr[0] = ptr[1];
2770 ptr[1] = t;
2771 }
2772 *dst++ = (icFloatNumber)value / 65535.0f;
2773 }
2774 delete file;
2775 return true;
2776 }
2777 else if (nType == icConvertFloat) {
2778 icUInt32Number num = file->GetLength()/sizeof(icFloat32Number);
2779 icFloat32Number value;
2780 icUInt8Number *ptr = (icUInt8Number*)&value;
2781
2782 SetSize(num);
2783 icFloatNumber *dst = GetData(0);
2784
2786 for (i=0; i<num; i++) {
2787 if (!file->ReadFloat32Float(&value)) { //assumes data is big endian
2788 perror("Read-File Error");
2789 parseStr += "'";
2790 parseStr += filename;
2791 parseStr += "' may not be a valid binary file.\n";
2792 delete file;
2793 return false;
2794 }
2795#ifdef ICC_BYTE_ORDER_LITTLE_ENDIAN
2796 if (little_endian) {
2797#else
2798 if (!little_endian) {
2799#endif
2800 icUInt8Number tmp;
2801 tmp = ptr[0]; ptr[0] = ptr[3]; ptr[3] = tmp;
2802 tmp = ptr[1]; ptr[1] = ptr[2]; ptr[2] = tmp;
2803 }
2804 *dst++ = value;
2805 }
2806 delete file;
2807 return true;
2808 }
2809 else { //not 8bit/16bit/float
2810 delete file;
2811 return false;
2812 }
2813 }
2814 else {//not text/binary
2815 delete file;
2816 return false;
2817 }
2818 }
2819 // no file
2820 else{
2821 if (nType == icConvert8Bit){
2822 CIccUInt8Array data;
2823
2824 if (!data.ParseArray(pCurveNode->children)) {
2825 const char *szSize = icXmlAttrValue(pCurveNode, "IdentitySize");
2826
2827 if (szSize && *szSize) {
2828 icUInt32Number nSize = (icUInt32Number)atol(szSize);
2829 SetSize(nSize);
2830
2831 if (m_nSize == nSize) {
2833 icFloatNumber *dst = GetData(0);
2834 for (j=0; j<nSize; j++) {
2835 *dst = (icFloatNumber)(j) / (icFloatNumber)(nSize-1);
2836 dst++;
2837 }
2838 }
2839 else
2840 return false;
2841 }
2842 else { //Identity curve with size=0
2843 SetSize(0);
2844 }
2845 }
2846 else {
2847 SetSize(data.GetSize());
2848
2850 icUInt8Number *src = data.GetBuf();
2851 icFloatNumber *dst = GetData(0);
2852 for (j=0; j<data.GetSize(); j++) {
2853 *dst = (icFloatNumber)(*src) / 255.0f;
2854 dst++;
2855 src++;
2856 }
2857
2858 //if (j!=256) {
2859 //printf("Error! - Input/Output table does not have 256 entries.\n");
2860 //SetSize(0);
2861 //return false;
2862 //}
2863 }
2864 return true;
2865 }
2866
2867 else if (nType == icConvert16Bit || nType == icConvertVariable){
2868 CIccUInt16Array data;
2869
2870 if (!data.ParseArray(pCurveNode->children)) {
2871 const char *szSize = icXmlAttrValue(pCurveNode, "IdentitySize");
2872
2873 if (szSize && *szSize) {
2874 icUInt32Number nSize = (icUInt32Number)atol(szSize);
2875 SetSize(nSize);
2876
2877 if (m_nSize == nSize) {
2879 icFloatNumber *dst = GetData(0);
2880 for (j=0; j<nSize; j++) {
2881 *dst = (icFloatNumber)(j) / (icFloatNumber)(nSize-1);
2882 dst++;
2883 }
2884 }
2885 else
2886 return false;
2887 }
2888 else { //Identity curve with size=0
2889 SetSize(0);
2890 }
2891 }
2892 else {
2893 SetSize(data.GetSize());
2894
2896 icUInt16Number *src = data.GetBuf();
2897 icFloatNumber *dst = GetData(0);
2898 for (j=0; j<data.GetSize(); j++) {
2899 *dst = (icFloatNumber)(*src) / 65535.0f;
2900 dst++;
2901 src++;
2902 }
2903 }
2904 return true;
2905 }
2906 else if (nType == icConvertFloat){
2907 CIccFloatArray data;
2908
2909 if (!data.ParseArray(pCurveNode->children)) {
2910 const char *szSize = icXmlAttrValue(pCurveNode, "IdentitySize");
2911
2912 if (szSize && *szSize) {
2913 icUInt32Number nSize = (icUInt32Number)atol(szSize);
2914
2915 SetSize(nSize);
2916
2917 if (m_nSize == nSize) {
2919 icFloatNumber *dst = GetData(0);
2920 for (j=0; j<nSize; j++) {
2921 *dst = (icFloatNumber)(j) / (icFloatNumber)(nSize-1);
2922 dst++;
2923 }
2924 }
2925 else
2926 return false;
2927 }
2928 else { //Identity curve with size=0
2929 SetSize(0);
2930 }
2931 }
2932 else {
2933 SetSize(data.GetSize());
2934
2936 icFloatNumber *src = data.GetBuf();
2937 icFloatNumber *dst = GetData(0);
2938 for (j=0; j<data.GetSize(); j++) {
2939 *dst = *src;
2940 dst++;
2941 src++;
2942 }
2943 }
2944 return true;
2945 }
2946 // unsupported encoding
2947 else
2948 return false;
2949 }
2950 }
2951 return false;
2952}
float icFloatNumber
All floating point operations/variables in IccProfLib use the icFloatNumber data type.
Definition IccDefs.h:100
CIccIO * IccOpenFileIO(const icChar *szFilename, const char *szAttr)
Definition IccIoXml.cpp:100
xmlNode * icXmlFindNode(xmlNode *pNode, const char *szNodeName)
const char * icXmlAttrValue(xmlAttr *attr, const char *szDefault)
@ icConvert8Bit
@ icConvertFloat
@ icConvert16Bit
@ icConvertVariable
unsigned int icUInt32Number
Type: Class.
Definition IccIO.h:97
icInt32Number ReadFloat32Float(void *pBufFloat, icInt32Number nNum=1)
Definition IccIO.cpp:302
virtual icInt32Number GetLength()
Definition IccIO.h:130
virtual icInt32Number Read8(void *pBuf8, icInt32Number nNum=1)
Definition IccIO.h:104
icInt32Number Read16(void *pBuf16, icInt32Number nNum=1)
Definition IccIO.cpp:114
icUInt32Number m_nSize
Definition IccTagLut.h:159
bool SetSize(icUInt32Number nSize, icTagCurveSizeInit nSizeOpt=icInitZero)
Name: CIccTagCurve::SetSize.
icFloatNumber * GetData(icUInt32Number index)
Definition IccTagLut.h:147
static bool ParseArray(T *buf, icUInt32Number nBufSize, xmlNode *pNode)
bool ParseTextArrayNum(const char *szText, icUInt32Number num, std::string &parseStr)
icUInt32Number GetSize()
Definition IccUtilXml.h:166
unsigned char icUInt8Number
Number definitions.
float icFloat32Number
unsigned short icUInt16Number

References CIccXmlArrayType< T, Tsig >::GetBuf(), CIccIO::GetLength(), CIccXmlArrayType< T, Tsig >::GetSize(), icConvert16Bit, icConvert8Bit, icConvertFloat, icConvertVariable, IccOpenFileIO(), icXmlAttrValue(), icXmlFindNode(), CIccXmlArrayType< T, Tsig >::ParseArray(), CIccXmlArrayType< T, Tsig >::ParseTextArrayNum(), CIccIO::Read16(), CIccIO::Read8(), and CIccIO::ReadFloat32Float().

+ Here is the call graph for this function:

◆ ParseXml() [2/2]

bool CIccTagXmlCurve::ParseXml ( xmlNode * pNode,
std::string & parseStr )
virtual

Implements CIccTagXml.

Definition at line 2563 of file IccTagXml.cpp.

2564{
2565 return ParseXml(pNode, icConvert16Bit, parseStr);
2566}
virtual bool ParseXml(xmlNode *pNode, std::string &parseStr)

References icConvert16Bit.

◆ ToXml() [1/2]

bool CIccTagXmlCurve::ToXml ( std::string & xml,
icConvertType nType,
std::string blanks = "" )
virtual

Implements CIccCurveXml.

Definition at line 2503 of file IccTagXml.cpp.

2504{
2505 char buf[40];
2506 int i;
2507
2508 if (!m_nSize) {
2509 xml += blanks + "<Curve/>\n";
2510 }
2511 else if (IsIdentity()) {
2512 xml += blanks + "<Curve IdentitySize=\"";
2513 sprintf(buf, "%d", m_nSize);
2514 xml += buf;
2515 xml += "\"/>\n";
2516 }
2517 else if (nType==icConvert8Bit) {
2518 xml += blanks + "<Curve>\n" + blanks;
2519 for (i=0; i<(int)m_nSize; i++) {
2520 if ( i && !(i%16)) {
2521 xml += "\n";
2522 xml += blanks;
2523 }
2524 sprintf(buf, " %3u", (int)(m_Curve[i] * 255.0 + 0.5));
2525 xml += buf;
2526 }
2527 xml += "\n";
2528 xml += blanks + "</Curve>\n";
2529 }
2530 else if (nType==icConvert16Bit || nType==icConvertVariable) {
2531 xml += blanks + "<Curve>\n" + blanks;
2532 for (i=0; i<(int)m_nSize; i++) {
2533 if (i && !(i%16)) {
2534 xml += "\n";
2535 xml += blanks + " ";
2536 }
2537 sprintf(buf, " %5u", (int)(m_Curve[i] * 65535.0 + 0.5));
2538 xml += buf;
2539 }
2540 xml += "\n";
2541 xml += blanks + "</Curve>\n";
2542 }
2543 else if (nType==icConvertFloat) {
2544 xml += blanks + "<Curve>\n" + blanks + " ";
2545 for (i=0; i<(int)m_nSize; i++) {
2546 if (i && !(i%16)) {
2547 xml += "\n";
2548 xml += blanks + " ";
2549 }
2550 sprintf(buf, " %13.8f", m_Curve[i]);
2551 xml += buf;
2552 }
2553 xml += "\n";
2554 xml += blanks + "</Curve>\n";
2555 }
2556 else
2557 return false;
2558
2559 return true;
2560}
virtual bool IsIdentity()
Name: CIccTagCurve::IsIdentity.
icFloatNumber * m_Curve
Definition IccTagLut.h:158

References icConvert16Bit, icConvert8Bit, icConvertFloat, and icConvertVariable.

◆ ToXml() [2/2]

bool CIccTagXmlCurve::ToXml ( std::string & xml,
std::string blanks = "" )
virtual

Implements CIccTagXml.

Definition at line 2497 of file IccTagXml.cpp.

2498{
2499 return ToXml(xml, icConvert16Bit, blanks);
2500}
virtual bool ToXml(std::string &xml, std::string blanks="")

References icConvert16Bit.


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