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]
#define icMagicNumber 0x61637370L /* 'acsp' */ #define icVersionNumber 0x02000000L /* 2.0, BCD */ |
#define icPrtrDefaultScreensFalse 0x00000000L /* Bit position 0 */ #define icPrtrDefaultScreensTrue 0x00000001L /* Bit position 0 */ #define icLinesPerInch 0x00000002L /* Bit position 1 */ #define icLinesPerCm 0x00000000L /* Bit position 1 */ |
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 */ |
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 */ |
#define icAsciiData 0x00000000L /* Used in dataType */ #define icBinaryData 0x00000001L |
The following is used to indicate that this is a variable-length array.
#define icAny 1 |
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.
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 */ |
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; |
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; |
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; |
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; |
Currently, only icSigXYZData and icSigLabData are valid profile connection spaces (PCSs).
/* 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; |
/* 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; |
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 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 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 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; |
/* 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 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; |
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.
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; |
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; |
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; |
typedef struct { icUInt32Number dataFlag; /* 0 = ascii, 1 = binary */ icInt8Number data[icAny]; /* Data,size determined from tag */ } icData; |
/* The base date time number */ typedef struct { icUInt16Number year; icUInt16Number month; icUInt16Number day; icUInt16Number hours; icUInt16Number minutes; icUInt16Number seconds; } icDateTimeNumber; |
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; |
/* 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; |
/* 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; |
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:
icStandardObserver - See "icStandardObserver ".
icXYZNumber- See "icCurve ".
icMeasurementGeometry - See "icMeasurementGeometry ".
icIlluminant - See "icIlluminant ".
icNamedColor is obsolete. Use 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; |
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 { icInt8Number data[icAny]; /* Variable array of chars */ } icText; |
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; |
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; |
/* Structure describing either a UCR or BG curve */ typedef struct { icUInt32Number count; /* Curve length */ icUInt16Number curve[icAny]; /* The array of curve values */ } icUcrBgCurve; |
typedef struct { icXYZNumber illuminant; /* In candelas per metre sq'd */ icXYZNumber surround; /* In candelas per metre sq'd */ icIlluminant stdIluminant; /* See icIlluminant defines */ } icViewingCondition; |
typedef struct { icXYZNumber data[icAny]; /* Variable array of XYZ numbers */ } icXYZArray; |
typedef struct { icS15Fixed16Number X; icS15Fixed16Number Y; icS15Fixed16Number Z; } icXYZNumber; |