KCMS Application Developer's Guide

Chapter 5 KCMS Profile Attributes

In This Chapter

This chapter discusses attributes (or tags). Every profile contains a group of attributes that describe the characteristics of that profile. Attributes are specified by name, value, and status (whether they are required or optional).


Note -

In this guide, you will encounter the terms attribute and tag. These terms are identical. The text in this guide uses the term attribute instead of tag, (but code examples and header files may use tag because the ICC specification and the icc.h header file use this term). Attribute is a KCMS-specific term that existed before the ICC-term tag came into use.


The ICC specification and icc.h define most attributes. KCMS includes a few additional KCMS CMM-specific attributes, which are registered with the ICC for public use and are defined in the kcstypes.h header file.

Several KCMS API functions create and modify attributes. Some functions define what is stored in an attribute. See Chapter 4, Functions, for detailed descriptions of all the API functions.

Using the Attribute Name

The header file icc.h defines an attribute with the enumerated constant, icTagSignature. icTagSignature is the list of all attribute names in the ICC profile format specification. Note that some of these attributes cannot be used by your application, and there are additional ones that can be used. See "List of All Attributes" for a complete list of all attribute by name that KCMS allows your application to use as arguments in calls to the API functions KcsGetAttribute() and KcsSetAttribute().

Interpreting the Attribute Value

An attribute value is defined in the val field of the KcsAttributeValue data structure (see "KcsAttributeValue "). Since there are many possible data types for val, you need some way of interpreting the value as the correct data type. The KcsAttributeType data type provides this interface (see "KcsAttributeType ").

Required and Optional Attributes

Attributes are either required or optional for all profiles. The color management module (CMM) software that creates a profile must assign required attributes.

Names of CMM-Specific Attributes

The following CMM-specific attribute names are never stored in a profile. They are used to access portions of an ICC profile that are not covered by ICC attributes (listed in the ICC profile format specification).

These attributes are not defined in the ICC profile format specification. Instead, they are defined in the kcstypes.h header file. KCMS registered these attributes with the ICC so that they are available for public use.

icSigHeaderTag

#define icSigHeaderTag (0x69636864UL) /* `ichd' */

This attribute is associated with the icHeader data structure and is an ICC header. See "icHeader " for the format of icHeader. The header file contains useful attribute information.

icSigNumTag

#define icSigNumTag (0x6E746167UL) /* `ntag' */

This attribute name is associated with a data structure that returns a KcsULong value indicating the number of ICC profile attributes in a file. This is a read-only attribute: it cannot be set. The count includes the icSigHeaderTag, icSigNumTag and icSigListTag entries.

icSigListTag

#define icSigListTag (0x6C746167UL) /* `ltag' */

This attribute name is associated with the icTagList data structure, which is a list of the ICC attributes in a profile. See "icTagList "for the format of icTagList.

Example: Using icSigNumTag and icSigListTag

Example 5-1shows you how to use icSigNumTag and icSigListTag.


Example 5-1 icSigNumTag and icSigListTag

#include <kcms/kcs.h>
 KcsAttributeValue					attrValue, *attrPtr;
 int					i;
 char					*tmp;

 /* Set the value of countSupplied */
 attrValue.base.countSupplied = 1;
 attrValue.base.type = KcsULong;

 /* Get the number of attributes in the profile */
 status = KcsGetAttribute(profile, icSigNumTag, &attrValue);
 if (status != KCS_SUCCESS) {
 	KcsFreeProfile(profile);
 	exit(1);
 }

 /* Make space to get a list of all tags */
 size = sizeof(KcsAttributeBase) + sizeof(long)*attrValue.val.uLongVal[0];
 if ((attrPtr = (KcsAttributeValue *)malloc(size)) == NULL) {
 	perror("malloc failed : ");
 	KcsFreeProfile(profile);
 	exit(1);
 }

 /* Get the list of tags */
 attrPtr->base.type = KcsULong;
 attrPtr->base.sizeOfType = sizeof(long);
 attrPtr->base.countSupplied = attrValue.val.uLongVal[0];
 status = KcsGetAttribute(profile, icSigListTag, attrPtr);
 if (status != KCS_SUCCESS) {
 	KcsFreeProfile(profile);
 	free (attrPtr);
 	exit(1);
 }

 /* Print the list */
 printf("Number of tags = %d\n", attrPtr->base.countSupplied);
 for (i=0; i<attrPtr->base.countSupplied; i++) {
 	tmp = (char *)&attrPtr->val.uLongVal[i];
 	printf("Tag # = %d, Tag Hex = 0x%x, Tag Ascii = %c%c%c%c\n", i,
 		attrPtr->val.uLongVal[i]; *tmp, *(tmp+1), *(tmp+2), *(tmp+3));
 }

 KcsFreeProfile(profile);
 free (attrPtr);

Required ICC Attributes

Some attributes in the profile structure are required by the ICC. These attributes provide a common base level of functionality for all CMMs to translate color information. If, for example, a requested CMM is not present, the default CMM information is used, knowing these attributes are present.

