KCMS Application Developer's Guide
  Procure somente este livro
Fazer download desta apostila em PDF

KCMS Profile Attributes

5

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" on page 111 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 page 29). 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 page 28).

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" on page 138 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" on page 139 for the format of icTagList.

Example: Using icSigNumTag and icSigListTag

Code Example 5-1 shows you how to use icSigNumTag and icSigListTag.
Code 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;  

Code Example 5-1 icSigNumTag and icSigListTag (Continued)

  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" on page 113 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 below. (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
ProfileAttribute NameInterpretation
Input ProfileicSigAToB0TagNone
Display ProfileicSigAToB0TagNone
Output ProfileicSigBToA0TagPerceptual rendering
Output ProfileicSigBToA1TagColorimetric rendering
Output ProfileicSigBToA2TagSaturation rendering
Input ProfileicSigGrayTRCTagDepends on intent
Display ProfileicSigGrayTRCTagAdditive
Output ProfileicSigGrayTRCTagSubtractive
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

Attribute Name.........Attribute Type
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

Attribute Name...........Attribute Type
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
  • Color Space Conversion
  • Abstract
These profiles provide a standard implementation for use by the CMM in general color processing. They are for the convenience of CMMs, which may use these types to store calculated transformations.

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

Attribute Name...........Attribute Type
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

Attribute Name...........Attribute Type
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 system. 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
icSpotShape is used in the icScreening structure.


  /* 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;  

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





icUInt8Number





icInt16Number





icUInt16Number





icInt32Number


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


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


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


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


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

icUInt32Number





icInt64Number





icUInt64Number





icS15Fixed16Number





icU16Fixed16Number





icCrdInfo


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


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


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


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


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


  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 {  
      icUInt8NumberinputChan;/* Number of input channels */  
      icUInt8NumberoutputChan;/* Number of output channels */  
      icUInt8NumberclutPoints;/* Number of clutTable grid points */  
      icInt8Numberpad;  
      icS15Fixed16Numbere00;/* e00 in the 3 * 3 */  
      icS15Fixed16Numbere01;/* e01 in the 3 * 3 */  
      icS15Fixed16Numbere02;/* e02 in the 3 * 3 */  
      icS15Fixed16Numbere10;/* e10 in the 3 * 3 */  
      icS15Fixed16Numbere11;/* e11 in the 3 * 3 */  
      icS15Fixed16Numbere12;/* e12 in the 3 * 3 */  
      icS15Fixed16Numbere20;/* e20 in the 3 * 3 */  
      icS15Fixed16Numbere21;/* e21 in the 3 * 3 */  
      icS15Fixed16Numbere22;/* e22 in the 3 * 3 */  
      icUInt8Numberdata[icAny];/* Data follows see spec for size */  
  /*  
   *  Data that follows is of this form  
   *  
   *  icUInt8NumberinputTable[inputChan][256];* The input table  
   *  icUInt8NumberclutTable[icAny];* The clut table  
   *  icUInt8NumberoutputTable[outputChan][256];* The output table  
   */  
  } icLut8;  

icLut16























icMeasurement


  /* lut16 */  
  typedef struct {  
      icUInt8NumberinputChan;/* Number of input channels */  
      icUInt8NumberoutputChan;/* Number of output channels */  
      icUInt8NumberclutPoints;/* Number of clutTable grid points */  
      icInt8Numberpad;/* Padding for byte alignment */  
      icS15Fixed16Numbere00;/* e00 in the 3 * 3 */  
      icS15Fixed16Numbere01;/* e01 in the 3 * 3 */  
      icS15Fixed16Numbere02;/* e02 in the 3 * 3 */  
      icS15Fixed16Numbere10;/* e10 in the 3 * 3 */  
      icS15Fixed16Numbere11;/* e11 in the 3 * 3 */  
      icS15Fixed16Numbere12;/* e12 in the 3 * 3 */  
      icS15Fixed16Numbere20;/* e20 in the 3 * 3 */  
      icS15Fixed16Numbere21;/* e21 in the 3 * 3 */  
      icS15Fixed16Numbere22;/* e22 in the 3 * 3 */  
      icUInt16NumberinputEnt;/* Number of input table entries */  
      icUInt16NumberoutputEnt;/* Number of output table entries */  
      icUInt16Numberdata[icAny];/* Data follows see spec for size  
  */  
  /*  
   *  Data that follows is of this form  
   *  
   *  icUInt16NumberinputTable[inputChan][icAny];* The input table  
   *  icUInt16NumberclutTable[icAny];* The clut table  
   *  icUInt16NumberoutputTable[outputChan][icAny];* The output  
  table  
   */  
  } icLut16;  


  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:
icNamedColor


Note - icNamedColor is obsolete. Use icNamedColor2.

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






icScreening






icScreeningData






icText


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


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


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


  typedef struct {  
       icInt8Numberdata[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 {  
       icXYZNumberdata[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.
icCrdInfoType


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

icCurveType






icDataType






icDateTimeType






icLut8Type






icLut16Type


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


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


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


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


  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






icScreeningType


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


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

icSignatureType






icTagBase






icTextDescriptionType






icTextType






icU16Fixed16ArrayType


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


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


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


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


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

icUcrBgType






icUInt8ArrayType






icUInt16ArrayType






icUInt32ArrayType






icUInt64ArrayType


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


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


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


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


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

icViewingConditionType






icXYZType


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


  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.
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;