KCMS Application Developer's Guide

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;