The names of the required attributes discussed in this section are defined in the icc.h header file. The associated data structures are defined in "Attribute Types " and are in the icc.h header file. See the ICC profile format specification for more detailed definitions of device profiles, attribute names, and attribute types (data structures). ICC-specification section titles are referenced in each profile class section discussed next. (The ICC profile format specification is located on-line in the SUNWsdk/kcms/doc directory. For the latest version of the specification, see the web site at http://icc.color.org.)

Table 5-1 shows attributes that are required depending on the profile type and interpretation. The attributes in the first five table rows can be set using KcsGetAttribute(), KcsSetAttribute(), or KcsUpdateProfile(). The icSigGrayTRCTag attribute is required for input profiles only.

Table 5-1 Attributes Required Depending on Interpretation

Profile 

Attribute Name 

Interpretation 

Input Profile 

icSigAToB0Tag

None 

Display Profile 

icSigAToB0Tag

None 

Output Profile 

icSigBToA0Tag

Perceptual rendering 

Output Profile 

icSigBToA1Tag

Colorimetric rendering 

Output Profile 

icSigBToA2Tag

Saturation rendering 

Input Profile 

icSigGrayTRCTag

Depends on intent 

Display Profile 

icSigGrayTRCTag

Additive 

Output Profile 

icSigGrayTRCTag

Subtractive 

Note that these tags, once set with KcsSetAttribute(), cannot be accessed and used unless the KcsSaveProfile() function has been called first. The save initiates certain CMM operations to be performed on the LUTs for future use.


Note -

This section uses the ICC equivalent names for KCMS profile format classifications (that is, input profile, output profile, and so forth) because the section presents some of the material as you will find it in the ICC profile format specification and in icc.h. See Table 2-1 in Chapter 2, Profiles, for the corresponding KCMS names.


Input Profile

The following attributes are required for input devices such as scanners. See "Input Profile" in the ICC specification for more information.

Monochrome Input Profiles

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigCopyrightTag

icText

icSigGrayTRCTag

icCurve

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

RGB Input Profiles

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigBlueColorantTag

icXYZArray

icSigBlueTRCTag

icCurve

icSigCopyrightTag

icText

icSigGreeColorantTag

icXYZArray

icSigGreenTRCTag

icCurve

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

icSigRedColorantTag

icXYZArray

icSigRedTRCTag

icCurve

N-Component Input Profiles

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigAtoB0Tag

icLut8 or icLut16

icSigCopyrightTag

icText

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

Display Profile

The following attributes are required for display devices such as monitors. See "Display Profile" in the ICC specification for more information.

Monochrome Display Profiles

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigCopyrightTag

icText

icSigGrayTRCTag

icCurve

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

RGB Display Profiles

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigBlueColorantTag

icCurve

icSigBlueTRCTag

icCurve

icSigCopyrightTag

icText

icSigGreenColorantTag

icCurve

icSigGreenColorantTag

icCurve

icSigGreenTRCTag

icCurve

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

icSigRedColorantTag

icCurve

icSigRedTRCTag

icCurve

Output Profile

The following attributes are required for output devices such as printers. See "Output Profile" in the ICC specification for more information.

Monochrome Output Profiles

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigCopyrightTag

icText

icSigGrayTRCTag

icCurve

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

RGB and CMYK Output Profiles

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigAtoB0Tag

icLut8 or icLut16

icSigAtoB1Tag

icLut8 or icLut16

icSigAtoB2Tag

icLut8 or icLut16

icSigBtoA0Tag

icLut8 or icLut16

icSigBtoA1Tag

icLut8 or icLut16

icSigBtoA2Tag

icLut8 or icLut16

icSigCopyrightTag

icText

icSigCrdInfoTag

icCrdInfo

icSigGamutTag

icLut8 or icLut16

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

Additional Profile Formats

In addition to the three basic classifications of device profiles (that is, input, display, and output), the ICC specification defines four other color processing profiles, namely

Device Link Profile

The device link profile is for a link or connection between devices. The following attributes are for device link profiles.

See "DeviceLink Profile" in the ICC specification for more information.

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigAToB0Tag

icLut8 or icLut16

icSigCopyrightTag

icText

icSigProfileDescriptionTag

icTextDescription

icSigProfileSequenceDescTag

icProfileSequenceDesc

Color Space Conversion Profile

The color space conversion profile is for color space transformation between non-device color spaces and the profile connection space (PCS). The following attributes are for color space conversion profiles. See "ColorSpaceConversion Profile" in the ICC specification for more information.

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigAToB0Tag

icLut8 or icLut16

icSigBToA0Tag

icLut8 or icLut16

icSigCopyrightTag

icText

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

Abstract Profile

The abstract profile is for color transformations between PCS and PCS. The following attributes are for abstract profiles. See "Abstract Profile" in the ICC specification for more information.

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigAToB0Tag

icLut8 or icLut16

icSigCopyrightTag

icText

icSigMediaWhitePointTag

icXYZArray

icSigProfileDescriptionTag

icTextDescription

List of All Attributes

This is an alphabetical list of all attributes by name that KCMS allows your application to specify in calls to KcsGetAttribute() and KcsSetAttribute(). The list includes attributes from the ICC profile specification as well as the attributes KCMS registered with the ICC for public use.

Attribute Name 

Attribute Type 

icSigHeaderTag

icHeader

icSigAToB0Tag

icLut8 or icLut16

icSigAToB1Tag

icLut8 or icLut16

icSigAToB2Tag

icLut8 or icLut16

icSigBlueColorantTag

icXYZArray

icSigBlueTRCTag

icCurve

icSigBToA0Tag

icLut8 or icLut16

icSigBToA1Tag

icLut8 or icLut16

icSigBToA2Tag

icLut8 or icLut16

icSigCalibrationDateTimeTag

icSigDateTimeType

icSigCharTargetTag

icText

icSigCopyrightTag

icText

icSigCrdInfoTag

icCrdInfo

icSigDeviceMfgDescTag

icTextDescription

icSigDeviceModelDescTag

icTextDescription

icSigGamutTag

icLut8 or icLut16

icSigGrayTRCTag

icCurve

icSigGreenColorantTag

icXYZArray

icSigGreenTRCTag

icCurve

icSigLuminanceTag

icXYZArray

icSigMeasurementTag

icMeasurement

icSigMediaBlackPointTag

icXYZArray

icSigMediaWhitePointTag

icXYZArray

icSigNamedColorTag

icNamedColor

icSigNamedColor2Tag

icNamedColor2

icSigPreview0Tag

icLut8 or icLut16

icSigPreview1Tag

icLut8 or icLut16

icSigPreview2Tag

icLut8 or icLut16

icSigProfileDescriptionTag

icTextDescription

icSigProfileSequenceDescTag

icProfileSequenceDesc

icSigPs2CRD0Tag

icData

icSigPs2CRD1Tag

icData

icSigPs2CRD2Tag

icData

icSigPs2CRD3Tag

icData

icSigPs2CSATag

icData

icSigPs2RenderingIntentTag

icData

icSigRedColorantTag

icXYZArray

icSigRedTRCTag

icSigCurve

icSigScreeningDescTag

icTextDescription

icSigScreeningTag

icScreening

icSigTechnologyTag

icSignature

icSigUcrBgTag

icUcrBg

icSigViewingCondDescTag

icTextDescription

icSigViewingConditionsTag

icViewingConditions


Note -

The icSigProfileSequence attribute is read only and therefore can't be modified by KcsSetAttribute(); it can be read with KcsGetAttribute(). The attribute is valid for device link (complete color) profiles only.


Attribute Types

The following data structures are used only with attributes and are defined in the icc.h header file. All other KCMS framework API data structures are defined in Chapter 3, Data Structures and in the kcstypes.h header file.

All icc.h header file entries below are prefixed with "ic" to help avoid name space collisions. Signatures are prefixed with "icSig." Many of the structures contain variable-length arrays. This is represented by the convention

type data [icAny]

Constants

#define icMagicNumber 0x61637370L /* 'acsp' */
#define icVersionNumber 0x02000000L /* 2.0, BCD */

Screen Encodings

#define icPrtrDefaultScreensFalse									0x00000000L /* Bit position 0 */
#define icPrtrDefaultScreensTrue									0x00000001L /* Bit position 0 */
#define icLinesPerInch 									0x00000002L /* Bit position 1 */
#define icLinesPerCm 									0x00000000L /* Bit position 1 */

Device Attributes

The defined values correspond to the low 4 bytes of the 8-byte attribute quantity. See icc.h for their location.

#define icReflective 									0x00000000L /* Bit position 0 */
#define icTransparency 									0x00000001L /* Bit position 0 */
#define icGlossy 									0x00000000L /* Bit position 1 */
#define icMatte 									0x00000002L /* Bit position 1 */

Profile Header Flags

The low 16 bits are reserved for the ICC.

#define icEmbeddedProfileFalse 									0x00000000L /* Bit position 0 */
#define icEmbeddedProfileTrue 									0x00000001L /* Bit position 0 */
#define icUseAnywhere 									0x00000000L /* Bit position 1 */
#define icUseWithEmbeddedDataOnly									0x00000002L /* Bit position 1 */

ASCII or Binary Data

#define icAsciiData 									0x00000000L /* Used in dataType */
#define icBinaryData 									0x00000001L

Variable-Length Array

The following is used to indicate that this is a variable-length array.

#define icAny	 								1

Signatures

Signatures are 4-byte identifiers used to translate platform definitions to ic* form and to differentiate between attributes and other items in the profile format. Set icSignature as appropriate for your operating system.

icSignature

This icSignature is for the Solaris operating environment. Note the number definitions.

#if defined(sun) || defined(__sun)										/* 32-bit Solaris, SunOS */

 typedef long				icSignature;

 /*
  * Number definitions
  */

 /* Unsigned Integer Numbers */
 typedef unsigned char						icUInt8Number;
 typedef unsigned short						icUInt16Number;
 typedef unsigned long						icUInt32Number;
 typedef unsigned long						icUInt64Number[2];

 /* Signed Integer Numbers */
 typedef char						icInt8Number;
 typedef short						icInt16Number;
 typedef long						icInt32Number;
 typedef long						icInt64Number[2];

 /* Fixed Numbers */
 typedef long						icS15Fixed16Number;
 typedef		unsigned long					icU16Fixed16Number;
 #endif /* 32-bit Solaris, SunOS */

icTagSignature

The icTagSignature lists the public attributes and sizes in the ICC specification. The attribute icSigProfileSequenceTag is read only and is valid for device link (complete color) profiles only.

typedef enum {
 	icSigAToB0Tag								= 0x41324230L,	/* 'A2B0' */
 	icSigAToB1Tag								= 0x41324231L,	/* 'A2B1' */
 	icSigAToB2Tag								= 0x41324232L,	/* 'A2B2' */
 	icSigBlueColorantTag								= 0x6258595AL,	/* 'bXYZ' */
 	icSigBlueTRCTag								= 0x62545243L,	/* 'bTRC' */
 	icSigBToA0Tag								= 0x42324130L,	/* 'B2A0' */
 	icSigBToA1Tag								= 0x42324131L,	/* 'B2A1' */
 	icSigBToA2Tag								= 0x42324132L,	/* 'B2A2' */
 	icSigCalibrationDateTimeTag								= 0x63616C74L,	/* 'calt' */
 	icSigCharTargetTag								= 0x74617267L,	/* 'targ' */
 	icSigCopyrightTag								= 0x63707274L,	/* 'cprt' */
 	icSigDeviceMfgDescTag								= 0x646D6E64L,	/* 'dmnd' */
 	icSigDeviceModelDescTag								= 0x646D6464L,	/* 'dmdd' */
 	icSigGamutTag								= 0x676d7420L,	/* 'gmt ' */
 	icSigGrayTRCTag								= 0x6b545243L,	/* 'kTRC' */
 	icSigGreenColorantTag								= 0x6758595AL,	/* 'gXYZ' */
 	icSigGreenTRCTag								= 0x67545243L,	/* 'gTRC' */
 	icSigLuminanceTag								= 0x6C756d69L,	/* 'lumi' */
 	icSigMeasurementTag								= 0x6D656173L,	/* 'meas' */
 	icSigMediaBlackPointTag								= 0x626B7074L,	/* 'bkpt' */
 	icSigMediaWhitePointTag								= 0x77747074L,	/* 'wtpt' */
 	icSigNamedColorTag								= 0x6E636f6CL,			/* `ncol'
 													* obsolete, use `ncl2' */
 	icSigPreview0Tag								= 0x70726530L,	/* 'pre0' */
 	icSigPreview1Tag								= 0x70726531L,	/* 'pre1' */
 	icSigPreview2Tag								= 0x70726532L,	/* 'pre2' */
 	icSigProfileDescriptionTag								= 0x64657363L,	/* 'desc' */
 	icSigProfileSequenceDescTag								= 0x70736571L,	/* 'pseq' */
 	icSigPs2CRD0Tag								= 0x70736430L,	/* 'psd0' */					
 	icSigPs2CRD1Tag								= 0x70736431L,	/* 'psd1' */
 	icSigPs2CRD2Tag								= 0x70736432L,	/* 'psd2' */
 	icSigPs2CRD3Tag								= 0x70736433L,	/* 'psd3' */
 	icSigPs2CSATag								= 0x70733273L,	/* 'ps2s' */
 	icSigPs2RenderingIntentTag								= 0x70733269L,	/* 'ps2i' */
 	icSigRedColorantTag								= 0x7258595AL,	/* 'rXYZ' */
 	icSigRedTRCTag								= 0x72545243L,	/* 'rTRC' */
 	icSigScreeningDescTag								= 0x73637264L,	/* 'scrd' */
 	icSigScreeningTag								= 0x7363726EL,	/* 'scrn' */
 	icSigTechnologyTag								= 0x74656368L,	/* 'tech' */
 	icSigUcrBgTag								= 0x62666420L,	/* 'bfd ' */
 	icSigViewingCondDescTag								= 0x76756564L,	/* 'vued' */
 	icSigViewingConditionsTag								= 0x76696577L,	/* 'view' */
 	icSigNamedColor2Tag								= 0x6E636C32L,	/* 'ncl2' */
 	icSigCrdInfoTag								= 0x63726469L,	/* 'crdi' */
 	icMaxEnumTag					= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icTagSignature;

icTagTypeSignature

typedef enum {
 	icSigCurveType						= 0x63757276L,	/* 'curv' */
 	icSigDataType						= 0x64617461L,	/* 'data' */
 	icSigDateTimeType						= 0x6474696DL,	/* 'dtim' */
 	icSigLut16Type						= 0x6d667432L,	/* 'mft2' */
 	icSigLut8Type						= 0x6d667431L,	/* 'mft1' */
 	icSigMeasurementType						= 0x6D656173L,	/* 'meas' */
 	icSigNamedColorType						= 0x6E636f6CL,			/* `ncol' , obsolete, use `ncl2' */
 	icSigProfileSequenceDescType	= 0x70736571L,	/* 'pseq' */
 	icSigS15Fixed16ArrayType							= 0x73663332L,	/* 'sf32' */
 	icSigScreeningType						= 0x7363726EL,	/* 'scrn' */
 	icSigSignatureType						= 0x73696720L,	/* 'sig ' */
 	icSigTextType						= 0x74657874L,	/* 'text' */
 	icSigTextDescriptionType							= 0x64657363L,	/* 'desc' */
 	icSigU16Fixed16ArrayType							= 0x75663332L,	/* 'uf32' */
 	icSigUcrBgType						= 0x62666420L,	/* 'bfd ' */
 	icSigUInt16ArrayType						= 0x75693136L,	/* 'ui16' */
 	icSigUInt32ArrayType						= 0x75693332L,	/* 'ui32' */
 	icSigUInt64ArrayType						= 0x75693634L,	/* 'ui64' */
 	icSigUInt8ArrayType						= 0x75693038L,	/* 'ui08' */
 	icSigViewingConditionsType							= 0x76696577L,	/* 'view' */
 	icSigXYZType						= 0x58595A20L,	/* 'XYZ ' */
 	icSigXYZArrayType						= 0x58595A20L,	/* 'XYZ ' */
 	icSigNamedColor2Type						= 0x6E636C32L,	/* 'ncl2' */
 	icMaxEnumType						= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icTagTypeSignature;

icTechnologySignature

typedef enum {
 	icSigDigitalCamera						=0x6463616DL,					/* 'dcam' */
 	icSigFilmScanner						= 0x6673636EL,					/* 'fscn' */
 	icSigReflectiveScanner						= 0x7273636EL,					/* 'rscn' */
 	icSigInkJetPrinter						= 0x696A6574L,					/* 'ijet' */
 	icSigThermalWaxPrinter						= 0x74776178L,					/* 'twax' */
 	icSigElectrophotographicPrinter	= 0x6570686FL,												/* 'epho' */
 	icSigElectrostaticPrinter								= 0x65737461L,					/* 'esta' */
 	icSigDyeSublimationPrinter								= 0x64737562L,					/* 'dsub' */
 	icSigPhotographicPaperPrinter								= 0x7270686FL,					/* 'rpho' */
 	icSigFilmWriter						= 0x6670726EL,					/* 'fprn' */
 	icSigVideoMonitor						= 0x7669646DL,					/* 'vidm' */
 	icSigVideoCamera						= 0x76696463L,					/* 'vidc' */
 	icSigProjectionTelevision								= 0x706A7476L,					/* 'pjtv' */
 	icSigCRTDisplay						= 0x43525420L,					/* 'CRT ' */
 	icSigPMDisplay						= 0x504D4420L,					/* 'PMD ' */
 	icSigAMDisplay						= 0x414D4420L,					/* 'AMD ' */
 	icSigPhotoCD						= 0x4B504344L,					/* 'KPCD' */
 	icSigPhotoImageSetter						= 0x696D6773L,					/* 'imgs' */
 	icSigGravure						= 0x67726176L,					/* 'grav' */
 	icSigOffsetLithography						= 0x6F666673L,					/* 'offs' */
 	icSigSilkscreen						= 0x73696C6BL, 					/* 'silk' */
 	icSigFlexography						= 0x666C6578L,					/* 'flex' */
 	icMaxEnumTechnology						= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icTechnologySignature;				

Color Space Signature

icColorSpaceSignature

typedef enum {
 	icSigXYZData				= 0x58595A20L,	/* 'XYZ ' */
 	icSigLabData				= 0x4C616220L,	/* 'Lab ' */
 	icSigLuvData				= 0x4C757620L,	/* 'Luv ' */
 	icSigYCbCrData				= 0x59436272L,	/* 'YCbr' */
 	icSigYxyData				= 0x59787920L,	/* 'Yxy ' */
 	icSigRgbData				= 0x52474220L,	/* 'RGB ' */
 	icSigGrayData				= 0x47524159L,	/* 'GRAY' */
 	icSigHsvData				= 0x48535620L,	/* 'HSV ' */
 	icSigHlsData				= 0x484C5320L,	/* 'HLS ' */
 	icSigCmykData				= 0x434D594BL,	/* 'CMYK' */
 	icSigCmyData				= 0x434D5920L,	/* 'CMY ' */
 	icMaxEnumData				= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icColorSpaceSignature;

Note -

Currently, only icSigXYZData and icSigLabData are valid profile connection spaces (PCSs).


icProfileClassSignature

/* profileClass enumerations */
 typedef enum {
 	icSigInputClass					= 0x73636E72L,	/* 'scnr' */
 	icSigDisplayClass					= 0x6D6E7472L,	/* 'mntr' */
 	icSigOutputClass					= 0x70727472L,	/* 'prtr' */
 	icSigLinkClass					= 0x6C696E6BL,	/* 'link' */
 	icSigAbstractClass					= 0x61627374L,	/* 'abst' */
 	icSigColorSpaceClass						= 0x73706163L,	/* 'spac' */
 	icSigNamedColorClass						= 0x6E6D636CL,	/* 'nmcl' */
 	icMaxEnumClass					= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icProfileClassSignature;

icPlatformSignature

/* Platform Signatures */
 typedef enum {
 	icSigMacintosh					= 0x4150504CL,	/* 'APPL' */
 	icSigMicrosoft					= 0x4D534654L,	/* 'MSFT' */
 	icSigSolaris					= 0x53554E57L,	/* 'SUNW' */
 	icSigSGI					= 0x53474920L,	/* 'SGI ' */
 	icSigTaligent					= 0x54474E54L,	/* 'TGNT' */
 	icMaxEnumPlatform					= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icPlatformSignature;

Other Enums

icIlluminant

icIlluminant is used in the icMeasurement structure.

/* Pre-defined illuminants, used in measurement and viewing
  * conditions type */
 typedef enum {
 	icIlluminantUnknown						= 0x00000000L,
 	icIlluminantD50						= 0x00000001L,
 	icIlluminantD65						= 0x00000002L,
 	icIlluminantD93						= 0x00000003L,
 	icIlluminantF2						= 0x00000004L,
 	icIlluminantD55						= 0x00000005L,
 	icIlluminantA						= 0x00000006L,
 	icIlluminantEquiPowerE		= 0x00000007L,	/* Equi-Power (E) */
 	icIlluminantF8						= 0x00000008L,	
 	icMaxEnumIluminant						= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icIlluminant;

icMeasurementFlare

icMeasurementFlare is used in the icMeasurement structure.

/* Measurement Flare, used in the measurmentType tag */
 typedef enum {
 	icFlare0				= 0x00000000L,					/* 0% flare */
 	icFlare100				= 0x00000001L,					/* 100% flare */
 	icMaxFlare				= 0xFFFFFFFFL					/* enum = 4 bytes max */
 } icMeasurementFlare;

icMeasurementGeometry

icMeasurementGeometry is used in the icMeasurement structure.

/* Measurement Geometry, used in the measurmentType tag */
 typedef enum {
 	icGeometryUnknown						= 0x00000000L,	/* Unknown geometry */
 	icGeometry045or450						= 0x00000001L,	/* 0/45 or 45/0 */
 	icGeometry0dord0						= 0x00000002L,	/* 0/d or d/0 */
 	icMaxGeometry						= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icMeasurementGeometry;

icRenderingIntent

icRenderingIntent is used in the icHeader structure.

/* Rendering Intents, used in the profile header */
 typedef enum {
 	icPerceptual						= 0,
 	icRelativeColorimetric						= 1,
 	icSaturation						= 2,
 	icAbsoluteColorimetric						= 3,
 	icMaxEnumIntent						= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icRenderingIntent;

icSpotShape

/* Different Spot Shapes currently defined, used for screeningType */
 typedef enum {
 	icSpotShapeUnknown							= 0,
 	icSpotShapePrinterDefault							= 1,
 	icSpotShapeRound							= 2,
 	icSpotShapeDiamond							= 3,
 	icSpotShapeEllipse							= 4,
 	icSpotShapeLine							= 5,
 	icSpotShapeSquare							= 6,
 	icSpotShapeCross							= 7,
 	icMaxEnumSpot						= 0xFFFFFFFFL	/* enum = 4 bytes max */
} icSpotShape;

icSpotShape is used in the icScreening structure.

icStandardObserver

icStandardObserver is used in the icMeasurement structure.

/* Standard Observer, used in the measurementType tag */
 typedef enum {
     icStdObsUnknown							= 0x00000000L,				/* Unknown observer */
     icStdObs1931TwoDegrees		= 0x00000001L,									/* 1931 two degrees */
     icStdObs1964TenDegrees		= 0x00000002L,									/* 1961 ten degrees */
     icMaxStdObs							= 0xFFFFFFFFL	/* enum = 4 bytes max */
 } icStandardObserver;

Arrays of Numbers

These arrays are variable in length and type. They are implemented with the icAny constant instead of pointers. The icAny constant is a single-byte array that allows you to extend the data structure by allocating more data.

icInt8Number

typedef struct {
 	icInt8Number							data[icAny];
 } icInt8Array;

icUInt8Number

typedef struct {
 	icUInt8Number							data[icAny];
 } icUInt8Array;

icInt16Number

typedef struct {
 	icInt16Number							data[icAny];
 } icInt16Array;

icUInt16Number

typedef struct {
 	icUInt16Number								data[icAny];
 } icUInt16Array;

icInt32Number

typedef struct {
 	icInt32Number							data[icAny];
 } icInt32Array;

icUInt32Number

typedef struct {
 	icUInt32Number								data[icAny];
 } icUInt32Array;

icInt64Number

typedef struct {
 	icInt64Number							data[icAny];
 } icInt64Array;

icUInt64Number

typedef struct {
 	icUInt64Number								data[icAny];
 } icUInt64Array;

icS15Fixed16Number

typedef struct {
 	icS15Fixed16Number 	data[icAny];
 } icS15Fixed16Array;

icU16Fixed16Number

typedef struct {
 	icU16Fixed16Number 	data[icAny];
 } icU16Fixed16Array;

icCrdInfo

typedef struct {
 	icUInt32Number				count;				/* Char count includes NULL */
 	icInt8Number				desc[icAny];				/* NULL terminated string */
 } icCrdInfo;

icCurve

typedef struct {
 	icUInt32Number					count;				/* Number of entries */
 	icUInt16Number					data[icAny];				/* The actual table data, real
 										* number is determined by count
 										* Interpretation depends on data
 										* use with a given tag */
 } icCurve;

icData

typedef struct {
 	icUInt32Number				dataFlag;				/* 0 = ascii, 1 = binary */
 	icInt8Number				data[icAny];				/* Data,size determined from tag */
 } icData;

icDateTimeNumber

/* The base date time number */
 typedef struct {
     icUInt16Number						year;
     icUInt16Number						month;
     icUInt16Number						day;
     icUInt16Number						hours;
     icUInt16Number						minutes;
     icUInt16Number						seconds;
 } icDateTimeNumber;

icDescStruct

typedef struct {
 	icSignature					deviceMfg;				/* Device Manufacturer */
 	icSignature					deviceModel;				/* Decvice Model */
 	icUInt64Number					attributes;				/* Device attributes */
 	icTechnologySignature						technology;	/* Technology signature */
 	icInt8Number				data[icAny];				/* Descriptions text follows */

 /*  Data that follows is of this form, this is an icInt8Number
  *  to avoid problems with a compiler generating  bad code as
  *  these arrays are variable in length.
  * icTextDescription						deviceMfgDesc;				* Manufacturer text
  * icTextDescription						modelDesc;				* Model text */

 } icDescStruct;

icLut8

/* lut8, input & output tables are always 256 bytes in length */
 typedef struct {
     icUInt8Number	inputChan;	/* Number of input channels */
     icUInt8Number	outputChan;	/* Number of output channels */
     icUInt8Number	clutPoints;	/* Number of clutTable grid points */
     icInt8Number	pad;
     icS15Fixed16Number	e00;		/* e00 in the 3 * 3 */
     icS15Fixed16Number	e01;		/* e01 in the 3 * 3 */   
     icS15Fixed16Number	e02;		/* e02 in the 3 * 3 */
     icS15Fixed16Number	e10;		/* e10 in the 3 * 3 */
     icS15Fixed16Number	e11;		/* e11 in the 3 * 3 */   
     icS15Fixed16Number	e12;		/* e12 in the 3 * 3 */
     icS15Fixed16Number	e20;		/* e20 in the 3 * 3 */
     icS15Fixed16Number	e21;		/* e21 in the 3 * 3 */   
     icS15Fixed16Number	e22;		/* e22 in the 3 * 3 */
     icUInt8Number	data[icAny];	/* Data follows see spec for size */
 /*
  *  Data that follows is of this form
  *
  *  icUInt8Number	inputTable[inputChan][256];	* The input table
  *  icUInt8Number	clutTable[icAny];		* The clut table
  *  icUInt8Number	outputTable[outputChan][256];	* The output table
  */
 } icLut8;

icLut16

/* lut16 */
 typedef struct {
     icUInt8Number	inputChan;	/* Number of input channels */
     icUInt8Number	outputChan;	/* Number of output channels */
     icUInt8Number	clutPoints;	/* Number of clutTable grid points */
     icInt8Number	pad;		/* Padding for byte alignment */
     icS15Fixed16Number	e00;		/* e00 in the 3 * 3 */
     icS15Fixed16Number	e01;		/* e01 in the 3 * 3 */   
     icS15Fixed16Number	e02;		/* e02 in the 3 * 3 */
     icS15Fixed16Number	e10;		/* e10 in the 3 * 3 */
     icS15Fixed16Number	e11;		/* e11 in the 3 * 3 */   
     icS15Fixed16Number	e12;		/* e12 in the 3 * 3 */
     icS15Fixed16Number	e20;		/* e20 in the 3 * 3 */
     icS15Fixed16Number	e21;		/* e21 in the 3 * 3 */   
     icS15Fixed16Number	e22;		/* e22 in the 3 * 3 */
     icUInt16Number	inputEnt;	/* Number of input table entries */
     icUInt16Number	outputEnt;	/* Number of output table entries */
     icUInt16Number	data[icAny];	/* Data follows see spec for size */
 /*
  *  Data that follows is of this form
  *
  *  icUInt16Number	inputTable[inputChan][icAny];	* The input table
  *  icUInt16Number	clutTable[icAny];		* The clut table
  *  icUInt16Number	outputTable[outputChan][icAny];	* The output table
  */
 } icLut16;

icMeasurement

typedef struct {
 	icStandardObserver						stdObserver;				/* Standard observer */
 	icXYZNumber						backing;				/* XYZ for backing material */
 	icMeasurementGeometry						geometry;				/* Measurement geometry */
 	icMeasurementFlare						flare;				/* Measurement flare */
 	icIlluminant						illuminant;				/* Illuminant */
 } icMeasurement;

Each field in icMeasurement is an enumerated type. For details on each field, see the following:

icNamedColor2

/*
  * icNamedColor2 takes the place of icNamedColor, approved at the
  * SIGGRAPH 95, ICC meeting.
  */
 typedef struct {
     icUInt32Number									vendorFlag;									/* Bottom 16 bits for IC use */
     icUInt32Number									count;										/* Count of named colors */
     icUInt32Number									nDeviceCoords;										/* Number of device coordinates */
     icInt8Number									prefix[32];										/* Prefix for each color name */
     icInt8Number									suffix[32];										/* Suffix for each color name */
     icInt8Number									data[icAny];										/* Named color data follows */
 /*
  *  Data that follows is of this form
  *
  * icInt8Number									root1[32];									* Root name for first color
  * icUInt16Number									pcsCoords1[icAny];									* PCS coordinates of first color
  * icUInt16Number									deviceCoords1[icAny];									* Device coordinates of first color
  * icInt8Number									root2[32];									* Root name for second color
  * icUInt16Number									pcsCoords2[icAny];									* PCS coordinates of first color
  * icUInt16Number									deviceCoords2[icAny];									* Device coordinates of first color
  *									:
  *									:
  * Repeat for name and PCS and device color coordinates up to (count-1)
  *
  * NOTES: 
  * PCS and device space can be determined from the header.
  *
  * PCS coordinates are icUInt16 numbers and are described in the ICC
  * specification. Only 16 bit CIELAB and CIEXYZ are allowed. The number of
  * coordinates is consistent with the headers PCS.
  *
  * Device coordinates are icUInt16 numbers where 0x0000 represents
  * the minimum value and 0xFFFF represents the maximum value.
  * If the nDeviceCoords value is 0, this field is not given.
  */
 } icNamedColor2;

icProfileSequenceDesc

typedef struct {
 	icUInt32Number				count;			/* Number of descriptions */
 	icUInt8Number				data[icAny];			/* Array of description struct */
 } icProfileSequenceDesc;

icScreening

typedef struct {
 	icUInt32Number						screeningFlag;				/* Screening flag */
 	icUInt32Number						channels;				/* Number of channels */
 	icScreeningData						data[icAny];				/* Array of screening data */
 } icScreening;

icScreeningData

typedef struct {
 	icS15Fixed16Number						frequency;			/* Frequency */
 	icS15Fixed16Number						angle;			/* Screen angle */
 	icSpotShape						spotShape;			/* Spot Shape encodings */
 } icScreeningData;

icText

typedef struct {
 	icInt8Number					data[icAny];				/* Variable array of chars */
 } icText;

icTextDescription

typedef struct {
     icUInt32Number									count;						/* Description length */
     icInt8Number									data[icAny];						/* Descriptions follow */
 /*
  *  Data that follows is of this form
  *
  * icInt8Number									desc[count]	* NULL terminated ascii string
  * icUInt32Number									ucLangCode;	* UniCode language code
  * icUInt32Number									ucCount;				* UniCode description length
  * icInt16Number									ucDesc[ucCount];* The UniCode description
  * icUInt16Number									scCode;		* ScriptCode code
  * icUInt8Number									scCount;	* ScriptCode count
  * icInt8Number									scDesc[67];	* ScriptCode Description
  */
 } icTextDescription;

icUcrBg

typedef struct {
     icInt8Number								data[icAny];						/* The Ucr BG data */
 /*
  *  Data that follows is of this form. UcrBg is a icInt8Number
  *  to avoid problems with a compiler as
  *  these are variable-length arrays.
  *
  * icUcrBgCurve								ucr;				* Ucr curve
  * icUcrBgCurve								bg;				* Bg curve
  * icInt8Number								string;				* UcrBg description string
  */
 } icUcrBg;

icUcrBgCurve

/* Structure describing either a UCR or BG curve */
 typedef struct {
     icUInt32Number						count;				/* Curve length */
     icUInt16Number						curve[icAny];	/* The array of curve values */
 } icUcrBgCurve;

icViewingCondition

typedef struct {
 	icXYZNumber				illuminant;	/* In candelas per metre sq'd */
 	icXYZNumber				surround;			/* In candelas per metre sq'd */
 	icIlluminant				stdIluminant;	/* See icIlluminant defines */
 } icViewingCondition;

icXYZArray

typedef struct {
 	icXYZNumber						data[icAny];			 /* Variable array of XYZ numbers */
 } icXYZArray;

icXYZNumber

typedef struct {
     icS15Fixed16Number							X;
     icS15Fixed16Number							Y;
     icS15Fixed16Number							Z;
 } icXYZNumber;

Attribute Type Definitions

The following attribute type definitions are in the icc.h header file.

Attribute Types

icCrdInfoType

typedef struct {
 	icTagBase				base;				/* "crdi" signature */
 	icCrdInfo				info[5];				/* 5 sets of counts/strings */
 } icCrdInfoType;

icCurveType

typedef struct {
 	icTagBase				base;				/* "curv" signature */
 	icCurve				curve;				/* curve data */
 } icCurveType;

icDataType

typedef struct {
 	icTagBase				base;				/* "data" signature */
 	icData				data;				/* data structure */
 } icDataType;

icDateTimeType

typedef struct {
 	icTagBase				base;				/* "dtim" signature */
 	icData				data;				/* date */
 } icDateTimeType;

icLut8Type

typedef struct {
 	icTagBase				base;				/* "mft1" signature */
 	icLut8				lut;				/* Lut8 data*/
 } icLut8Type;

icLut16Type

typedef struct {
 	icTagBase				base;				/* "mft2" signature */
 	icLut16				lut;				/* Lut16 data*/
 } icLut16Type;

icMeasurementType

typedef struct {
 	icTagBase				base;				/* "meas" signature */
 	icMeasurement				measurement;				/* measurement data*/
 } icMeasurementType;

icNamedColor2Type

icNamedColor2Type replaces icNamedColorType, which is obsolete.

typedef struct {
 	icTagBase				base;				/* "ncl2" signature */
 	icNamedColor2				ncolor;				/* named color data*/
 } icNamedColor2Type;

icProfileSequenceType

typedef struct {
 	icTagBase				base;				/* "pseq" signature */
 	icProfileSequence					desc;			/* seq description data*/
 } icProfileSequenceType;

icS15Fixed16ArrayType

typedef struct {
 	icTagBase					base;			/* "sf32" signature */
 	icS15Fixed16Array					data;			/* array of values */
 } icS15Fixed16ArrayType;

icScreeningType

typedef struct {
 	icTagBase				base;			/* "scrn" signature */
 	icScreening				screen;			/* screening structure */
 } icScreeningType;

icSignatureType

typedef struct {
 	icTagBase				base;			/* "sig" signature */
 	icSignature				signature;			/* signature data */
 } icSignatureType;

icTagBase

typedef struct {
 	icTagTypeSignature					sig;				/* Signature */
 	icInt8Number					reserved[4];				/* Reserved, set to 0 */
 } icTagBase;

icTextDescriptionType

typedef struct {
 	icTagBase				base;				/* "desc" signature */
 	icTextDescription					desc;			/* description data*/
 } icTextDescriptionType;

icTextType

typedef struct {
 	icTagBase				base;				/* "text" signature */
 	icText				data;			/* variable array of chars */
 } icTextType;

icU16Fixed16ArrayType

typedef struct {
 	icTagBase					base;			/* "uf32" signature */
 	icU16Fixed16Array					data;			/* variable array of values */
 } icU16Fixed16ArrayType;

icUcrBgType

typedef struct {
 	icTagBase					base;			/* "bfd" signature */
 	icUcrBg					data;			/* ucrBg structure*/
 } icUcrBgType;

icUInt8ArrayType

typedef struct {
 	icTagBase					base;			/* "ui08" signature */
 	icUInt8Array					data;			/* variable array of values */
 } icUInt8ArrayType;

icUInt16ArrayType

typedef struct {
 	icTagBase					base;			/* "ui16" signature */
 	icUInt16Array					data;			/* variable array of values */
 } icUInt16ArrayType;

icUInt32ArrayType

typedef struct {
 	icTagBase					base;			/* "ui32" signature */
 	icUInt32Array					data;			/* variable array of values */
 } icUInt32ArrayType;

icUInt64ArrayType

typedef struct {
 	icTagBase					base;			/* "ui64" signature */
 	icUInt64Array					data;			/* variable array of values */
 } icUInt64ArrayType;

icViewingConditionType

typedef struct {
 	icTagBase					base;			/* "view" signature */
 	icViewingCondition					view;			/* viewing conditions*/
 } icViewingConditionType;

icXYZType

typedef struct {
 	icTagBase					base;		/* "XYZ" signature */
 	icXYZArray					data;		/* variable array of XYZ numbers */
 } icXYZType;

CMM-Specific Attribute Definitions

The following attribute definitions in the icc.h header file are CMM-specific. These definitions are registered with the ICC and are available for public use.

Attribute Definitions

icHeader

typedef struct {
 	icUInt32Number							size;			/* Profile size in bytes */
 	icSignature							cmmId;			/* CMM for this profile */
 	icUInt32Number							version;			/* Format version number */
 	icProfileClassSignature							deviceClass;/* Type of profile */
 	icColorSpaceSignature							colorSpace;			/* Color space of data*/
 	icColorSpaceSignature							pcs;	 		/* PCS, XYZ or LAB only */
 	icDateTimeNumber							date;			/* Date profile was created */
 	icSignature							magic;			/* icMagicNumber */
 	icPlatformSignature							platform;			/* Primary Platform */
 	icUInt32Number							flags;			/* Various bit settings */
 	icSignature							manufacturer;				/* Device manufacturer */
 	icUInt32Number							model;			/* Device model number */
 	icUInt64Number							attributes;			/* Device attributes */
 	icUInt32Number							renderingIntent;					/* Rendering intent */
 	icXYZNumber							illuminant;			/* Profile illuminant */
 	icSignature							creator;			/* Profile creator */
 	icInt8Number							reserved[48];					/* Reserved for future */
 } icHeader;

icProfile

typedef struct {
 	icHeader							header;				/* header */
 	icUInt32Number				count;		/* number of tags in profile */
 	icInt8Number				data[icAny];		/* tagTable and tagData */

 /* Data the follows is of this form:
  * icTag					tagTable[icAny];					* tag table
  * icInt8Number					tagData[icAny];				 	* tag data
  */

 } icProfile;

icTag

typedef struct {
 	icTagSignature				sig;		/* tag signature */
 	icUInt32Number				offset;		/* start of tag relative to start of
 							 * header, See ICC spec, sect 8 */
 	icUInt32Number				size;		/* size in bytes */
 } icTag;

icTagList

typedef struct {
 	icUInt32Number				count;				/* number of tags in profile */
 	icTag				tags[icAny];				/* variable array of tags */
 } icTagList;