You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2744 lines
90 KiB

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 <20>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 <20>K
Parameters:
TempK: Temperature in <20>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:
<20> CYAN
<20> MAGENTA
<20> YELLOW
<20> 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)
<20> CRD are equivalent to output (printer) profiles. Can be
loaded into printer at startup and can be stored as resources.
<20> 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.