diff options
Diffstat (limited to 'debian/lcms/lcms-1.19.dfsg2/doc/LCMSAPI.TXT')
| -rwxr-xr-x | debian/lcms/lcms-1.19.dfsg2/doc/LCMSAPI.TXT | 2743 |
1 files changed, 2743 insertions, 0 deletions
diff --git a/debian/lcms/lcms-1.19.dfsg2/doc/LCMSAPI.TXT b/debian/lcms/lcms-1.19.dfsg2/doc/LCMSAPI.TXT new file mode 100755 index 00000000..7b0cd6c5 --- /dev/null +++ b/debian/lcms/lcms-1.19.dfsg2/doc/LCMSAPI.TXT @@ -0,0 +1,2743 @@ + + + little cms Engine 1.19 + + API Definition + + by Marti Maria + + --------------------------------------------------- + + Index + ----- + + 0 - Compilation toggles + 1 - Profile & Transform functions + 2 - Information functions + 3 - On-the-fly profile creation functions + 4 - Build-In profiles + 5 - White point + 6 - Gamma handling + 7 - Error handling + 8 - Conversion functions + 9 - CIECAM97s/CIECAM02 + 10 - Profile creation functions + 11 - LUT manipultation + 12 - Named color functions + 13 - PostScript + 14 - CGATS.13 - 200 + + + +0 - Compilation toggles +_________________________________ + +Generally, there is no need to touch anything. Comment/uncomment if the +testbet hints to do so. + +Optimization mode. + + USE_ASSEMBLER Is fastest by far, but it is limited to Pentium. + USE_FLOAT are the generic floating-point routines. + USE_C should work on virtually any machine. + + + + Define this if you are using this package as a DLL (windows only) + + LCMS_DLL + +Define this if you are compiling using this package as a DLL (windows only) + + LCMS_DLL_BUILD + + + Uncomment if you are trying the engine in a non-windows environment + like linux, SGI, VAX, FreeBSD, BeOS, etc. + + NON_WINDOWS + + Uncomment this one if you are using big endian machines (only meaningful + when NON_WINDOWS is used) + + USE_BIG_ENDIAN + + Uncomment this one if your compiler/machine does support the +"long long" type This will speedup fixed point math. (USE_C only) + + USE_INT64 + +Some machines does not have a reliable 'swab' function. Usually +leave commented unless the testbed diagnoses the contrary. + USE_CUSTOM_SWAB + +Uncomment this if your compiler supports inline + + USE_INLINE + +Uncomment this if your compiler doesn't work with fast floor function + + USE_DEFAULT_FLOOR_CONVERSION + +Define this one if you are using windows.h in a non-windows environment + + LCMS_WIN_TYPES_ALREADY_DEFINED + +Define this one if you want lcms.h just defining public API + + LCMS_APIONLY + + + + + +1 - Profile & Transform functions +_________________________________ + + These are the basic functions on making transformations. For + simpler operation, you must open two profiles using + cmsOpenProfileFromFile(), then create a transform with these + opened profiles with cmsCreateTransform(). Using this transform + you can color correct your bitmaps by cmsDoTransform(). When you + are done you must free the transform AND the profiles by + cmsDeleteTransform() and cmsCloseProfile(). + + +_________________________________________________________________________________ + + cmsHPROFILE cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess); +_________________________________________________________________________________ + + Opens a profile returning a handle to it. The profile must be + contained in a file on disk. + +Parameters: + + ICCProfile: File name w/ full path. + sAccess: "r" for normal operation, "w" for profile creation + +Returns: + + NULL on error, a profile handle on success. + +Example: + + void GetProductNameOf(const char *ICMProfileFile) + { + cmsHPROFILE hProfile + + hProfile = cmsOpenProfileFromFile(ICMProfileFile, "r"); + if (hProfile == NULL) printf("Error!"); + else { + printf("%s\n", cmsGetProductName(hProfile)); + cmsCloseProfile(hProfile); + } + } + +_________________________________________________________________________________ + +cmsHPROFILE cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize); +_________________________________________________________________________________ + + Same as anterior, but profile is contained in memory. Usefull + for embedded profiles. MemPtr must point to a buffer of at + least dwSize bytes. This buffer must hold a full profile image. + Memory must be contiguous. + +Parameters: + + MemPtr: Points to a block of contiguous memory containing the profile + dwSize: Profile's size measured in bytes. + +Returns: + + NULL on error, a profile handle on success. + + +_________________________________________________________________________________ + +LCMSBOOL cmsCloseProfile(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Closes a profile handle and frees associated memory. Note that + cmsDeleteTransform() does NOT close the involved profiles. You + must close any opened profile handle on cleanup. + + +Parameters: + hProfile: Handle to an open profile + +Returns: + FALSE on error, TRUE on success + +Comments: + + Can return error when creating profile if the profile is not + properly flushed to disk. + + +_________________________________________________________________________________ + + cmsHTRANSFORM cmsCreateTransform(cmsHPROFILE Input, + DWORD InputFormat, + cmsHPROFILE Output, + DWORD OutputFormat, + int Intent, + DWORD dwFlags); . +_________________________________________________________________________________ + +Creates a transform for translating bitmaps. + +Parameters: + + Input, Output: Input, Output profile handles + + Input, Output format: This value describes how values are to be + coded. It is formed by a combination of + channels, bitdepths andextra samples. See + below. + + for example: + + TYPE_BGR_8 : 3 channels of 8 bits, using Windows convention + TYPE_RGB_8 : 3 channels of 8 bits per component + TYPE_RGB_16 : 3 channels of 16 bits per component + TYPE_RGBA_8 : 4 channels, 3 containing RGB of 8 bpc, and one channel of 8 bits holding alpha + ... + + Note than even some Lab and XYZ are defined, these specifiers + has nothing to do with colorspaces, but only how data is + encoded. The CMM will only check for same colorspace as profile. + + + Intent: The ICC intent to apply. If an appropiate tag for this + intent is not found, no error is raised and the intent + is reverted to perceptual. See the tutorial for a + explanation of intents. + + + INTENT_PERCEPTUAL 0 + INTENT_RELATIVE_COLORIMETRIC 1 + INTENT_SATURATION 2 + INTENT_ABSOLUTE_COLORIMETRIC 3 + + + + dwFlags: This value commands on how to handle the whole + process. Some or none of this values can be joined + via the or | operator. + + + cmsFLAGS_MATRIXINPUT: CLUT ignored on input profile, + matrix-shaper used instead (for + speed, and debugging purposes) + + cmsFLAGS_MATRIXOUTPUT: Same as anterior, but for output + profile only. + + cmsFLAGS_MATRIXONLY: Both input and output are forced to + matrix-shaper. + + cmsFLAGS_NOTPRECALC: By default, lcms smelt luts into a + device-link CLUT. This speedup whole + transform greatly. If you don't + wanna this, and wish every value to + be translated to PCS and back to + output space, include this flag. + + + cmsFLAGS_NULLTRANFORM: Don't transform anyway, only apply + pack/unpack routines (usefull to + deactivate color correction but keep + formatting capabilities) + + cmsFLAGS_HIGHRESPRECALC: Use 48 points instead of 33 for + device-link CLUT precalculation. Not needed + but for the most extreme cases of mismatch + of "impedance" between profiles. + + + cmsFLAGS_LOWRESPRECALC: Use lower resolution table. + + + cmsFLAGS_GRIDPOINTS(n): You can specify the desired number of gridpoints + in devicelink by using this macro in the flags. + + cmsFLAGS_BLACKPOINTCOMPENSATION: Use BPC algorithm. + + cmsFLAGS_PRESERVEBLACK: Preserve K channel on CMYK -> CMYK transforms + + cmsFLAGS_NOTCACHE: Inhibit the 1-pixel built-in cache + + cmsFLAGS_NOWHITEONWHITEFIXUP: Do NOT fix white-on-white broken profiles + + cmsFLAGS_NOPRELINEARIZATION: Do NOT use prelinearization tables + + +Returns: + + NULL on error, a transform handle on success. + +Comments: + + This function tries to build a device link profile using the + Input and Output profiles. This small time-consuming penalty (3 + sec. on a Pentium-100) does accelerate the bitmap transform + process greately. You can override this behaviour if you wish, + or if you plan to transform only a couple of pixels by using + cmsFLAGS_NOTPRECALC on dwFlags parameter. But normally it will + be better leave this flag alone. + + Also, in this function is where you must specify the format of + the input and output bitmaps. The InputFormat and OutputFormat + parameters are formed by combining several bits: + +// Format of pixel is defined by one integer, using bits as follows +// +// TTTTT - Y F P X S EEE CCCC BBB +// +// T: Pixeltype +// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) +// P: Planar? 0=Chunky, 1=Planar +// X: swap 16 bps endianess? +// S: Do swap? ie, BGR, KYMC +// E: Extra samples +// C: Channels (Samples per pixel) +// B: Bytes per sample +// Y: Swap first - changes ABGR to BGRA and KCMY to CMYK +// -: Unused (reserved) + + + +lcms.h does include several predefined specifiers, as examples: + + TYPE_RGB_8 8 bits per sample RGB + TYPE_BGR_8 8 bits per sample BGR (Windows Bitmaps are often + coded in this way) + TYPE_RGB_16 16 bits per sample RGB + TYPE_RGBA_8 8 bits per sample RGB plus alpha channel. Alpha is + ignored by lcms. + TYPE_RGBA_16 16 bits per sample RGB plus alpha. + TYPE_XYZ_16 16 bits fixed 15.16 XYZ (used in PCS) + TYPE_Lab_8 8 bits per sample Lab + TYPE_Lab_16 16 bits per sample Lab + TYPE_CMY_8 8 bits per sample CMY + TYPE_CMY_16 16 bits per sample CMY + TYPE_CMYK_8 8 bits per sample CMYK + TYPE_CMYK_16 16 bits per sample CMY + +You can build your own specifiers if you wish by combining the following macros with the bitwise OR operator | + + + DOSWAP_SH(e) 1 or 0 depending on swap even channels + EXTRA_SH(e) up to 7 extra channels + CHANNELS_SH(c) up to 4 handled channels + BYTES_SH(b) 1 if 16 bits per sample, 0 if 8 bits per sample + ENDIAN16_SH(e) 1 if 16 bits samples comes swapped. + SWAPFIRST_SH(s) 1 changes ABGR to BGRA and KCMY to CMYK + FLAVOR_SH(s) 0 = BlackIsZero (Chocolate) 1=WhiteIsZero (Vanilla, Negative) + PLANAR_SH(p) 0 = Chunky, 1=Planar + COLORSPACE_SH(s) + + Available Colorspaces + ===================== + + PT_ANY Don't check colorspace + 1 & 2 are reserved + PT_GRAY + PT_RGB + PT_CMY + PT_CMYK + PT_YCbCr + PT_YUV + PT_XYZ + PT_Lab + PT_YUVK + PT_HSV + PT_HLS + PT_Yxy + + +See the lcms.h for more information on how to build format specifiers. + + +_________________________________________________________________________________ + +cmsHTRANSFORM cdecl cmsCreateProofingTransform(cmsHPROFILE Input, + DWORD InputFormat, + cmsHPROFILE Output, + DWORD OutputFormat, + cmsHPROFILE Proofing, + int Intent, + int ProofingIntent, + DWORD dwFlags); +_________________________________________________________________________________ + + + Same as cmsCreateTransform(), but including soft-proofing. The + obtained transform emulates the device described by the + "Proofing" profile. Useful to preview final result whithout + rendering to physical medium. + + Parameters and returns same as anterior, but with the addition of + + Proofing: a handle to proofing profile. + + ProofingIntent: Is the intent for translating emulated + colors. Default is + + INTENT_ABSOLUTE_COLORIMETRIC. + + dwFlags: + + + cmsFLAGS_GAMUTCHECK: Color out of gamut are flagged to a + fixed color defined by the function + cmsSetAlarmCodes(int r, int g, int b); + + cmsFLAGS_SOFTPROOFING: (Does need preview tag to work) does + emulate the Proofing device. + + + You need to add a combination of these flags to enable any proof! + + + +_________________________________________________________________________________ + +cmsHTRANSFORM cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], + int nProfiles, + DWORD InputFormat, + DWORD OutputFormat, + int Intent, + DWORD dwFlags); +_________________________________________________________________________________ + + + User passes in an array of handles to open profiles. The returned handle + does "smelt" all profiles in only one devicelink. Following rules should + be followed: + + - Colorspaces must be paired with the exception of + Lab/XYZ, that can be interchanged. + + - Profile must be Matrix-shaper, or hold the + apropiate tag, device-to-pcs or pcs-to-device on depending + on profile location. + + - All colorspaces up to 4 (significant) channels can be used + anywhere on the chain, Hexachrome separation or more can only + appair at last step. This limitation is intended to be solved in + future releases. + + + Let's take as example, how to apply a abstract profile into a SRGB image. + The chain would be sRGB -> Abstract -> sRGB. So, we would open sRGB and the + abstract profile, and fill the array + + Profiles[0] = hsRGB; + Profiles[1] = hAbstract; + Profiles[2] = hsRGB; + + cmsCreateMultiprofileTransform(Profiles, 3, TYPE_RGB_8, TYPE_RGB_8, INTENT_PERCEPTUAL, 0); + + + + WARNING: he dE rises with the number of profiles. + + This can be used, for example, with abstract profiles. For example, abstract + profiles can be applied into a typical profile-to-profile color flow to model + viewing conditions. + + Once created, the transform will behave just like any other. + + +_________________________________________________________________________________ + +void cmsDeleteTransform(cmsHTRANSFORM hTransform); +_________________________________________________________________________________ + +Closes a transform handle and frees associated memory. + +Parameters: + hTransform: The transform handle to be deleted. + + + Comments: This function does NOT free any profiles associated + with the transform. Is programmer's responsability to free + them. + + + +_________________________________________________________________________________ + +void cmsDoTransform(cmsHTRANSFORM hTransform, + LPVOID InputBuffer, + LPVOID OutputBuffer, unsigned int Size); +_________________________________________________________________________________ + + This function translates bitmaps according of transform. Format + of buffers is described by InputFormat and OutputFormat + parameters in function cmsCreateTransform() or + cmsCreateProofingTransform() + +Parameters: + hTransform: A handle to a transform describing the translation. + InputBuffer: A pointer to a input bitmap + OutputBuffer: A pointer to a output bitmap. + Size: the number of PIXELS to be transformed. + +Comments: + + Windows, stores the bitmaps in a particular way... for speed + purposes, does align the scanlines to doubleword boundaries, so + a bitmap has in windows always a size multiple of 4. This is + ok, since no matter if you waste a couple of bytes, but if you + call cmsDoTransform() and passes it WHOLE image, lcms doesn't + know nothing about this extra padding bytes. So, it assumes + that you are passing a block of BGR triplets with no alignment + at all. This result in a strange looking "lines" in obtained + bitmap. + + The solution most evident is to convert scanline by scanline + instead of whole image. This is as easy as to add a for() loop, + and the time penalty is so low that is impossible to detect. + + + +_________________________________________________________________________________ + +void cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, + DWORD dwInputFormat, + DWORD dwOutputFormat) +_________________________________________________________________________________ + + + This function does change the encoding of buffers in a yet-existing transform. + + + Parameters: + + hTransform: A handle to the transform. + + Input, Output format: This value describes how values are to be + coded. It is formed by a combination of + channels, bitdepths andextra samples. + See cmsCreateTransform for more info. + + Notes: + + Colorspace is *not* checked + + +_________________________________________________________________________________ + +cmsHPROFILE cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags); +_________________________________________________________________________________ + + + Generates a device-link profile from a transform. This profile can then be used + by any other function accepting profile handle, or be saved on disk + by _cmsSaveProfile(). See icclink.c for a sample. + + +Parameters: + + hTransform: A handle to the transform. + + Flags: + + cmsFLAGS_GUESSDEVICECLASS: Mark the profile profile class "guessing" + from input & output colorspaces. + + cmsFLAGS_HIGHRESPRECALC: Use 48 points instead of 33 for + device-link CLUT precalculation. Not needed + but for the most extreme cases of mismatch + of "impedance" between profiles. + + + cmsFLAGS_LOWRESPRECALC: Use lower resolution table. + + + cmsFLAGS_GRIDPOINTS(n): You can specify the desired number of gridpoints + in devicelink by using this macro in the flags. + + cmsFLAGS_BLACKPOINTCOMPENSATION: Use BPC algorithm. + + cmsFLAGS_PRESERVEBLACK: Preserve K channel on CMYK -> CMYK transforms + + cmsFLAGS_NOTCACHE: Inhibit the 1-pixel built-in cache + + cmsFLAGS_NOWHITEONWHITEFIXUP: Do NOT fix white-on-white broken profiles + + cmsFLAGS_NOPRELINEARIZATION: Do NOT use prelinearization tables + + + + + + +2 - Information functions +_________________________________________________________________________________ + + These functions are intended for identify profiles. Its main use + if for building user interfaces. + + + +_________________________________________________________________________________ + +void cmsSetLanguage(int LanguageCode, int CountryCode); +_________________________________________________________________________________ + + This function applies only to v4 profiles, which may have multilocalized + strings for information functions. Using cmsSetLanguage(), you set the preferred + language and country in what you want the information. All strings are searched + for an exact match of language and country. In none found, then another search + is done for same language, ignoring country. If no matching is found, the first + string in table is returned. + + +Parameters: + LanguageCode: first name language code from ISO-639. + http://lcweb.loc.gov/standards/iso639-2/iso639jac.html + + + CountryCode: first name region code from ISO-3166. + http://www.iso.ch/iso/en/prods-services/iso3166ma/index.html + + + +_________________________________________________________________________________ + +const char* cmsTakeProductName(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Returns a pointer to a string containing the product name. The + string is holded in a static buffer that is overwritten in + every call to this function. + +Parameters: + hProfile: Handle to an open profile + + + +_________________________________________________________________________________ + +const char* cmsTakeProductDesc(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Returns a pointer to a string containing the product Description. The + string is holded in a static buffer that is overwritten in + every call to this function. + +Parameters: + hProfile: Handle to an open profile + +Returns: + Product description in a static buffer overwritten in each + call to this function. + +_________________________________________________________________________________ + +const char* cmsTakeProductInfo(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Returns a pointer to a string containing additional info about + hProfile. The string is holded in a static buffer overwritten + in each call to this function. + +Parameters: + hProfile: Handle to an open profile + +Returns: + Product info in a static buffer overwritten in each + call to this function. + + +_________________________________________________________________________________ + +const char* cmsTakeManufacturer(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Returns a pointer to a string containing uncooked info about + manufacturer. The string is holded in a static buffer overwritten + in each call to this function. + +Parameters: + hProfile: Handle to an open profile + +Returns: + Manufacturer in a static buffer overwritten in each + call to this function. + +_________________________________________________________________________________ + +const char* cmsTakeModel(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Returns a pointer to a string containing uncooked info about + model. The string is holded in a static buffer overwritten + in each call to this function. + +Parameters: + hProfile: Handle to an open profile + +Returns: + Model description in a static buffer overwritten in each + call to this function. + +_________________________________________________________________________________ + +const char* cmsTakeCopyright(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Returns a pointer to a string containing uncooked info about + copyright. The string is holded in a static buffer overwritten + in each call to this function. + +Parameters: + hProfile: Handle to an open profile + +Returns: + Copyright info in a static buffer overwritten in each + call to this function. + +_________________________________________________________________________________ + +icColorSpaceSignature cmsGetPCS(cmsHPROFILE hProfile) +_________________________________________________________________________________ + + This function returns the PCS used by the hProfile, using the + ICC convention. + +Parameters: + hProfile: Handle to an open profile + +Returns: + The PCS of the profile + + +_________________________________________________________________________________ + +icColorSpaceSignature cmsGetColorSpace(cmsHPROFILE hProfile) +_________________________________________________________________________________ + + This function returns the Color space used by the hProfile, + using the ICC convention. + +Parameters: + hProfile: Handle to an open profile + +Returns: + The color space of the profile + + +_________________________________________________________________________________ + +DWORD cmsGetProfileICCversion(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Returns the ICC version as stated in the header of the profile. + + Examples: + + V2 profiles: 0x2000000 + V4 profiles: 0x4000000 + +Parameters: + hProfile: Handle to an open profile + +Returns: + The profile version stamp + + +_________________________________________________________________________________ + +icProfileClassSignature cmsGetDeviceClass(cmsHPROFILE hProfile) +_________________________________________________________________________________ + + This function returns the Device class of hProfile, using the + ICC convention. + + +Parameters: + hProfile: Handle to an open profile + +Returns: + The device class of the profile + + +_________________________________________________________________________________ + +LCMSBOOL cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); +_________________________________________________________________________________ + + This function takes the white point of hProfile. + +Parameters: + + + Dest: a pointer to an cmsCIEXYZ struct that will hold the + media white point + hProfile: Handle to an open profile + + +Returns: + FALSE on error, TRUE on success + +_________________________________________________________________________________ + +LCMSBOOL cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); +_________________________________________________________________________________ + +This function takes the contents of black point tag of hProfile if present. + + +Parameters: + Dest: a pointer to an cmsCIEXYZ struct that will + hold the media black point. + + hProfile: Handle to an open profile + +Returns: + FALSE on error, TRUE on success + +NOTES: Most profiles have garbage in this tag, for a suitable black point +detection use cmsDetectBlackPoint() instead. + + +_________________________________________________________________________________ + +LCMSBOOL cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile); +_________________________________________________________________________________ + +This function takes the value of PCS illuminant of hProfile. + +Parameters: + hProfile: Handle to an open profile + Dest: a pointer to an cmsCIEXYZ struct that will + hold the illuminant white point + +Returns: + FALSE on error, TRUE on success + + Notes: ICC states that profile illuminants MUST be D50. However, + in real world, each manufacturer uses an illuminant value that + differs slightly of D50. lcms forces it to D50 to prevent errors. + + +_________________________________________________________________________________ + +LCMSBOOL cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile); +_________________________________________________________________________________ + + This function takes the value of colorant matrix of hProfile if + present. + +Parameters: + hProfile: Handle to an open profile + Dest: a pointer to an cmsCIEXYZ struct that will + hold the illuminant white point + +Returns: + FALSE on error, TRUE on success + + + Notes: Some profiles includes colorants even if a CLUT is already present. + Often this colorants are private values, or a way to allow the profile + operate in reverse direction. + + + + +_________________________________________________________________________________ + +icInt32Number cmsGetTagCount(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Return number of tags contained in a profile + +Parameters: + hProfile: Handle to an open profile + +Returns: + Number of tags + + + +_________________________________________________________________________________ + +icTagSignature cmsGetTagSignature(cmsHPROFILE hProfile, icInt32Number n); +_________________________________________________________________________________ + + + Enumerates tags in a profile + +Parameters: + hProfile: Handle to an open profile + n : Tag ordinal + + +Returns: + Tag signature + + +_________________________________________________________________________________ + +LCMSBOOL cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig); +_________________________________________________________________________________ + + Tests whatever a particular tag is present in hProfile. + +Parameters: + hProfile: Handle to an open profile + sig: a tag signature + +Returns: + FALSE if not present, TRUE if tag is found + + + +_________________________________________________________________________________ + +int cmsTakeRenderingIntent(cmsHPROFILE hProfile); +_________________________________________________________________________________ + +Returns the rendering intent field of the header. This field is informative and not +used by the CMM for any purpose. + +Parameters: + hProfile: Handle to an open profile + +Returns: one of the following values: + + INTENT_PERCEPTUAL 0 + INTENT_RELATIVE_COLORIMETRIC 1 + INTENT_SATURATION 2 + INTENT_ABSOLUTE_COLORIMETRIC 3 + +_________________________________________________________________________________ + +int cmsTakeHeaderFlags(cmsHPROFILE hProfile); +_________________________________________________________________________________ + +Returns the flags field of the ICC profile header. These are flags to indicate +various hints for the CMM such as distributed processing and caching options. +The least significant 16 bits are reserved for the ICC. + + Currently (v4.2) there are only two ICC flags defined: + + Bit Meaning + --- ------------------------------------------------------------- + 0 Embedded Profile (0 if not embedded, 1 if embedded in file) + 1 Profile cannot be used independently from the embedded color data + (set to 1 if true, 0 if false) + +Parameters: + hProfile: Handle to an open profile + +Returns: + The header flags + + + +_________________________________________________________________________________ + +int cmsTakeHeaderAttributes(cmsHPROFILE hProfile); +_________________________________________________________________________________ + +Returns the attributes field of the ICC profile header. The device attributes +field shall contain flags used to identify attributes unique to the particular +device setup for which the profile is applicable. + + Currently (v4.2) there are only two ICC attributes defined: + + Bit Meaning + --- ------------------------------------------------------------- + 0 0=icReflective 1=icTransparency + 1 0=icGlossy 1=icMatte + +Parameters: + hProfile: Handle to an open profile + +Returns: + The header attributes + + +_________________________________________________________________________________ + +LCMSBOOL cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection); +_________________________________________________________________________________ + + + This one helps on inquiring if a determinate intent is + supported by an opened profile. You must give a handle to + profile, the intent and a third parameter specifying how the + profile would be used. The function does return TRUE if intent + is supported or FALSE if not. If the intent is not supported, + lcms will use default intent (usually perceptual). + +Parameters: + + hProfile: Handle to an open profile + + Intent: one of the following values: + + INTENT_PERCEPTUAL 0 + INTENT_RELATIVE_COLORIMETRIC 1 + INTENT_SATURATION 2 + INTENT_ABSOLUTE_COLORIMETRIC 3 + + Direction: + + LCMS_USED_AS_INPUT 0 + LCMS_USED_AS_OUTPUT 1 + LCMS_USED_AS_PROOF 2 + +Returns: + + TRUE if intent is supported or FALSE if not. + If the intent is not supported, lcms will use default + intent (usually perceptual). + + +_________________________________________________________________________________ + +LCMSBOOL cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len); +_________________________________________________________________________________ + + Retrieves the target data the profiler has used to build the profile. Usage + of this tag is optional. The lprof profiles does store such information when + "verbose" mode is selected. + + Parameters: + + hProfile: Handle to an open profile + + Data: Pointer to a pointer to a bite block. This function allocates + this block by calling malloc(). User is responsible of free it after + use. + + size: Pointer to a size_t variable holding the size of datablock. + Returns: + + TRUE on success, FALSE on error or if the profile has not such tag. + + + + Example: + + char* TargetData; + size_t len; + + cmsTakeCharTargetData(hProfile, &Data, &len); + + ... do whatsever with Data... + + free(Data); + + +_________________________________________________________________________________ + +const LPBYTE cmsTakeProfileID(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + + Returns the 16-bytes profile ID (version 4 only). The ProfileID is holded in + a static buffer overwritten in each call to this function. + +Parameters: + + hProfile: Handle to an open profile + +Returns: + A pointer to a static buffer holding the 16 bytes ID. This buffer + is overwritten in each function call. + + + + + +_________________________________________________________________________________ + +LCMSBOOL _cmsIsMatrixShaper(cmsHPROFILE hProfile); +_________________________________________________________________________________ + + Tests whatever a particular profile is implemented as Matrix-shaper- + +Parameters: + hProfile: Handle to an open profile + +Returns: + TRUE or FALSE about profile being implemented as matrix-shaper + + +_________________________________________________________________________________ + +void cmsSetAlarmCodes(int r, int g, int b) +_________________________________________________________________________________ + + Used to establish the out-of-gamut alarm color. This color will + replace all out-of-gamut colors if sFLAGS_GAMUTCHEK is used in + dwFlags parameter. See cmsCreateTransform() + + +_________________________________________________________________________________ + +void _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth); +_________________________________________________________________________________ + + INTERNAL, USE WITH CAUTION. + + Used to inform the profile writting logic that all LUTS should be written + in 8-bit resolution. lcms currently allows to write profiles with same + resolution in all LUTS. Incoming versions may fix that. + +Parameters: + + hProfile: Handle to an open profile + + depth: either 8 or 16 + + + +_________________________________________________________________________________ + +LCMSBOOL _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName); +LCMSBOOL _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, size_t* BytesNeeded); +_________________________________________________________________________________ + + INTERNAL, USE WITH CAUTION. + + Dumps the contents of a profile FULLY GENERATED BY USING VIRTUAL PROFILES to disk + or memory. Disk based profiles are not suitable for these functions. + + DEPRECATED, use cmsOpenProfileFromFile() with a "w" as access mode instead. + + + + +_________________________________________________________________________________ + +3 - On-the-fly (virtual) profile creation functions +_________________________________________________________________________________ + + These function gives the ability of create virtual profiles. + These profiles are often used in modelling monitors, but can + also be used as any input or output device. Once created, you + can use the profile handle like another file-based profile. + + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreateGrayProfile(LPcmsCIExyY WhitePoint, + LPGAMMATABLE TransferFunction) + +_________________________________________________________________________________ + +Creates a grayscale virtual profile based on white point and transfer tables. + +Parameters: + + White point: You can specify chromacity of white point, + or use cmsWhitePointFromTemp() to generate + the white point from temperature. + + Gamma tables: You can directly specify tables or use the + gamma handling functions for obtaining these + tables + + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreateRGBProfile(LPcmsCIExyY WhitePoint, + LPcmsCIExyYTRIPLE Primaries, + LPGAMMATABLE TransferFunction[3]) +_________________________________________________________________________________ + + Creates a virtual profile based in primaries, white point and + transfer tables. + +Parameters: + + White point: You can specify chromacity of white point, + or use cmsWhitePointFromTemp() to generate + the white point from temperature. + + Primaries: The primaries (the TRUE primaries, not the + colorants) of the device. + + Gamma tables: You can directly specify tables or use the + gamma handling functions for obtaining these + tables + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorSpace, + LPGAMMATABLE TransferFunctions[]); +_________________________________________________________________________________ + + Creates a specialized devicelink, operating in space "ColorSpace". This devicelink + has only linearization tables. Usefull for embedding gamma/brightness/contrast controls + in a multiprofile transform. + + + TransferFunctions[] must contain as many curves as components has the target + color space. For example, RGB must be 3 curves. CMYK needs 4 curves. + + +_________________________________________________________________________________ + +cmsHPROFILE LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature ColorSpace, + double Limit) +_________________________________________________________________________________ + + Creates a specialized devicelink, operating in space "ColorSpace". This devicelink + handles ink-limiting feature. Useful for RIP construction and other goodies + +Parameters: + + hTransform: A handle to the transform. + Limit: The amount of ink-limit, in pertentage. Allowable values are from 0% to 400% + +Notes: + Currently only works on CMYK, but Hexachrome support is expected in + future revisions. + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreateBCHSWabstractProfile(int nLUTPoints, + double Bright, + double Contrast, + double Hue, + double Saturation, + int TempSrc, + int TempDest); + +_________________________________________________________________________________ + + Creates a abstract devicelink operating in Lab for Bright/Contrast/Hue/Saturation + and white point translation. White points are specified as temperatures ºK + + + Parameters: + + int nLUTPoints : Resulting CLUT resolution + double Bright : Bright increment. May be negative + double Contrast : Contrast increment. May be negative. + double Hue : Hue displacement in degree. + double Saturation : Saturation increment. May be negative + int TempSrc : Source white point temperature + int TempDest : Destination white point temperature. + + +Renges: + Bright: + + +_________________________________________________________________________________ + +4 - Built-In profiles +_________________________________________________________________________________ + + These are standard profiles optimized for speed. + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreateLabProfile(LPcmsCIExyY WhitePoint); +_________________________________________________________________________________ + + Creates a virtual profile of CIE Lab. If WhitePoint is NULL, + then D50 is assumed. It uses v2 PCS encoding. + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreateLab4Profile(LPcmsCIExyY WhitePoint); +_________________________________________________________________________________ + + Creates a virtual profile of CIE Lab operanting in v4 PCS encoding. + If WhitePoint is NULL, then D50 is assumed. + + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreateXYZProfile(void); +_________________________________________________________________________________ + + Creates a virtual XYZ profile (Assumes D50) + + +_________________________________________________________________________________ + +cmsHPROFILE cmsCreate_sRGBProfile(void); +_________________________________________________________________________________ + + Creates a virtual profile of sRGB standard colorspace. + + + +_________________________________________________________________________________ + +5 - White point +_________________________________________________________________________________ + + +_________________________________________________________________________________ + +LCMSBOOL cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint); +_________________________________________________________________________________ + + Obtains the chromaticity of white point based on temperature §K + +Parameters: + + TempK: Temperature in §K + +Returns: + FALSE on error, TRUE on success + + + + +_________________________________________________________________________________ + +LCMSAPI LCMSBOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result, + LPcmsCIEXYZ SourceWhitePt, + LPcmsCIEXYZ Illuminant, + LPcmsCIEXYZ Value); +_________________________________________________________________________________ + + + Provides a model-dependent chromatic adaptation between two illuminants, + actually it uses a Von-Kries approximation of Bradford, using the Lam-Rigg + cone responses. It Is under consideration to be replaced for a more + proper model like CIECAM97s in futures versions. + + + Parameters: + Result: Points to resulting XYZ color + SourceWhitePoint: original white point + Illuminant: adapting illuminant + Value: the original color + + Returns: + + FALSE on error, TRUE on success + + + +_________________________________________________________________________________ + +double cmsSetAdaptationState(double d); + +_________________________________________________________________________________ + +Specifies adaptation state of observer for V4 absolute colorimetric transforms. +Only two values are implemented: + + d = 0: No adaptation + d = 1: Observer is fully adapted + + + +_________________________________________________________________________________ + +6 - Gamma handling functions +_________________________________________________________________________________ + + + This is the struct of a gamma table (or transfer function) + + typedef struct { + int nEntries; + WORD GammaTable[1]; + + } GAMMATABLE, FAR* LPGAMMATABLE; + + That is, first it comes a 32 integer for entry count, followed of + a variable number of words describing the table. The easiest way to + generate a gamma table is to use the following function + + +_________________________________________________________________________________ + +LPGAMMATABLE cmsBuildGamma(int nEntries, double Gamma); +_________________________________________________________________________________ + + Allocates an fill a table describing generic gamma. + + You must specify the number of entries your table will consist of, + and the float value for gamma. + +_________________________________________________________________________________ + +LPGAMMATABLE cmsBuildParametricGamma(int nEntries, int Type, double Params[]); +_________________________________________________________________________________ + + + Does build a parametric curve based on parameters. + + Params[] does contain Gamma, a, b, c, d, e, f + + + Type 1 : + X = Y ^ Gamma | Gamma = Params[0] + + Type 2 : + CIE 122-1966 + Y = (aX + b)^Gamma | X >= -b/a + Y = 0 | else + Type 3: + + IEC 61966-3 + Y = (aX + b)^Gamma | X <= -b/a + Y = c | else + + Type 4: + IEC 61966-2.1 (sRGB) + Y = (aX + b)^Gamma | X >= d + Y = cX | X < d + + Type 5: + + Y = (aX + b)^Gamma + e | X <= d + Y = cX + f | else + + + Giving negative values for Type does result in reversed curve. + + +_________________________________________________________________________________ + +LPGAMMATABLE cmsAllocGamma(int nEntries); +_________________________________________________________________________________ + + Allocates space for a gamma table, memory is unitialized. + + +_________________________________________________________________________________ + +void cmsFreeGamma(LPGAMMATABLE Gamma); +_________________________________________________________________________________ + + Frees a gamma table + + +_________________________________________________________________________________ + +LPGAMMATABLE cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma); +_________________________________________________________________________________ + + Reverses a gamma table resampling it in a new table. + + This function reverses the gamma table if it can be done. lcms does not + detect whatever a non-monotonic function is given, so wrong input can + result in ugly results: not to be a problem since "normal" gamma curves + are not collapsing inputs at same output value. The new curve will be + resampled to nResultSamples entries. + + +_________________________________________________________________________________ + +LPGAMMATABLE cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma); +_________________________________________________________________________________ + + Obtains a table joining two tables, one as input and other as + output. Output table is reversed and then composited with input gamma. + + This will let you to "refine" the generic gamma for monitors (2.1 or 2.2 + are usual values) to match viewing conditions of more or less background + light. Note that this function uses TABULATED functions, so very exotic + curves can be obtained by combining transfer functions with reversed + gamma curves. Normally there is no need of worry about such gamma + manipulations, but the functionality is here if you wish to use. + + +_________________________________________________________________________________ + +LCMSBOOL cmsSmoothGamma(LPGAMMATABLE Tab, double lambda); +_________________________________________________________________________________ + + Does smooth the curve contained into Tab. Smooth curves does work better + and more pleasant to eye. + +Parameters: + + Tab: Table to be smoothed + lambda: The smoothing factor. 0..500 is the working range. + +Returns: + + TRUE on success. FALSE on error + + +_________________________________________________________________________________ + +double cmsEstimateGamma(LPGAMMATABLE t); +double cmsEstimateGammaEx(LPWORD Table, int nEntries, double Thereshold); +_________________________________________________________________________________ + + Returns a numerical estimation of the apparent gamma on the given table. +_________________________________________________________________________________ + +LPGAMMATABLE cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig); +LPGAMMATABLE cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSignature sig); +int cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Text); +int cmsReadICCTextEx(cmsHPROFILE hProfile, icTagSignature sig, char *Text, size_t size); +_________________________________________________________________________________ + + + + +_________________________________________________________________________________ + +LPcmsSEQ cmsReadProfileSequenceDescription(cmsHPROFILE hProfile); +void cmsFreeProfileSequenceDescription(LPcmsSEQ pseq); +_________________________________________________________________________________ + + Reads and free profile sequence description structure + + +_________________________________________________________________________________ + +void cmsSetUserFormatters(cmsHTRANSFORM hTransform, DWORD dwInput, cmsFORMATTER Input, + DWORD dwOutput, cmsFORMATTER Output); + +void cmsGetUserFormatters(cmsHTRANSFORM hTransform, + LPDWORD InputFormat, cmsFORMATTER* Input, + LPDWORD OutputFormat, cmsFORMATTER* Output); + +_________________________________________________________________________________ + + + + +_________________________________________________________________________________ + +7 - Error handling +_________________________________________________________________________________ + + +_________________________________________________________________________________ + +void cmsErrorAction(int nAction) +_________________________________________________________________________________ + + Tells lcms how to react if an error is raised. + +Parameters: + + nAction: can be one of these: + + LCMS_ERROR_ABORT Aborts whole application + LCMS_ERROR_SHOW Displays a message, but does not abort application + LCMS_ERROR_IGNORE Does not show any message, however, operation is aborted. + + +_________________________________________________________________________________ + +void cmsSignalError(int ErrorCode, const char *ErrorText, ...) +_________________________________________________________________________________ + + This is the default error handler. If you are using lcms as a + static library, you can replace it by one of your own. + +Parameters: + + ErrorCode: a number for coding error (with not meaning by now) + ErrorText: a format specifier describing the error + ... : additional parameters needed by ErrorText, in a printf like fashion. + + +_________________________________________________________________________________ + +void cmsSetErrorHandler(cmsErrorHandlerFunction Fn); +_________________________________________________________________________________ + + This function sets an user-defined error handler. The error handler must be + defined as: + + int ErrorHandlerFunction(int ErrorCode, const char *ErrorText); + + ErrorCode can be one of the following values: + + LCMS_ERRC_WARNING 0x1000 + LCMS_ERRC_RECOVERABLE 0x2000 + LCMS_ERRC_ABORTED 0x3000 + + ErrorText is a text holding an english description of error. + + +_________________________________________________________________________________ + +8 - Conversion functions +_________________________________________________________________________________ + +These functions can be used to convert from several colorimetric spaces +and to/from fixed encoding in spaces XYZ and Lab used by profiles. + + +_________________________________________________________________________________ + +LCMSAPI void LCMSEXPORT cmsXYZ2xyY(LPcmsCIExyY Dest, + CONST LPcmsCIEXYZ Source); +LCMSAPI void LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, + CONST LPcmsCIExyY Source); +_________________________________________________________________________________ + + +Does convert form/to XYZ Color Space to xyY color space + + Parameters: + + Dest, Source: points to vectors to convert + + +_________________________________________________________________________________ + +void cmsXYZ2Lab(LPcmsCIEXYZ WhitePoint, LPcmsCIELab Lab, const LPcmsCIEXYZ xyz); +void cmsLab2XYZ(LPcmsCIEXYZ WhitePoint, LPcmsCIEXYZ xyz, const LPcmsCIELab Lab); +_________________________________________________________________________________ + + Does convert from/to XYZ Color Space to CIE L a* b* Color Space + + + Parameters: + xyz, Lab : Pointers to values + WhitePoint: Pointer to media white. If NULL, the D50 is assumed. + + +_________________________________________________________________________________ + +void cmsLabEncoded2Float(LPcmsCIELab Lab, const WORD wLab[3]); +void cmsFloat2LabEncoded(WORD wLab[3], const LPcmsCIELab Lab); +_________________________________________________________________________________ + + Does convert form/to the encoded notation of Lab pcs to floating point. + + Parameters: + wLab, Lab : Pointers to values + +_________________________________________________________________________________ + +void cmsXYZEncoded2Float(LPcmsCIEXYZ fxyz, const WORD XYZ[3]); +void cmsFloat2XYZEncoded(WORD XYZ[3], const LPcmsCIEXYZ fXYZ); +_________________________________________________________________________________ + + Does convert form/to the encoded notation of XYZ pcs to floating point. + + Parameters: + fxyz, XYZ : Pointers to values + +_________________________________________________________________________________ + +void cmsLab2LCh(LPcmsCIELCh LCh, const LPcmsCIELab Lab); +void cmsLCh2Lab(LPcmsCIELab Lab, const LPcmsCIELCh LCh); +_________________________________________________________________________________ + + Does convert between polar/rectangulat form of CIE L*a*b* + + L = L + C = sqrt(a*a+b*b) + h = atan(b/a) + + Where C=colorfulness and h=hue. + + + Parameters: + Lab, LCh : Pointers to values + + +_________________________________________________________________________________ + +double cmsDeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2); +_________________________________________________________________________________ + + Computes the dE between two Lab values. The formula is + + dE = sqrt (dL^2 + da^2 + db^2) + + Parameters: + Lab1, Lab2: Points to the Lab values. + + Returns: + + The dE. If any Lab is negative, or with L>100 it returns 65535. + +_________________________________________________________________________________ + +double cmsCIE94DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2); +double cmsBFDdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2); +double cmsCMCdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2); +double cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2, double Kl, double Kc, double Kh); +_________________________________________________________________________________ + + Several additional error measurement systems. + + + +_________________________________________________________________________________ + +void cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin); +_________________________________________________________________________________ + + Clamps carefully a Lab value, keeping hue constant. + + L is unchanged and not used. The gamut boundaries are given + by the rectangle (amin, bmin) - (amax, bmax) + + if Lab value is inside gamut, this function don't touch anything, if outside, + converts to LCh, and keeping h constant, reduce C until inside gamut. + + + +_________________________________________________________________________________ + +LCMSAPI icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation); +LCMSAPI int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace); +LCMSAPI int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace); +_________________________________________________________________________________ + + +_________________________________________________________________________________ + +9 - CIECAM97s/CIECAM02 +_________________________________________________________________________________ + + + The model input data are the adapting field luminance in cd/m2 + (normally taken to be 20% of the luminance of white in the adapting field), + La , the relative tristimulus values of the stimulus, XYZ, the relative + tristimulus values of white in the same viewing conditions, "whitePoint", + and the relative luminance of the background, Yb . Relative tristimulus + values should be expressed on a scale from Y = 0 for a perfect black + to Y = 100 for a perfect reflecting diffuser. + + All CIE tristimulus values are obtained using the CIE 1931 Standard + Colorimetric Observer (2°). + + + typedef struct { + + cmsCIEXYZ whitePoint; // The media white in XYZ + + double Yb; + double La; + int surround; + double D_value; + + } cmsViewingConditions, FAR* LPcmsViewingConditions; + + + surround can be one of these + + + #define AVG_SURROUND 1 + #define DIM_SURROUND 2 + #define DARK_SURROUND 3 + + + + D_value (adaptation degree) is any value between 0 and 1, and additionally: + + #define D_CALCULATE (-1) // Calculate D + #define D_CALCULATE_DISCOUNT (-2) // Calculate w/ partial discounting + + + + +_________________________________________________________________________________ + +HANDLE cmsCIECAM97sInit(LPcmsViewingConditions pVC)/cmsCIECAM02Init +_________________________________________________________________________________ + + Does init the model. It returns a handle for further reference + + + Parameters: + + pVC: points to a cmsViewingConditions struct holding viewing condition + parameters + + + Returns: + + A handle to a model instance, or NULL if error. + + + +_________________________________________________________________________________ + +void cmsCIECAM97sDone(HANDLE hModel)/cmsCIECAM02Done +_________________________________________________________________________________ + + Terminates a model + + + Parameters: + + hModel: A handle to the model instance to terminate. + + +_________________________________________________________________________________ + +void cmsCIECAM97sForward(HANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut)/ + cmsCIECAM02Forward +_________________________________________________________________________________ + + Model forward. Transforms from XYZ to JCh. + + Parameters: + + hModel: A handle to the model instance + pIn, POut: Pointers to values + + + +_________________________________________________________________________________ + +void cmsCIECAM97sReverse(HANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ pOut)/ + cmsCIECAM02Reverse +_________________________________________________________________________________ + + Model reverse. Transforms from JCh to XYZ. + +Parameters: + + hModel: A handle to the model instance + pIn, POut: Pointers to values + + +_________________________________________________________________________________ + +10 - Profile creation functions +_________________________________________________________________________________ + + +_________________________________________________________________________________ + +void cmsSetDeviceClass(cmsHPROFILE hProfile, icProfileClassSignature sig); +_________________________________________________________________________________ + + Does set device class signature in profile header + +_________________________________________________________________________________ + +void cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig); +_________________________________________________________________________________ + + Does set colorspace signaure in profile header + +_________________________________________________________________________________ + +void cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs); +_________________________________________________________________________________ + + Does set PCS signature in profile header + + + +_________________________________________________________________________________ + +void cmsSetRenderingIntent(cmsHPROFILE hProfile, int RenderingIntent); +_________________________________________________________________________________ + + Sets the rendering intent in profile header + + +_________________________________________________________________________________ + +void cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID); +_________________________________________________________________________________ + + Sets the profile ID in profile header (ver 4 only) + + +_________________________________________________________________________________ + +void cmsSetHeaderFlags(cmsSetHeaderFlags(cmsHPROFILE hProfile, DWORD Flags) +_________________________________________________________________________________ + + Does set flags in profile header + + +_________________________________________________________________________________ + +void cmsSetHeaderAttributes(cmsSetHeaderFlags(cmsHPROFILE hProfile, DWORD Flags) +_________________________________________________________________________________ + + Does set attribute flags in profile header + +_________________________________________________________________________________ + +LCMSBOOL cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, void* data); +_________________________________________________________________________________ + + Adds a new tag to a profile. Supported tags are: + + + Signature Expected data type + ================= ================== + + icSigCharTargetTag const char* + icSigCopyrightTag const char* + icSigProfileDescriptionTag const char* + icSigDeviceMfgDescTag const char* + icSigDeviceModelDescTag const char* + icSigRedColorantTag LPcmsCIEXYZ + icSigGreenColorantTag LPcmsCIEXYZ + icSigBlueColorantTag LPcmsCIEXYZ + icSigMediaWhitePointTag LPcmsCIEXYZ + icSigMediaBlackPointTag LPcmsCIEXYZ + icSigRedTRCTag LPGAMMATABLE + icSigGreenTRCTag LPGAMMATABLE + icSigBlueTRCTag LPGAMMATABLE + icSigGrayTRCTag LPGAMMATABLE + icSigAToB0Tag LPLUT + icSigAToB1Tag LPLUT + icSigAToB2Tag LPLUT + icSigBToA0Tag LPLUT + icSigBToA1Tag LPLUT + icSigBToA2Tag LPLUT + icSigGamutTag LPLUT + icSigPreview0Tag LPLUT + icSigPreview1Tag LPLUT + icSigPreview2Tag LPLUT + icSigChromaticityTag LPcmsCIExyYTRIPLE + icSigNamedColor2Tag LPcmsNAMEDCOLORLIST + icSigColorantTableTag LPcmsNAMEDCOLORLIST + icSigColorantTableOutTag LPcmsNAMEDCOLORLIST + icSigCalibrationDateTimeTag const struct tm* + + + +_________________________________________________________________________________ + +11 - LUT manipulation +_________________________________________________________________________________ + + +This is the pipeline LUT is implementing + +[Mat] -> [L1] -> [Mat3] -> [Ofs3] -> [L3] + -> [CLUT] -> [L4] -> [Mat4] -> [Ofs4] -> [L2] + + + +_________________________________________________________________________________ + +LPLUT cmsAllocLUT(void); +_________________________________________________________________________________ + + Does allocate an empty LUT. Input is passed transparently to output by default + + Returns: + + A handle to a new LUT, or NULL if error. + + +_________________________________________________________________________________ + +LPLUT cmsDupLUT(LPLUT Orig); +_________________________________________________________________________________ + + + Duplicates a LUT. + +Returns: + + A handle to a new LUT, or NULL if error. + +_________________________________________________________________________________ + +LPLUT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nTable); +_________________________________________________________________________________ + + Does include a prelinearization tables set into a LUT + + + Parameters: + + NewLUT: The target LUT + Tables[]: A set of tables to be set + nTable: Identificates the position of tables in pipeline + + 1 - Prelinearization + 2 - Postlinearization + 3 - L3 + 4 - L4 + + Values 3 and 4 are reserved for v4 profiles + + +_________________________________________________________________________________ + +LPLUT cmsAlloc3DGrid(LPLUT Lut, int clutPoints, int inputChan, int outputChan); +_________________________________________________________________________________ + + Allocates an empty 3D CLUT table. + + + Parameters: + + Lut: The target LUT + clutPoints: The points number of a side of the (hyper)cube + inputChan, outputChan: The channels count + + Returns: + + A handle to the LUT, or NULL if error. + + + +_________________________________________________________________________________ + +void cmsFreeLUT(LPLUT Lut); +_________________________________________________________________________________ + + Free any used memory. After this call the LUT is not longer valid + + Parameters: + + Lut: The target LUT + + +_________________________________________________________________________________ + +void cmsEvalLUT(LPLUT Lut, WORD In[], WORD Out[]); +_________________________________________________________________________________ + + Evaluates a LUT, giving In[] values. Returns Out[] values. + + + Parameters: + + Lut: The target LUT + In: Input Values + Out: Output Values + + +_________________________________________________________________________________ + +LPLUT cmsSetMatrixLUT(LPLUT Lut, LPMAT3 M); +_________________________________________________________________________________ + + Provided for backwards compatibility sake. Sets the 'Mat' Matrix in the LUT pipeline + + +_________________________________________________________________________________ + +LPLUT cmsSetMatrixLUT4(LPLUT Lut, LPMAT3 M, LPVEC3 off, DWORD dwFlags); +_________________________________________________________________________________ + + + Set a matrix in V4 style. Flags defines the location in the LUT pipeline: + + + + LUT_HASMATRIX: Mat + LUT_HASMATRIX3: Mat3 + LUT_HASMATRIX4: Mat4 + + + +_________________________________________________________________________________ + +LPLUT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig); +_________________________________________________________________________________ + + Does retrive a LUT from a profile handle. + + + Parameters: + + hProfile: a handle to a open profile + sig: The tag signature + + Returns: + A pointer to newly created LUT on success + NULL on error + + + +_________________________________________________________________________________ + +int cmsSample3DGrid(LPLUT Lut, + _cmsSAMPLER Sampler, + LPVOID Cargo, DWORD dwFlags); +_________________________________________________________________________________ + + Builds the CLUT table by calling repeatly a supplied callback function + + +typedef int (* _cmsSAMPLER)(register WORD In[], + register WORD Out[], + register LPVOID Cargo); + + + The programmer has to write a callback function. This function + should calculate Out values given a In[] set. For example, if we + want a LUT to invert channels, a sampler could be: + + int InvertSampler(register WORD In[], + register WORD Out[], + register LPVOID Cargo) + { + for (i=0; i < 3; i++) + Out[i] = ~ In[i]; + + return 0; + } + + + cmsSample3DGrid does call this function to build the CLUT. + Pre/post linearization tables may be taken into account across + flags parameter + + Flags Meaning + ================ ======================================= + LUT_HASTL1 Do reverse linear interpolation on + prelinearization table before calling + the callback. + + LUT_HASTL2 Do reverse linear interpolation on + postlinearization table after calling + the callback. + + Flags are intended as an aid for building non-uniformly spaced + CLUTs. Using flags results in "undoing" any linearization tables + could apply. In such way, the programmer is expected to have in + In[] always the original colorspace, and must return Out[] values + always in original (non-postlinearized) space as well. + + + The callback must return 0 if all is ok, or any other value + to indicate error. If error condition is raised, whole CLUT + construction is aborted. + + Parameters: + + Lut: a pointer to LUT structure + Sampler: The callback function + Cargo: A 32-bit value. Could be used as pointer to pass + parameters to callback. + + dwFlags: any combination of LUT_HASTL1 or LUT_HASTL2 + joined by bitwise-or operator '|' + + + + +_________________________________________________________________________________ + +12 - Named color functions +_________________________________________________________________________________ + + + Named color profiles are a special kind of profiles handling lists of spot + colors. The typical example is PANTONE. CMM deals with named color profiles like + all other types, except they must be in input stage and the encoding supported + is limited to a one single channel of 16-bit indexes. + + Let's assume we have a Named color profile holding only 4 colors: + + · CYAN + · MAGENTA + · YELLOW + · BLACK + + We create a transform using: + + + hTransform = cmsCreateColorTransform(hNamedColorProfile, + TYPE_NAMED_COLOR_INDEX, + hOutputProfile, + TYPE_BGR_8, + INTENT_PERCEPTUAL, 0); + + "TYPE_NAMED_COLOR_INDEX" is a special encoding for these profiles, it + represents a single channel holding the spot color index. In our case + value 0 will be "CYAN", value 1 "MAGENTA" and so one. + + For converting between string and index there is an auxiliary function: + + int cmsNamedColorIndex(cmsHTRANSFORM hTransform, const char* ColorName); + + That will perform a look up on the spot colors database and return the color + number or -1 if the color was not found. Other additional functions for named + color transforms are: + + + int cmsNamedColorCount(cmsHTRANSFORM hTransform); + + That returns the number of colors present on transform database. + + + int cmsNamedColorInfo(cmsHTRANSFORM hTransform, + int nColor, LPNAMEDCOLORINFO Info); + + That returns extended information about a given color. Named color profiles + can also be grouped by using multiprofile transforms. In such case, the database + will be formed by the union of all colors in all named color profiles present in + transform. + + + Named color profiles does hold two coordinates for each color, let's + take our PANTONE example. This profile would contain for each color + the CMYK colorants plus its PCS coordinates, usually in Lab space. + + lcms can work with named color using both coordinates. Creating a + transform with two profiles, if the input one is a named color, then you + obtain the translated color using PCS. + + Example, named color -> sRGB will give the color patches in sRGB + + In the other hand, setting second profile to NULL, returns the device + coordinates, that is, CMYK colorants in our PANTONE sample. + + Example: Named color -> NULL will give the CMYK amount for each spot color. + + + The transform must use TYPE_NAMED_COLOR_INDEX on input. That is, a single + channel containing the 0-based color index. + + Then you have: + + cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name) + + for obtaining index from color name, and + + cmsNamedColorInfo(), cmsNamedColorCount() to retrieve the list. + + The profile is supposed to be for a unique device. Then the CMYK + values does represent the amount of inks THIS PRINTER needs to render + the spot color. The profile also has the Lab values corresponding to + the color. This really would have no sense if gamut of printer were + infinite, but since printers does have a limited gamut a PANTONE-certified + printer renders colors near gamut boundaries with some limitations. + The named color profile is somehow explaining which are these limitation + for that printer. + + So, you can use a named color profile in two different ways, as output, + giving the index and getting the CMYK values or as input and getting the + Lab for that color. + + A transform named color -> NULL will give the CMYK values for the spot + color on the printer the profile is describing. This would be the normal usage. + + A transform Named color -> another printer will give on the output printer + the spot colors as if they were printed in the printer named color profile + is describing. This is useful for soft proofing. + + As an additional feature, lcms can "group" several named color profiles + into a single database by means of cmsCreateMultiprofileTransform(). + Such case works as described above, but joining all named colors as they + were in a single profile. + + + + +_________________________________________________________________________________ + + 13. PostScript generation +_________________________________________________________________________________ + + 3 functions carry the task of obtaining CRD and CSA. + + + DWORD cmsGetPostScriptCSA(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen); + DWORD cmsGetPostScriptCRD(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen); + DWORD cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, int Intent, DWORD dwFlags, LPVOID Buffer, DWORD dwBufferLen); + + + cmsGetPostScriptCRDEx allows black point compensation using + cmsFLAGS_BLACKPOINTCOMPENSATION in flags field. + + PostScrip colorflow is often done in a different way. Insted of creating a + transform, it is sometimes desirable to delegate the color management to + PostScript interpreter. These functions does translate input and output + profiles into Color Space Arrays (CSA) and Color Rendering Dictionaries (CRD) + + · CRD are equivalent to output (printer) profiles. Can be + loaded into printer at startup and can be stored as resources. + + · CSA are equivalent to input and workspace profiles, and are + intended to be included in the document definition. + + These functions does generate the PostScript equivalents. Since the lenght of + the resultant PostScript code is unknown in advance, you can call the + functions with len=0 and Buffer=NULL to get the lenght. After that, you need + to allocate enough memory to contain the whole block + + Example: + + Size = cmsGetPostScriptCSA(hProfile, INTENT_PERCEPTUAL, NULL, 0); + If (Size == 0) error() + + Block = malloc(Size); + cmsGetPostScriptCSA(hProfile, INTENT_PERCEPTUAL, Block, Size); + + + Devicelink profiles are supported, as long as input colorspace matches + Lab/XYZ for CSA or output colorspace matches Lab/XYZ for CRD. This can + be used in conjuntion with cmsCreateMultiprofileTransform(), + and cmsTransform2DeviceLink() to embed complex color flow into PostScript. + + + + WARNING: Preccision of PostScript is limited to 8 bits per sample. If you + can choose between normal transforms and CSA/CRD, normal transforms will + give more accurancy. However, there are situations where there is no + chance. + + +_________________________________________________________________________________ + +14 - CGATS.13 - 200 +_________________________________________________________________________________ + + +This standard defines an exchange format for spectral measurement data, +colorimetric data, and densitometric data in electronic form using +keywords and data tables. It maintains human readability of the data as +well as enabling machine readability. It includes a series of predefined +keywords and data format identifiers and makes provision for the dynamic +definition of additional keywords and data format identifiers as +necessary. + + +It was prepared by CGATS/SC3 in an effort to consolidate the common format +requirements for the exchange of spectral measurement data, colorimetric +data, and densitometric data in electronic form. + +These requirements presently appear in a number of CGATS and IT8 standards +such as CGAT S.5, IT8.7/1, IT8.7/2, and IT8.7/3. While it is the intent that +each of these individual standards will continue to identify required data, +the basic data format and keywords and data identifier s will be defined in +this standard for consistent use across all applicable standards. + +The Committee for Graphic Arts Technologies Standards (CGATS) was accredited +by the American National Standards Institute in 1989 to serve as the +coordinator of graphic arts standards activities. + +CGATS recommends the adoption and use of this standard by the graphic +arts industry and its suppliers at their earliest convenience. + + +lcms parser has following additions: + +.INCLUDE directive +------------------ + +Works like #include in C language. + +LABEL special keyword +--------------------- + + +_________________________________________________________________________________ + + LCMSHANDLE cmsIT8Alloc(void); +_________________________________________________________________________________ + + Does allocate an empty CGATS.13/IT8 object. Mostly used for creating new IT8 files + + Returns: + + A handle to a CGATS.13, or NULL if error. + + +_________________________________________________________________________________ + + void cmsIT8Free(LCMSHANDLE hIT8); +_________________________________________________________________________________ + + Free any used memory. After this call the IT8 parser is not longer valid + + Parameters: + + hIT8: The CGATS.13 parser handle + + +_________________________________________________________________________________ + + Tables +_________________________________________________________________________________ + + + In the lcms implementation, a CGATS.13/IT8 object may contain any number of + tables. Tables are separated by END_DATA keyword. + + +_________________________________________________________________________________ + + int cmsIT8TableCount(LCMSHANDLE hIT8); +_________________________________________________________________________________ + + Returns the number of tables the CGATS.13/IT8 object contains. + +Parameters: + + hIT8: The CGATS.13 parser handle + + + +_________________________________________________________________________________ + + int cmsIT8SetTable(LCMSHANDLE hIT8, int nTable); +_________________________________________________________________________________ + + Sets the current table on a given CGATS.13/IT8 object + +Parameters: + + hIT8: The CGATS.13 parser handle + nTable: The table number (0 based) + + +Returns: + the number of tables the CGATS.13/IT8 object contains. + + +Comments: + + Setting nTable to TableCount + 1 does allocate a new empty table + + +_________________________________________________________________________________ + + Persistence +_________________________________________________________________________________ + + These are functions to load/save CGATS.13/IT8 objects from file and memory stream. + +_________________________________________________________________________________ + + LCMSHANDLE cmsIT8LoadFromFile(const char* cFileName); +_________________________________________________________________________________ + + Does allocate an CGATS.13/IT8 object and fills it with the contents of cFileName. + Mostly used for reading existing IT8 files. + +Parameters: + + cFileName: The IT8/CGATS.13 file name to read/parse + +Returns: + + A handle to a CGATS.13, or NULL if error. + + +_________________________________________________________________________________ + + LCMSHANDLE cmsIT8LoadFromMem(void *Ptr, size_t len); +_________________________________________________________________________________ + + Same as anterior, but the IT8/CGATS.13 stream is readed from a memory block. + + Parameters: + + Ptr: Points to a block of contiguous memory containing the IT8/CGATS.13 stream. + len: IT8/CGATS.13 stream s size measured in bytes. + + Returns: + + NULL on error, a profile handle on success. + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName); +_________________________________________________________________________________ + + Saves a IT8/CGATS.13 object to a file. + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded); +_________________________________________________________________________________ + + + Saves a IT8/CGATS.13 object to a memory stream. + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + + +_________________________________________________________________________________ + + Type and comments +_________________________________________________________________________________ + +The sheet type is a identifier placed on the very first line of the IT8/CGATS.13 +stream. It can be IT8.7/xx or whatever. + + + _________________________________________________________________________________ + + const char* cmsIT8GetSheetType(LCMSHANDLE hIT8); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment); +_________________________________________________________________________________ + +This function is intended to provide a way automated IT8 creators can embed comments +into file. Comments have no effect, and its only purpose is to document any of the +file meaning. + + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + +_________________________________________________________________________________ + + Properties +_________________________________________________________________________________ + +Properties are pairs <identifier> <value>. Each table may contain any number of +properties. Its primary purpose is store simpler settings. + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str); + LCMSBOOL cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val); + LCMSBOOL cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val); + LCMSBOOL cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + +_________________________________________________________________________________ + + const char* cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp); + double cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + int cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + PropertyNames: A pointer to a variable which would recive a pointer to an + array of property name strings. + + Returns: + + +_________________________________________________________________________________ + + Datasets +_________________________________________________________________________________ + + +_________________________________________________________________________________ + + const char* cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + double cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int row, int col); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, + const char* Val); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, + double Val); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + const char* cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, + const char* cSample); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + double cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, + const char* cSample); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch, + const char* cSample, + char *Val); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch, + const char* cSample, + double Val); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + LCMSBOOL cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample); +_________________________________________________________________________________ + + Parameters: + + hIT8: The CGATS.13 parser handle + + Returns: + + +_________________________________________________________________________________ + + int cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames); +_________________________________________________________________________________ + + Returns an array with pointers to the column names of currect table. + + Parameters: + + hIT8: The CGATS.13 parser handle + SampleNames: A pointer to a variable of type char** which will hold the table. + + Returns: + + The number of column names in table. + + +_________________________________________________________________________________ + + const char* cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer); +_________________________________________________________________________________ + + + Fills buffer with the contents of SAMPLE_ID column for the set given in nPatch. + That usually corresponds to patch name. + + Parameters: + + hIT8: The CGATS.13 parser handle + nPatch : patch number to retreive name + buffer: A memory buffer to recivepatch name, or NULL to allow function to + allocate it own buffer. + + Returns: + + A pointer to the patch name, either the user-supplied buffer or an internal + memory block. + |
