Commits

Robert Kern  committed 569b7ab

Add lcms-1.16 library code to the package.

  • Participants
  • Parent commits f881357

Comments (0)

Files changed (26)

+The files in include/ and src/ are from the lcms-1.16 package and fall under
+their own license. See doc/lcmslib_COPYING.txt for that license. See
+http://www.littlecms.com/ for more information about lcms.
+
+The remainder of the code falls under this license:
+
+Copyright (c) 2007 Enthought, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  a. Redistributions of source code must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+  b. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+  c. Neither the name of the Enthought nor the names of its contributors
+     may be used to endorse or promote products derived from this software
+     without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+

File doc/lcmslib_COPYING.txt

+Little cms
+Copyright (C) 1998-2006 Marti Maria
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File include/icc34.h

+/* Header file guard bands */
+#ifndef ICC_H
+#define ICC_H
+
+/***************************************************************** 
+ Copyright (c) 1994-1996 SunSoft, Inc.
+
+                    Rights Reserved
+
+Permission is hereby granted, free of charge, to any person 
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without restrict- 
+ion, including without limitation the rights to use, copy, modify, 
+merge, publish distribute, sublicense, and/or sell copies of the 
+Software, and to permit persons to whom the Software is furnished 
+to do so, subject to the following conditions: 
+ 
+The above copyright notice and this permission notice shall be 
+included in all copies or substantial portions of the Software. 
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
+INFRINGEMENT.  IN NO EVENT SHALL SUNSOFT, INC. OR ITS PARENT 
+COMPANY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
+OTHER DEALINGS IN THE SOFTWARE. 
+ 
+Except as contained in this notice, the name of SunSoft, Inc. 
+shall not be used in advertising or otherwise to promote the 
+sale, use or other dealings in this Software without written 
+authorization from SunSoft Inc. 
+******************************************************************/
+
+/*
+ * This version of the header file corresponds to the profile
+ * specification version 3.4.
+ *
+ * All header file entries are pre-fixed with "ic" to help 
+ * avoid name space collisions. Signatures are pre-fixed with
+ * icSig.
+ *
+ * The structures defined in this header file were created to
+ * represent a description of an ICC profile on disk. Rather
+ * than use pointers a technique is used where a single byte array 
+ * was placed at the end of each structure. This allows us in "C"
+ * to extend the structure by allocating more data than is needed
+ * to account for variable length structures.
+ *
+ * This also ensures that data following is allocated
+ * contiguously and makes it easier to write and read data from
+ * the file. 
+ *
+ * For example to allocate space for a 256 count length UCR
+ * and BG array, and fill the allocated data.  Note strlen + 1
+ * to remember NULL terminator.
+ *
+        icUcrBgCurve    *ucrCurve, *bgCurve;
+        int             ucr_nbytes, bg_nbytes, string_bytes;
+        icUcrBg         *ucrBgWrite;
+        char            ucr_string[100], *ucr_char;
+
+        strcpy(ucr_string, "Example ucrBG curves");
+        ucr_nbytes = sizeof(icUInt32Number) + 
+                 (UCR_CURVE_SIZE * sizeof(icUInt16Number));
+        bg_nbytes = sizeof(icUInt32Number) + 
+                 (BG_CURVE_SIZE * sizeof(icUInt16Number));
+        string_bytes = strlen(ucr_string) + 1;
+
+        ucrBgWrite = (icUcrBg *)malloc(
+                                (ucr_nbytes + bg_nbytes + string_bytes));
+ 
+        ucrCurve = (icUcrBgCurve *)ucrBgWrite->data;
+        ucrCurve->count = UCR_CURVE_SIZE;
+        for (i=0; i<ucrCurve->count; i++)
+                ucrCurve->curve[i] = (icUInt16Number)i;
+ 
+        bgCurve = (icUcrBgCurve *)((char *)ucrCurve + ucr_nbytes);
+        bgCurve->count = BG_CURVE_SIZE;
+        for (i=0; i<bgCurve->count; i++)
+                bgCurve->curve[i] = 255 - (icUInt16Number)i;
+
+        ucr_char = (char *)((char *)bgCurve + bg_nbytes);
+        memcpy(ucr_char, ucr_string, string_bytes);
+ *
+ */
+
+/*
+ * Many of the structures contain variable length arrays. This
+ * is represented by the use of the convention.
+ *
+ *      type    data[icAny];
+ */
+
+/*------------------------------------------------------------------------*/
+/*
+ * Defines used in the specification
+ */
+#define icMagicNumber                   0x61637370L     /* 'acsp' */
+#define icVersionNumber                 0x02100000L     /* 2.1.0, BCD */
+
+/* Screening Encodings */
+#define icPrtrDefaultScreensFalse       0x00000000L     /* Bit pos 0 */
+#define icPrtrDefaultScreensTrue        0x00000001L     /* Bit pos 0 */
+#define icLinesPerInch                  0x00000002L     /* Bit pos 1 */
+#define icLinesPerCm                    0x00000000L     /* Bit pos 1 */
+
+/* 
+ * Device attributes, currently defined values correspond
+ * to the low 4 bytes of the 8 byte attribute quantity, see
+ * the header for their location.
+ */
+#define icReflective                    0x00000000L     /* Bit pos 0 */
+#define icTransparency                  0x00000001L     /* Bit pos 0 */
+#define icGlossy                        0x00000000L     /* Bit pos 1 */
+#define icMatte                         0x00000002L     /* Bit pos 1 */
+
+/*
+ * Profile header flags, the low 16 bits are reserved for consortium
+ * use.
+ */
+#define icEmbeddedProfileFalse          0x00000000L     /* Bit pos 0 */
+#define icEmbeddedProfileTrue           0x00000001L     /* Bit pos 0 */
+#define icUseAnywhere                   0x00000000L     /* Bit pos 1 */
+#define icUseWithEmbeddedDataOnly       0x00000002L     /* Bit pos 1 */
+
+/* Ascii or Binary data */
+#define icAsciiData                     0x00000000L 
+#define icBinaryData                    0x00000001L
+
+/* 
+ * Define used to indicate that this is a variable length array
+ */
+#define icAny                           1
+
+
+/*------------------------------------------------------------------------*/
+/*
+ * Use this area to translate platform definitions of long
+ * etc into icXXX form. The rest of the header uses the icXXX
+ * typedefs. Signatures are 4 byte quantities.
+ *
+ */
+
+
+/* RTK 2007-04-11
+ * De-autotooled this part for easy compiling in a Python extension.
+ */
+
+#if 0
+/*
+  June 9, 2003, Adapted for use with configure by Bob Friesenhahn
+  Added the stupid check for autoconf by Marti Maria. 
+  PACKAGE_NAME is defined if autoconf is being used 
+*/
+
+typedef @UINT8_T@	icUInt8Number;
+typedef @UINT16_T@	icUInt16Number;
+typedef @UINT32_T@	icUInt32Number;
+typedef @UINT32_T@	icUInt64Number[2];
+
+typedef @INT8_T@	icInt8Number;
+typedef @INT16_T@	icInt16Number;
+typedef @INT32_T@	icInt32Number;
+typedef @INT32_T@	icInt64Number[2];
+
+#else
+
+/* 
+ *Apr-17-2002: Modified by Marti Maria in order to provide wider portability.
+ */
+
+#if defined (__digital__) && defined (__unix__)
+
+/* Tru64 */
+
+#include <inttypes.h>
+
+typedef uint8_t   icUInt8Number;
+typedef uint16_t  icUInt16Number;
+typedef uint32_t  icUInt32Number;
+typedef uint32_t  icUInt64Number[2];
+
+typedef int8_t     icInt8Number;
+typedef int16_t    icInt16Number;
+typedef int32_t    icInt32Number;
+typedef int32_t    icInt64Number[2];
+
+#else
+#ifdef __sgi
+#include "sgidefs.h"
+
+
+/*
+ * Number definitions
+ */
+
+/* Unsigned integer numbers */
+typedef unsigned char   icUInt8Number;
+typedef unsigned short  icUInt16Number;
+typedef __uint32_t      icUInt32Number;
+typedef __uint32_t      icUInt64Number[2];
+
+/* Signed numbers */
+typedef char            icInt8Number;
+typedef short           icInt16Number;
+typedef __int32_t       icInt32Number;
+typedef __int32_t       icInt64Number[2];
+
+
+#else   
+#if defined(__GNUC__) || defined(__unix__) || defined(__unix)
+
+#include <sys/types.h>
+
+#if defined(__sun) || defined(__hpux) || defined (__MINGW) || defined(__MINGW32__)
+
+typedef uint8_t   icUInt8Number;
+typedef uint16_t  icUInt16Number;
+typedef uint32_t  icUInt32Number;
+typedef uint32_t  icUInt64Number[2];
+
+#else
+
+/* Unsigned integer numbers */
+typedef u_int8_t   icUInt8Number;
+typedef u_int16_t  icUInt16Number;
+typedef u_int32_t  icUInt32Number;
+typedef u_int32_t  icUInt64Number[2];
+
+#endif
+
+
+/* Signed numbers */
+typedef int8_t     icInt8Number;
+typedef int16_t    icInt16Number;
+typedef int32_t    icInt32Number;
+typedef int32_t    icInt64Number[2];
+
+
+#else /* default definitions */
+
+/*
+ * Number definitions
+ */
+
+/* RTK 2007-04-11
+ * Changed longs to ints as ints are almost always 32 bits on most platforms
+ * while longs are 64 bits on most 64-bit platforms.
+ */
+
+
+/* Unsigned integer numbers */
+typedef unsigned char   icUInt8Number;
+typedef unsigned short  icUInt16Number;
+typedef unsigned int    icUInt32Number;
+typedef unsigned int    icUInt64Number[2];
+
+/* Signed numbers */
+typedef char            icInt8Number;
+typedef short           icInt16Number;
+typedef int             icInt32Number;
+typedef int             icInt64Number[2];
+
+
+#endif  /* default defs */
+#endif
+#endif
+#endif
+
+/* Base types */
+
+typedef icInt32Number    icSignature;
+typedef icInt32Number    icS15Fixed16Number;
+typedef icUInt32Number   icU16Fixed16Number;
+
+
+/*------------------------------------------------------------------------*/
+/* public tags and sizes */
+typedef enum {
+    icSigAToB0Tag                       = 0x41324230L,  /* 'A2B0' */ 
+    icSigAToB1Tag                       = 0x41324231L,  /* 'A2B1' */
+    icSigAToB2Tag                       = 0x41324232L,  /* 'A2B2' */ 
+    icSigBlueColorantTag                = 0x6258595AL,  /* 'bXYZ' */
+    icSigBlueTRCTag                     = 0x62545243L,  /* 'bTRC' */
+    icSigBToA0Tag                       = 0x42324130L,  /* 'B2A0' */
+    icSigBToA1Tag                       = 0x42324131L,  /* 'B2A1' */
+    icSigBToA2Tag                       = 0x42324132L,  /* 'B2A2' */
+    icSigCalibrationDateTimeTag         = 0x63616C74L,  /* 'calt' */
+    icSigCharTargetTag                  = 0x74617267L,  /* 'targ' */ 
+    icSigCopyrightTag                   = 0x63707274L,  /* 'cprt' */
+    icSigCrdInfoTag                     = 0x63726469L,  /* 'crdi' */
+    icSigDeviceMfgDescTag               = 0x646D6E64L,  /* 'dmnd' */
+    icSigDeviceModelDescTag             = 0x646D6464L,  /* 'dmdd' */
+    icSigGamutTag                       = 0x67616D74L,  /* 'gamt ' */
+    icSigGrayTRCTag                     = 0x6b545243L,  /* 'kTRC' */
+    icSigGreenColorantTag               = 0x6758595AL,  /* 'gXYZ' */
+    icSigGreenTRCTag                    = 0x67545243L,  /* 'gTRC' */
+    icSigLuminanceTag                   = 0x6C756d69L,  /* 'lumi' */
+    icSigMeasurementTag                 = 0x6D656173L,  /* 'meas' */
+    icSigMediaBlackPointTag             = 0x626B7074L,  /* 'bkpt' */
+    icSigMediaWhitePointTag             = 0x77747074L,  /* 'wtpt' */
+    icSigNamedColorTag                  = 0x6E636f6CL,  /* 'ncol' 
+                                                         * OBSOLETE, use ncl2 */
+    icSigNamedColor2Tag                 = 0x6E636C32L,  /* 'ncl2' */
+    icSigPreview0Tag                    = 0x70726530L,  /* 'pre0' */
+    icSigPreview1Tag                    = 0x70726531L,  /* 'pre1' */
+    icSigPreview2Tag                    = 0x70726532L,  /* 'pre2' */
+    icSigProfileDescriptionTag          = 0x64657363L,  /* 'desc' */
+    icSigProfileSequenceDescTag         = 0x70736571L,  /* 'pseq' */
+    icSigPs2CRD0Tag                     = 0x70736430L,  /* 'psd0' */
+    icSigPs2CRD1Tag                     = 0x70736431L,  /* 'psd1' */
+    icSigPs2CRD2Tag                     = 0x70736432L,  /* 'psd2' */
+    icSigPs2CRD3Tag                     = 0x70736433L,  /* 'psd3' */
+    icSigPs2CSATag                      = 0x70733273L,  /* 'ps2s' */
+    icSigPs2RenderingIntentTag          = 0x70733269L,  /* 'ps2i' */
+    icSigRedColorantTag                 = 0x7258595AL,  /* 'rXYZ' */
+    icSigRedTRCTag                      = 0x72545243L,  /* 'rTRC' */
+    icSigScreeningDescTag               = 0x73637264L,  /* 'scrd' */
+    icSigScreeningTag                   = 0x7363726EL,  /* 'scrn' */
+    icSigTechnologyTag                  = 0x74656368L,  /* 'tech' */
+    icSigUcrBgTag                       = 0x62666420L,  /* 'bfd ' */
+    icSigViewingCondDescTag             = 0x76756564L,  /* 'vued' */
+    icSigViewingConditionsTag           = 0x76696577L,  /* 'view' */
+    icMaxEnumTag                        = 0xFFFFFFFFL 
+} icTagSignature;
+
+/* technology signature descriptions */
+typedef enum {
+    icSigDigitalCamera                  = 0x6463616DL,  /* 'dcam' */
+    icSigFilmScanner                    = 0x6673636EL,  /* 'fscn' */
+    icSigReflectiveScanner              = 0x7273636EL,  /* 'rscn' */
+    icSigInkJetPrinter                  = 0x696A6574L,  /* 'ijet' */ 
+    icSigThermalWaxPrinter              = 0x74776178L,  /* 'twax' */
+    icSigElectrophotographicPrinter     = 0x6570686FL,  /* 'epho' */
+    icSigElectrostaticPrinter           = 0x65737461L,  /* 'esta' */
+    icSigDyeSublimationPrinter          = 0x64737562L,  /* 'dsub' */
+    icSigPhotographicPaperPrinter       = 0x7270686FL,  /* 'rpho' */
+    icSigFilmWriter                     = 0x6670726EL,  /* 'fprn' */
+    icSigVideoMonitor                   = 0x7669646DL,  /* 'vidm' */
+    icSigVideoCamera                    = 0x76696463L,  /* 'vidc' */
+    icSigProjectionTelevision           = 0x706A7476L,  /* 'pjtv' */
+    icSigCRTDisplay                     = 0x43525420L,  /* 'CRT ' */
+    icSigPMDisplay                      = 0x504D4420L,  /* 'PMD ' */
+    icSigAMDisplay                      = 0x414D4420L,  /* 'AMD ' */
+    icSigPhotoCD                        = 0x4B504344L,  /* 'KPCD' */
+    icSigPhotoImageSetter               = 0x696D6773L,  /* 'imgs' */
+    icSigGravure                        = 0x67726176L,  /* 'grav' */
+    icSigOffsetLithography              = 0x6F666673L,  /* 'offs' */
+    icSigSilkscreen                     = 0x73696C6BL,  /* 'silk' */
+    icSigFlexography                    = 0x666C6578L,  /* 'flex' */
+    icMaxEnumTechnology                 = 0xFFFFFFFFL   
+} icTechnologySignature;
+
+/* type signatures */
+typedef enum {
+    icSigCurveType                      = 0x63757276L,  /* 'curv' */
+    icSigDataType                       = 0x64617461L,  /* 'data' */
+    icSigDateTimeType                   = 0x6474696DL,  /* 'dtim' */
+    icSigLut16Type                      = 0x6d667432L,  /* 'mft2' */
+    icSigLut8Type                       = 0x6d667431L,  /* 'mft1' */
+    icSigMeasurementType                = 0x6D656173L,  /* 'meas' */
+    icSigNamedColorType                 = 0x6E636f6CL,  /* 'ncol' 
+                                                         * OBSOLETE, use ncl2 */
+    icSigProfileSequenceDescType        = 0x70736571L,  /* 'pseq' */
+    icSigS15Fixed16ArrayType            = 0x73663332L,  /* 'sf32' */
+    icSigScreeningType                  = 0x7363726EL,  /* 'scrn' */
+    icSigSignatureType                  = 0x73696720L,  /* 'sig ' */
+    icSigTextType                       = 0x74657874L,  /* 'text' */
+    icSigTextDescriptionType            = 0x64657363L,  /* 'desc' */
+    icSigU16Fixed16ArrayType            = 0x75663332L,  /* 'uf32' */
+    icSigUcrBgType                      = 0x62666420L,  /* 'bfd ' */
+    icSigUInt16ArrayType                = 0x75693136L,  /* 'ui16' */
+    icSigUInt32ArrayType                = 0x75693332L,  /* 'ui32' */
+    icSigUInt64ArrayType                = 0x75693634L,  /* 'ui64' */
+    icSigUInt8ArrayType                 = 0x75693038L,  /* 'ui08' */
+    icSigViewingConditionsType          = 0x76696577L,  /* 'view' */
+    icSigXYZType                        = 0x58595A20L,  /* 'XYZ ' */
+    icSigXYZArrayType                   = 0x58595A20L,  /* 'XYZ ' */
+    icSigNamedColor2Type                = 0x6E636C32L,  /* 'ncl2' */
+    icSigCrdInfoType                    = 0x63726469L,  /* 'crdi' */
+    icMaxEnumType                       = 0xFFFFFFFFL   
+} icTagTypeSignature;
+
+/* 
+ * Color Space Signatures
+ * Note that only icSigXYZData and icSigLabData are valid
+ * Profile Connection Spaces (PCSs)
+ */ 
+typedef enum {
+    icSigXYZData                        = 0x58595A20L,  /* 'XYZ ' */
+    icSigLabData                        = 0x4C616220L,  /* 'Lab ' */
+    icSigLuvData                        = 0x4C757620L,  /* 'Luv ' */
+    icSigYCbCrData                      = 0x59436272L,  /* 'YCbr' */
+    icSigYxyData                        = 0x59787920L,  /* 'Yxy ' */
+    icSigRgbData                        = 0x52474220L,  /* 'RGB ' */
+    icSigGrayData                       = 0x47524159L,  /* 'GRAY' */
+    icSigHsvData                        = 0x48535620L,  /* 'HSV ' */
+    icSigHlsData                        = 0x484C5320L,  /* 'HLS ' */
+    icSigCmykData                       = 0x434D594BL,  /* 'CMYK' */
+    icSigCmyData                        = 0x434D5920L,  /* 'CMY ' */
+    icSig2colorData                     = 0x32434C52L,  /* '2CLR' */
+    icSig3colorData                     = 0x33434C52L,  /* '3CLR' */
+    icSig4colorData                     = 0x34434C52L,  /* '4CLR' */
+    icSig5colorData                     = 0x35434C52L,  /* '5CLR' */
+    icSig6colorData                     = 0x36434C52L,  /* '6CLR' */
+    icSig7colorData                     = 0x37434C52L,  /* '7CLR' */
+    icSig8colorData                     = 0x38434C52L,  /* '8CLR' */
+    icSig9colorData                     = 0x39434C52L,  /* '9CLR' */
+    icSig10colorData                    = 0x41434C52L,  /* 'ACLR' */
+    icSig11colorData                    = 0x42434C52L,  /* 'BCLR' */
+    icSig12colorData                    = 0x43434C52L,  /* 'CCLR' */
+    icSig13colorData                    = 0x44434C52L,  /* 'DCLR' */
+    icSig14colorData                    = 0x45434C52L,  /* 'ECLR' */
+    icSig15colorData                    = 0x46434C52L,  /* 'FCLR' */
+    icMaxEnumData                       = 0xFFFFFFFFL   
+} icColorSpaceSignature;
+
+/* profileClass enumerations */
+typedef enum {
+    icSigInputClass                     = 0x73636E72L,  /* 'scnr' */
+    icSigDisplayClass                   = 0x6D6E7472L,  /* 'mntr' */
+    icSigOutputClass                    = 0x70727472L,  /* 'prtr' */
+    icSigLinkClass                      = 0x6C696E6BL,  /* 'link' */
+    icSigAbstractClass                  = 0x61627374L,  /* 'abst' */
+    icSigColorSpaceClass                = 0x73706163L,  /* 'spac' */
+    icSigNamedColorClass                = 0x6e6d636cL,  /* 'nmcl' */
+    icMaxEnumClass                      = 0xFFFFFFFFL  
+} icProfileClassSignature;
+
+/* Platform Signatures */
+typedef enum {
+    icSigMacintosh                      = 0x4150504CL,  /* 'APPL' */
+    icSigMicrosoft                      = 0x4D534654L,  /* 'MSFT' */
+    icSigSolaris                        = 0x53554E57L,  /* 'SUNW' */
+    icSigSGI                            = 0x53474920L,  /* 'SGI ' */
+    icSigTaligent                       = 0x54474E54L,  /* 'TGNT' */
+    icMaxEnumPlatform                   = 0xFFFFFFFFL  
+} icPlatformSignature;
+
+/*------------------------------------------------------------------------*/
+/*
+ * Other enums
+ */
+
+/* Measurement Flare, used in the measurmentType tag */
+typedef enum {
+    icFlare0                            = 0x00000000L,  /* 0% flare */
+    icFlare100                          = 0x00000001L,  /* 100% flare */
+    icMaxFlare                          = 0xFFFFFFFFL   
+} icMeasurementFlare;
+
+/* Measurement Geometry, used in the measurmentType tag */
+typedef enum {
+    icGeometryUnknown                   = 0x00000000L,  /* Unknown */
+    icGeometry045or450                  = 0x00000001L,  /* 0/45, 45/0 */
+    icGeometry0dord0                    = 0x00000002L,  /* 0/d or d/0 */
+    icMaxGeometry                       = 0xFFFFFFFFL   
+} icMeasurementGeometry;
+
+/* Rendering Intents, used in the profile header */
+typedef enum {
+    icPerceptual                        = 0,
+    icRelativeColorimetric              = 1,
+    icSaturation                        = 2,
+    icAbsoluteColorimetric              = 3,
+    icMaxEnumIntent                     = 0xFFFFFFFFL   
+} icRenderingIntent;
+
+/* Different Spot Shapes currently defined, used for screeningType */
+typedef enum {
+    icSpotShapeUnknown                  = 0,
+    icSpotShapePrinterDefault           = 1,
+    icSpotShapeRound                    = 2,
+    icSpotShapeDiamond                  = 3,
+    icSpotShapeEllipse                  = 4,
+    icSpotShapeLine                     = 5,
+    icSpotShapeSquare                   = 6,
+    icSpotShapeCross                    = 7,
+    icMaxEnumSpot                       = 0xFFFFFFFFL   
+} icSpotShape;
+
+/* Standard Observer, used in the measurmentType tag */
+typedef enum {
+    icStdObsUnknown                     = 0x00000000L,  /* Unknown */
+    icStdObs1931TwoDegrees              = 0x00000001L,  /* 2 deg */
+    icStdObs1964TenDegrees              = 0x00000002L,  /* 10 deg */
+    icMaxStdObs                         = 0xFFFFFFFFL   
+} icStandardObserver;
+
+/* Pre-defined illuminants, used in measurement and viewing conditions type */
+typedef enum {
+    icIlluminantUnknown                 = 0x00000000L,
+    icIlluminantD50                     = 0x00000001L,
+    icIlluminantD65                     = 0x00000002L,
+    icIlluminantD93                     = 0x00000003L,
+    icIlluminantF2                      = 0x00000004L,
+    icIlluminantD55                     = 0x00000005L,
+    icIlluminantA                       = 0x00000006L,
+    icIlluminantEquiPowerE              = 0x00000007L,  
+    icIlluminantF8                      = 0x00000008L,  
+    icMaxEnumIluminant                  = 0xFFFFFFFFL   
+} icIlluminant;
+
+
+/*------------------------------------------------------------------------*/
+/*
+ * Arrays of numbers 
+ */
+
+/* Int8 Array */
+typedef struct {
+    icInt8Number        data[icAny];    /* Variable array of values */
+} icInt8Array;
+
+/* UInt8 Array */
+typedef struct {
+    icUInt8Number       data[icAny];    /* Variable array of values */
+} icUInt8Array;
+
+/* uInt16 Array */
+typedef struct {
+    icUInt16Number      data[icAny];    /* Variable array of values */
+} icUInt16Array;
+
+/* Int16 Array */
+typedef struct {
+    icInt16Number       data[icAny];    /* Variable array of values */
+} icInt16Array;
+
+/* uInt32 Array */
+typedef struct {
+    icUInt32Number      data[icAny];    /* Variable array of values */
+} icUInt32Array;
+
+/* Int32 Array */
+typedef struct {
+    icInt32Number       data[icAny];    /* Variable array of values */
+} icInt32Array;
+
+/* UInt64 Array */
+typedef struct {
+    icUInt64Number      data[icAny];    /* Variable array of values */
+} icUInt64Array;
+
+/* Int64 Array */
+typedef struct {
+    icInt64Number       data[icAny];    /* Variable array of values */
+} icInt64Array;
+    
+/* u16Fixed16 Array */
+typedef struct {
+    icU16Fixed16Number  data[icAny];    /* Variable array of values */
+} icU16Fixed16Array;
+
+/* s15Fixed16 Array */
+typedef struct {
+    icS15Fixed16Number  data[icAny];    /* Variable array of values */
+} icS15Fixed16Array;
+
+/* The base date time number */
+typedef struct {
+    icUInt16Number      year;
+    icUInt16Number      month;
+    icUInt16Number      day;
+    icUInt16Number      hours;
+    icUInt16Number      minutes;
+    icUInt16Number      seconds;
+} icDateTimeNumber;
+
+/* XYZ Number  */
+typedef struct {
+    icS15Fixed16Number  X;
+    icS15Fixed16Number  Y;
+    icS15Fixed16Number  Z;
+} icXYZNumber;
+
+/* XYZ Array */
+typedef struct {
+    icXYZNumber         data[icAny];    /* Variable array of XYZ numbers */
+} icXYZArray;
+
+/* Curve */
+typedef struct {
+    icUInt32Number      count;          /* Number of entries */
+    icUInt16Number      data[icAny];    /* The actual table data, real
+                                         * number is determined by count
+                                         * Interpretation depends on how
+                                         * data is used with a given tag
+                                         */
+} icCurve;
+
+/* Data */
+typedef struct {
+    icUInt32Number      dataFlag;       /* 0 = ascii, 1 = binary */
+    icInt8Number        data[icAny];    /* Data, size from tag */
+} icData;
+
+/* lut16 */
+typedef struct {
+    icUInt8Number       inputChan;      /* Number of input channels */
+    icUInt8Number       outputChan;     /* Number of output channels */
+    icUInt8Number       clutPoints;     /* Number of grid points */
+    icInt8Number        pad;            /* Padding for byte alignment */
+    icS15Fixed16Number  e00;            /* e00 in the 3 * 3 */
+    icS15Fixed16Number  e01;            /* e01 in the 3 * 3 */    
+    icS15Fixed16Number  e02;            /* e02 in the 3 * 3 */
+    icS15Fixed16Number  e10;            /* e10 in the 3 * 3 */
+    icS15Fixed16Number  e11;            /* e11 in the 3 * 3 */    
+    icS15Fixed16Number  e12;            /* e12 in the 3 * 3 */ 
+    icS15Fixed16Number  e20;            /* e20 in the 3 * 3 */
+    icS15Fixed16Number  e21;            /* e21 in the 3 * 3 */    
+    icS15Fixed16Number  e22;            /* e22 in the 3 * 3 */
+    icUInt16Number      inputEnt;       /* Num of in-table entries */
+    icUInt16Number      outputEnt;      /* Num of out-table entries */
+    icUInt16Number      data[icAny];    /* Data follows see spec */
+/*
+ *  Data that follows is of this form
+ *
+ *  icUInt16Number      inputTable[inputChan][icAny];   * The in-table
+ *  icUInt16Number      clutTable[icAny];               * The clut 
+ *  icUInt16Number      outputTable[outputChan][icAny]; * The out-table
+ */
+} icLut16;
+
+/* lut8, input & output tables are always 256 bytes in length */
+typedef struct {
+    icUInt8Number       inputChan;      /* Num of input channels */
+    icUInt8Number       outputChan;     /* Num of output channels */
+    icUInt8Number       clutPoints;     /* Num of grid points */
+    icInt8Number        pad;
+    icS15Fixed16Number  e00;            /* e00 in the 3 * 3 */
+    icS15Fixed16Number  e01;            /* e01 in the 3 * 3 */    
+    icS15Fixed16Number  e02;            /* e02 in the 3 * 3 */
+    icS15Fixed16Number  e10;            /* e10 in the 3 * 3 */
+    icS15Fixed16Number  e11;            /* e11 in the 3 * 3 */    
+    icS15Fixed16Number  e12;            /* e12 in the 3 * 3 */ 
+    icS15Fixed16Number  e20;            /* e20 in the 3 * 3 */
+    icS15Fixed16Number  e21;            /* e21 in the 3 * 3 */    
+    icS15Fixed16Number  e22;            /* e22 in the 3 * 3 */
+    icUInt8Number       data[icAny];    /* Data follows see spec */
+/*
+ *  Data that follows is of this form
+ *
+ *  icUInt8Number       inputTable[inputChan][256];     * The in-table
+ *  icUInt8Number       clutTable[icAny];               * The clut 
+ *  icUInt8Number       outputTable[outputChan][256];   * The out-table
+ */
+} icLut8;
+
+/* Measurement Data */
+typedef struct {
+    icStandardObserver          stdObserver;    /* Standard observer */
+    icXYZNumber                 backing;        /* XYZ for backing */
+    icMeasurementGeometry       geometry;       /* Meas. geometry */
+    icMeasurementFlare          flare;          /* Measurement flare */
+    icIlluminant                illuminant;     /* Illuminant */
+} icMeasurement;
+
+/* Named color */
+
+/*
+ * icNamedColor2 takes the place of icNamedColor 
+ */
+typedef struct {
+    icUInt32Number      vendorFlag;     /* Bottom 16 bits for IC use */
+    icUInt32Number      count;          /* Count of named colors */
+    icUInt32Number      nDeviceCoords;  /* Num of device coordinates */
+    icInt8Number        prefix[32];     /* Prefix for each color name */
+    icInt8Number        suffix[32];     /* Suffix for each color name */
+    icInt8Number        data[icAny];    /* Named color data follows */
+/*
+ *  Data that follows is of this form
+ *
+ * icInt8Number         root1[32];              * Root name for 1st color
+ * icUInt16Number       pcsCoords1[icAny];      * PCS coords of 1st color
+ * icUInt16Number       deviceCoords1[icAny];   * Dev coords of 1st color
+ * icInt8Number         root2[32];              * Root name for 2nd color
+ * icUInt16Number       pcsCoords2[icAny];      * PCS coords of 2nd color
+ * icUInt16Number       deviceCoords2[icAny];   * Dev coords of 2nd color
+ *                      :
+ *                      :
+ * Repeat for name and PCS and device color coordinates up to (count-1)
+ * 
+ * NOTES:  
+ * PCS and device space can be determined from the header.
+ *
+ * PCS coordinates are icUInt16 numbers and are described in Annex A of 
+ * the ICC spec. Only 16 bit L*a*b* and XYZ are allowed. The number of 
+ * coordinates is consistent with the headers PCS.
+ *
+ * Device coordinates are icUInt16 numbers where 0x0000 represents
+ * the minimum value and 0xFFFF represents the maximum value. 
+ * If the nDeviceCoords value is 0 this field is not given.
+ */
+} icNamedColor2;
+
+/* Profile sequence structure */
+typedef struct {
+    icSignature                 deviceMfg;      /* Dev Manufacturer */
+    icSignature                 deviceModel;    /* Dev Model */
+    icUInt64Number              attributes;     /* Dev attributes */
+    icTechnologySignature       technology;     /* Technology sig */
+    icInt8Number                data[icAny];    /* Desc text follows */
+/*
+ *  Data that follows is of this form, this is an icInt8Number
+ *  to avoid problems with a compiler generating  bad code as 
+ *  these arrays are variable in length.
+ *
+ * icTextDescription            deviceMfgDesc;  * Manufacturer text
+ * icTextDescription            modelDesc;      * Model text
+ */
+} icDescStruct;
+
+/* Profile sequence description */
+typedef struct {
+    icUInt32Number      count;          /* Number of descriptions */
+    icUInt8Number       data[icAny];    /* Array of desc structs */
+} icProfileSequenceDesc;
+
+/* textDescription */
+typedef struct {
+    icUInt32Number      count;          /* Description length */
+    icInt8Number        data[icAny];    /* Descriptions follow */
+/*
+ *  Data that follows is of this form
+ *
+ * icInt8Number         desc[count]     * NULL terminated ascii string
+ * icUInt32Number       ucLangCode;     * UniCode language code
+ * icUInt32Number       ucCount;        * UniCode description length
+ * icInt16Number        ucDesc[ucCount];* The UniCode description
+ * icUInt16Number       scCode;         * ScriptCode code
+ * icUInt8Number        scCount;        * ScriptCode count
+ * icInt8Number         scDesc[67];     * ScriptCode Description
+ */
+} icTextDescription;
+
+/* Screening Data */
+typedef struct {
+    icS15Fixed16Number  frequency;      /* Frequency */
+    icS15Fixed16Number  angle;          /* Screen angle */
+    icSpotShape         spotShape;      /* Spot Shape encodings below */
+} icScreeningData;
+
+typedef struct {
+    icUInt32Number      screeningFlag;  /* Screening flag */
+    icUInt32Number      channels;       /* Number of channels */
+    icScreeningData     data[icAny];    /* Array of screening data */
+} icScreening;
+
+/* Text Data */
+typedef struct {
+    icInt8Number        data[icAny];    /* Variable array of chars */
+} icText;
+
+/* Structure describing either a UCR or BG curve */
+typedef struct {
+    icUInt32Number      count;          /* Curve length */
+    icUInt16Number      curve[icAny];   /* The array of curve values */
+} icUcrBgCurve;
+
+/* Under color removal, black generation */
+typedef struct {
+    icInt8Number        data[icAny];            /* The Ucr BG data */
+/*
+ *  Data that follows is of this form, this is a icInt8Number
+ *  to avoid problems with a compiler generating  bad code as 
+ *  these arrays are variable in length.
+ *
+ * icUcrBgCurve         ucr;            * Ucr curve
+ * icUcrBgCurve         bg;             * Bg curve
+ * icInt8Number         string;         * UcrBg description
+ */
+} icUcrBg;
+
+/* viewingConditionsType */
+typedef struct {
+    icXYZNumber         illuminant;     /* In candelas per sq. meter */
+    icXYZNumber         surround;       /* In candelas per sq. meter */
+    icIlluminant        stdIluminant;   /* See icIlluminant defines */
+} icViewingCondition;
+
+/* CrdInfo type */
+typedef struct {
+    icUInt32Number      count;          /* Char count includes NULL */
+    icInt8Number        desc[icAny];    /* Null terminated string */
+} icCrdInfo;
+
+/*------------------------------------------------------------------------*/
+/*
+ * Tag Type definitions
+ */
+
+/*
+ * Many of the structures contain variable length arrays. This
+ * is represented by the use of the convention.
+ *
+ *      type    data[icAny];
+ */
+
+/* The base part of each tag */
+typedef struct {
+    icTagTypeSignature  sig;            /* Signature */
+    icInt8Number        reserved[4];    /* Reserved, set to 0 */
+} icTagBase;
+
+/* curveType */
+typedef struct {
+    icTagBase           base;           /* Signature, "curv" */
+    icCurve             curve;          /* The curve data */
+} icCurveType;
+
+/* dataType */
+typedef struct {
+    icTagBase           base;           /* Signature, "data" */
+    icData              data;           /* The data structure */
+} icDataType;
+
+/* dateTimeType */
+typedef struct {
+    icTagBase           base;           /* Signature, "dtim" */
+    icDateTimeNumber    date;           /* The date */
+} icDateTimeType;
+
+/* lut16Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "mft2" */
+    icLut16             lut;            /* Lut16 data */
+} icLut16Type;
+
+/* lut8Type, input & output tables are always 256 bytes in length */
+typedef struct {
+    icTagBase           base;           /* Signature, "mft1" */
+    icLut8              lut;            /* Lut8 data */
+} icLut8Type;
+
+/* Measurement Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "meas" */
+    icMeasurement       measurement;    /* Measurement data */
+} icMeasurementType;
+
+/* Named color type */
+/* icNamedColor2Type, replaces icNamedColorType */
+typedef struct {
+    icTagBase           base;           /* Signature, "ncl2" */
+    icNamedColor2       ncolor;         /* Named color data */
+} icNamedColor2Type;
+
+/* Profile sequence description type */
+typedef struct {
+    icTagBase                   base;   /* Signature, "pseq" */
+    icProfileSequenceDesc       desc;   /* The seq description */
+} icProfileSequenceDescType;
+
+/* textDescriptionType */
+typedef struct {
+    icTagBase                   base;   /* Signature, "desc" */
+    icTextDescription           desc;   /* The description */
+} icTextDescriptionType;
+
+/* s15Fixed16Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "sf32" */
+    icS15Fixed16Array   data;           /* Array of values */
+} icS15Fixed16ArrayType;
+
+typedef struct {
+    icTagBase           base;           /* Signature, "scrn" */
+    icScreening         screen;         /* Screening structure */
+} icScreeningType;
+
+/* sigType */
+typedef struct {
+    icTagBase           base;           /* Signature, "sig" */
+    icSignature         signature;      /* The signature data */
+} icSignatureType;
+
+/* textType */
+typedef struct {
+    icTagBase           base;           /* Signature, "text" */
+    icText              data;           /* Variable array of chars */
+} icTextType;
+
+/* u16Fixed16Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "uf32" */
+    icU16Fixed16Array   data;           /* Variable array of values */
+} icU16Fixed16ArrayType;
+
+/* Under color removal, black generation type */
+typedef struct {
+    icTagBase           base;           /* Signature, "bfd " */
+    icUcrBg             data;           /* ucrBg structure */
+} icUcrBgType;
+
+/* uInt16Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "ui16" */
+    icUInt16Array       data;           /* Variable array of values */
+} icUInt16ArrayType;
+
+/* uInt32Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "ui32" */
+    icUInt32Array       data;           /* Variable array of values */
+} icUInt32ArrayType;
+
+/* uInt64Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "ui64" */
+    icUInt64Array       data;           /* Variable array of values */
+} icUInt64ArrayType;
+    
+/* uInt8Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "ui08" */
+    icUInt8Array        data;           /* Variable array of values */
+} icUInt8ArrayType;
+
+/* viewingConditionsType */
+typedef struct {
+    icTagBase           base;           /* Signature, "view" */
+    icViewingCondition  view;           /* Viewing conditions */
+} icViewingConditionType;
+
+/* XYZ Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "XYZ" */
+    icXYZArray          data;           /* Variable array of XYZ nums */
+} icXYZType;
+
+/* CRDInfoType where [0] is the CRD product name count and string and
+ * [1] -[5] are the rendering intents 0-4 counts and strings
+ */
+typedef struct {
+    icTagBase           base;           /* Signature, "crdi" */
+    icCrdInfo           info;           /* 5 sets of counts & strings */
+}icCrdInfoType;
+     /*   icCrdInfo       productName;     PS product count/string */
+     /*   icCrdInfo       CRDName0;        CRD name for intent 0 */ 
+     /*   icCrdInfo       CRDName1;        CRD name for intent 1 */ 
+     /*   icCrdInfo       CRDName2;        CRD name for intent 2 */ 
+     /*   icCrdInfo       CRDName3;        CRD name for intent 3 */
+    
+/*------------------------------------------------------------------------*/
+
+/*
+ * Lists of tags, tags, profile header and profile structure
+ */
+
+/* A tag */
+typedef struct {
+    icTagSignature      sig;            /* The tag signature */
+    icUInt32Number      offset;         /* Start of tag relative to 
+                                         * start of header, Spec 
+                                         * Clause 5 */
+    icUInt32Number      size;           /* Size in bytes */
+} icTag;
+
+/* A Structure that may be used independently for a list of tags */
+typedef struct {
+    icUInt32Number      count;          /* Num tags in the profile */
+    icTag               tags[icAny];    /* Variable array of tags */
+} icTagList;
+
+/* The Profile header */
+typedef struct {
+    icUInt32Number              size;           /* Prof size in bytes */
+    icSignature                 cmmId;          /* CMM for profile */
+    icUInt32Number              version;        /* Format version */
+    icProfileClassSignature     deviceClass;    /* Type of profile */
+    icColorSpaceSignature       colorSpace;     /* Clr space of data */
+    icColorSpaceSignature       pcs;            /* PCS, XYZ or Lab */
+    icDateTimeNumber            date;           /* Creation Date */
+    icSignature                 magic;          /* icMagicNumber */
+    icPlatformSignature         platform;       /* Primary Platform */
+    icUInt32Number              flags;          /* Various bits */
+    icSignature                 manufacturer;   /* Dev manufacturer */
+    icUInt32Number              model;          /* Dev model number */
+    icUInt64Number              attributes;     /* Device attributes */
+    icUInt32Number              renderingIntent;/* Rendering intent */
+    icXYZNumber                 illuminant;     /* Profile illuminant */
+    icSignature                 creator;        /* Profile creator */
+    icInt8Number                reserved[44];   /* Reserved */
+} icHeader;
+
+/* 
+ * A profile, 
+ * we can't use icTagList here because its not at the end of the structure
+ */
+typedef struct {
+    icHeader            header;         /* The header */
+    icUInt32Number      count;          /* Num tags in the profile */
+    icInt8Number        data[icAny];    /* The tagTable and tagData */
+/*
+ * Data that follows is of the form
+ *
+ * icTag        tagTable[icAny];        * The tag table 
+ * icInt8Number tagData[icAny];         * The tag data 
+ */
+} icProfile;           
+
+/*------------------------------------------------------------------------*/
+/* Obsolete entries */
+
+/* icNamedColor was replaced with icNamedColor2 */
+typedef struct {
+    icUInt32Number      vendorFlag;     /* Bottom 16 bits for IC use */
+    icUInt32Number      count;          /* Count of named colors */
+    icInt8Number        data[icAny];    /* Named color data follows */
+/*
+ *  Data that follows is of this form
+ *
+ * icInt8Number         prefix[icAny];  * Prefix 
+ * icInt8Number         suffix[icAny];  * Suffix 
+ * icInt8Number         root1[icAny];   * Root name 
+ * icInt8Number         coords1[icAny]; * Color coordinates 
+ * icInt8Number         root2[icAny];   * Root name 
+ * icInt8Number         coords2[icAny]; * Color coordinates 
+ *                      :
+ *                      :
+ * Repeat for root name and color coordinates up to (count-1)
+ */
+} icNamedColor;
+
+/* icNamedColorType was replaced by icNamedColor2Type */
+typedef struct {
+    icTagBase           base;           /* Signature, "ncol" */
+    icNamedColor        ncolor;         /* Named color data */
+} icNamedColorType;
+
+#endif /* ICC_H */

File include/lcms.h

+//
+//  Little cms
+//  Copyright (C) 1998-2006 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the "Software"), 
+// to deal in the Software without restriction, including without limitation 
+// the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+// and/or sell copies of the Software, and to permit persons to whom the Software 
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in 
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Version 1.16
+
+#ifndef __cms_H
+
+// ********** Configuration toggles ****************************************
+
+//   Optimization mode.
+//
+// Note that 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 USE_FLOAT        1
+// #define USE_C            1
+#define USE_ASSEMBLER    1
+
+// Define this if you are using this package as a DLL (windows only)
+
+// #define LCMS_DLL     1
+// #define LCMS_DLL_BUILD   1
+
+// Uncomment if you are trying the engine in a non-windows environment
+// like linux, SGI, VAX, FreeBSD, BeOS, etc. 
+#define NON_WINDOWS  1
+
+// Uncomment this one if you are using big endian machines (only meaningful
+// when NON_WINDOWS is used)
+// #define USE_BIG_ENDIAN   1
+
+// Uncomment this one if your compiler/machine does support the
+// "long long" type This will speedup fixed point math. (USE_C only)
+#define USE_INT64        1
+
+// Some machines does not have a reliable 'swab' function. Usually
+// leave commented unless the testbed diagnoses the contrary.
+// #define USE_CUSTOM_SWAB   1
+
+// Uncomment this if your compiler supports inline
+#define USE_INLINE  1
+
+// Uncomment this if your compiler doesn't work with fast floor function
+// #define USE_DEFAULT_FLOOR_CONVERSION  1
+
+// Uncomment this line on multithreading environments
+// #define USE_PTHREADS    1
+
+// Uncomment this line if you want lcms to use the black point tag in profile, 
+// if commented, lcms will compute the black point by its own. 
+// It is safer to leve it commented out
+// #define HONOR_BLACK_POINT_TAG    1
+
+// ********** End of configuration toggles ******************************
+
+#define LCMS_VERSION        116
+
+// Microsoft VisualC++
+
+// Deal with Microsoft's attempt at deprecating C standard runtime functions 
+
+#ifdef _MSC_VER
+#    undef NON_WINDOWS
+#    if (_MSC_VER >= 1400)
+#        define _CRT_SECURE_NO_DEPRECATE 1
+#    endif
+#endif
+
+// Borland C 
+
+#ifdef __BORLANDC__
+#    undef NON_WINDOWS
+#endif
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <time.h>
+
+// Metroworks CodeWarrior
+#ifdef __MWERKS__ 
+#   define unlink remove
+#   if WIN32 
+#       define USE_CUSTOM_SWAB 1
+#       undef  NON_WINDOWS
+#   else
+#       define NON_WINDOWS   1
+#   endif
+#endif
+
+
+// Here comes the Non-Windows settings
+
+#ifdef NON_WINDOWS
+
+// Non windows environments. Also avoid indentation on includes.
+
+#ifdef USE_PTHREADS
+#   include <pthread.h>
+typedef    pthread_rwlock_t      LCMS_RWLOCK_T;
+#   define LCMS_CREATE_LOCK(x)       pthread_rwlock_init((x), NULL) 
+#   define LCMS_FREE_LOCK(x)         pthread_rwlock_destroy((x))
+#   define LCMS_READ_LOCK(x)		 pthread_rwlock_rdlock((x))
+#   define LCMS_WRITE_LOCK(x)        pthread_rwlock_wrlock((x))
+#   define LCMS_UNLOCK(x)            pthread_rwlock_unlock((x))
+#endif
+
+#undef LCMS_DLL
+
+#ifdef  USE_ASSEMBLER
+#  undef  USE_ASSEMBLER
+#  define USE_C               1
+#endif
+
+#ifdef _HOST_BIG_ENDIAN
+#   define USE_BIG_ENDIAN      1
+#endif
+
+#if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__)
+#   define USE_BIG_ENDIAN      1
+#endif
+
+#if TARGET_CPU_PPC
+#   define USE_BIG_ENDIAN   1
+#endif
+
+#if macintosh
+# ifndef __LITTLE_ENDIAN__
+#   define USE_BIG_ENDIAN      1
+# endif
+#endif
+
+#if __BIG_ENDIAN__
+#   define USE_BIG_ENDIAN      1
+#endif
+
+#ifdef WORDS_BIGENDIAN
+#   define USE_BIG_ENDIAN      1
+#endif
+
+#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
+#  include <sys/types.h>
+#  define USE_INT64           1
+#  define LCMSSLONGLONG       int64_t
+#  define LCMSULONGLONG       u_int64_t
+#endif
+
+#ifdef USE_INT64
+#   ifndef LCMSULONGLONG
+#       define LCMSULONGLONG unsigned long long
+#       define LCMSSLONGLONG long long
+#   endif
+#endif
+
+#if !defined(__INTEGRITY)
+#   include <memory.h>
+#endif
+
+#include <string.h>
+
+#if defined(__GNUC__) || defined(__FreeBSD__)
+#   include <unistd.h>
+#endif
+
+#ifndef LCMS_WIN_TYPES_ALREADY_DEFINED
+
+typedef unsigned char BYTE, *LPBYTE; 
+typedef unsigned short WORD, *LPWORD;
+typedef unsigned long DWORD, *LPDWORD;
+typedef int BOOL;
+typedef char *LPSTR;
+typedef void *LPVOID;
+typedef void* LCMSHANDLE;
+
+
+#define ZeroMemory(p,l)     memset((p),0,(l))
+#define CopyMemory(d,s,l)   memcpy((d),(s),(l))
+#define FAR
+
+#ifndef stricmp
+#   define stricmp strcasecmp
+#endif
+
+
+#ifndef FALSE
+#       define FALSE 0
+#endif
+#ifndef TRUE
+#       define TRUE  1
+#endif
+
+#define LOWORD(l)    ((WORD)(l))
+#define HIWORD(l)    ((WORD)((DWORD)(l) >> 16))
+
+#ifndef MAX_PATH
+#       define MAX_PATH     (256)
+#endif
+
+#define cdecl
+#endif
+
+// The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). 
+
+#define LCMS_INLINE static inline
+
+#else
+
+// Win32 stuff
+
+#ifndef WIN32_LEAN_AND_MEAN
+#  define WIN32_LEAN_AND_MEAN
+#endif
+
+#include <windows.h>
+
+typedef HANDLE LCMSHANDLE;
+
+
+#ifdef  USE_INT64
+#  ifndef LCMSULONGLONG
+#    define LCMSULONGLONG unsigned __int64
+#    define LCMSSLONGLONG __int64
+#  endif
+#endif
+
+// This works for both VC & BorlandC
+#define LCMS_INLINE __inline
+
+#ifdef USE_PTHREADS
+typedef CRITICAL_SECTION LCMS_RWLOCK_T;
+#   define LCMS_CREATE_LOCK(x)       InitializeCriticalSection((x))
+#   define LCMS_FREE_LOCK(x)         DeleteCriticalSection((x))
+#   define LCMS_READ_LOCK(x)		 EnterCriticalSection((x))
+#   define LCMS_WRITE_LOCK(x)        EnterCriticalSection((x))
+#   define LCMS_UNLOCK(x)            LeaveCriticalSection((x))
+#endif
+
+#endif
+
+#ifndef USE_PTHREADS
+typedef int LCMS_RWLOCK_T;             
+#   define LCMS_CREATE_LOCK(x)       
+#   define LCMS_FREE_LOCK(x)         
+#   define LCMS_READ_LOCK(x)		 
+#   define LCMS_WRITE_LOCK(x)        
+#   define LCMS_UNLOCK(x)            
+#endif
+
+
+#include "icc34.h"          // ICC header file
+
+
+// Some tag & type additions
+
+#define lcmsSignature                  ((icSignature)           0x6c636d73L)
+
+#define icSigLuvKData                  ((icColorSpaceSignature) 0x4C75764BL)  // 'LuvK'
+
+#define icSigHexachromeData            ((icColorSpaceSignature) 0x4d434836L)  // MCH6
+#define icSigHeptachromeData           ((icColorSpaceSignature) 0x4d434837L)  // MCH7
+#define icSigOctachromeData            ((icColorSpaceSignature) 0x4d434838L)  // MCH8
+
+#define icSigMCH5Data                  ((icColorSpaceSignature) 0x4d434835L)  // MCH5
+#define icSigMCH6Data                  ((icColorSpaceSignature) 0x4d434836L)  // MCH6
+#define icSigMCH7Data                  ((icColorSpaceSignature) 0x4d434837L)  // MCH7
+#define icSigMCH8Data                  ((icColorSpaceSignature) 0x4d434838L)  // MCH8
+#define icSigMCH9Data                  ((icColorSpaceSignature) 0x4d434839L)  // MCH9
+#define icSigMCHAData                  ((icColorSpaceSignature) 0x4d434841L)  // MCHA
+#define icSigMCHBData                  ((icColorSpaceSignature) 0x4d434842L)  // MCHB
+#define icSigMCHCData                  ((icColorSpaceSignature) 0x4d434843L)  // MCHC
+#define icSigMCHDData                  ((icColorSpaceSignature) 0x4d434844L)  // MCHD
+#define icSigMCHEData                  ((icColorSpaceSignature) 0x4d434845L)  // MCHE
+#define icSigMCHFData                  ((icColorSpaceSignature) 0x4d434846L)  // MCHF
+
+#define icSigCAM97JABData              ((icColorSpaceSignature) 0x4A616231L)  // 'Jab1' H. Zeng
+#define icSigCAM02JABData              ((icColorSpaceSignature) 0x4A616232L)  // 'Jab2' H. Zeng
+#define icSigCAM02JCHData              ((icColorSpaceSignature) 0x4A636A32L)  // 'Jch2' H. Zeng
+
+#define icSigChromaticityTag            ((icTagSignature) 0x6368726dL) // As per Addendum 2 to Spec. ICC.1:1998-09
+#define icSigChromaticAdaptationTag     ((icTagSignature) 0x63686164L) // 'chad'
+#define icSigColorantTableTag           ((icTagSignature) 0x636c7274L) // 'clrt'
+#define icSigColorantTableOutTag        ((icTagSignature) 0x636c6f74L) // 'clot'
+#define icSigHPGamutDescTag             ((icTagSignature) 0x676D7441L) // 'gmtA' H. Zeng               
+
+
+#define icSigParametricCurveType        ((icTagTypeSignature) 0x70617261L)  // parametric (ICC 4.0)
+#define icSigMultiLocalizedUnicodeType  ((icTagTypeSignature) 0x6D6C7563L)
+#define icSigS15Fixed16ArrayType        ((icTagTypeSignature) 0x73663332L) 
+#define icSigChromaticityType           ((icTagTypeSignature) 0x6368726dL)
+#define icSiglutAtoBType                ((icTagTypeSignature) 0x6d414220L)  // mAB 
+#define icSiglutBtoAType                ((icTagTypeSignature) 0x6d424120L)  // mBA 
+#define icSigColorantTableType          ((icTagTypeSignature) 0x636c7274L)  // clrt
+#define icSigHPGamutDescType            ((icTagTypeSignature) 0x676D7441L)  // gmtA H. Zeng               
+
+
+typedef struct {
+    icUInt8Number       gridPoints[16]; // Number of grid points in each dimension.  
+    icUInt8Number       prec;           // Precision of data elements in bytes.      
+    icUInt8Number       pad1;
+    icUInt8Number       pad2;
+    icUInt8Number       pad3;
+    /*icUInt8Number     data[icAny];     Data follows see spec for size */
+} icCLutStruct;
+
+// icLutAtoB  
+typedef struct {
+    icUInt8Number       inputChan;      // Number of input channels     
+    icUInt8Number       outputChan;     // Number of output channels    
+    icUInt8Number       pad1;
+    icUInt8Number       pad2;
+    icUInt32Number      offsetB;        // Offset to first "B" curve    
+    icUInt32Number      offsetMat;      // Offset to matrix             
+    icUInt32Number      offsetM;        // Offset to first "M" curve    
+    icUInt32Number      offsetC;        // Offset to CLUT               
+    icUInt32Number      offsetA;        // Offset to first "A" curve    
+    /*icUInt8Number     data[icAny];     Data follows see spec for size */
+} icLutAtoB;
+
+// icLutBtoA  
+typedef struct {
+    icUInt8Number       inputChan;      // Number of input channels     
+    icUInt8Number       outputChan;     // Number of output channels    
+    icUInt8Number       pad1;
+    icUInt8Number       pad2;
+    icUInt32Number      offsetB;        // Offset to first "B" curve    
+    icUInt32Number      offsetMat;      // Offset to matrix             
+    icUInt32Number      offsetM;        // Offset to first "M" curve    
+    icUInt32Number      offsetC;        // Offset to CLUT               
+    icUInt32Number      offsetA;        // Offset to first "A" curve    
+    /*icUInt8Number     data[icAny];     Data follows see spec for size */
+} icLutBtoA;
+
+
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Calling convention
+
+#ifdef NON_WINDOWS
+#  define LCMSEXPORT
+#  define LCMSAPI
+#else
+# ifdef LCMS_DLL
+#   ifdef __BORLANDC__
+#      define LCMSEXPORT __stdcall _export
+#      define LCMSAPI
+#   else
+       // VC++
+#       define LCMSEXPORT  _stdcall
+#       ifdef LCMS_DLL_BUILD
+#           define LCMSAPI     __declspec(dllexport)
+#       else
+#           define LCMSAPI     __declspec(dllimport)
+#       endif
+#   endif
+# else
+#       define LCMSEXPORT cdecl
+#       define LCMSAPI
+# endif
+#endif
+
+#ifdef  USE_ASSEMBLER
+#ifdef __BORLANDC__
+
+#      define ASM     asm
+#      define RET(v)  return(v)
+#else
+      // VC++
+#      define ASM     __asm
+#      define RET(v)  return
+#endif
+#endif
+
+#ifdef _MSC_VER
+#ifndef  stricmp
+#      define stricmp _stricmp
+#endif
+#ifndef unlink
+#      define unlink  _unlink
+#endif
+#ifndef swab
+#      define swab    _swab
+#endif
+#ifndef itoa
+#       define itoa   _itoa
+#endif
+#ifndef filelength
+#       define filelength _filelength
+#endif
+#ifndef fileno
+#       define fileno   _fileno
+#endif
+#ifndef strupr
+#       define strupr   _strupr
+#endif
+#ifndef hypot
+#       define hypot    _hypot
+#endif
+#endif
+
+
+#ifndef M_PI
+#       define M_PI    3.14159265358979323846
+#endif
+
+#ifndef LOGE
+#       define LOGE   0.4342944819   
+#endif
+
+// ********** Little cms API ***************************************************
+
+typedef LCMSHANDLE cmsHPROFILE;        // Opaque typedefs to hide internals
+typedef LCMSHANDLE cmsHTRANSFORM;
+
+#define MAXCHANNELS  16                // Maximum number of channels
+
+// Format of pixel is defined by one DWORD, using bit fields as follows
+//
+//            TTTTT U 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
+
+
+#define COLORSPACE_SH(s)       ((s) << 16)
+#define SWAPFIRST_SH(s)        ((s) << 14)
+#define FLAVOR_SH(s)           ((s) << 13)
+#define PLANAR_SH(p)           ((p) << 12)
+#define ENDIAN16_SH(e)         ((e) << 11)
+#define DOSWAP_SH(e)           ((e) << 10)
+#define EXTRA_SH(e)            ((e) << 7)
+#define CHANNELS_SH(c)         ((c) << 3)
+#define BYTES_SH(b)            (b)
+
+// Pixel types
+
+#define PT_ANY       0    // Don't check colorspace
+                          // 1 & 2 are reserved
+#define PT_GRAY      3
+#define PT_RGB       4
+#define PT_CMY       5
+#define PT_CMYK      6
+#define PT_YCbCr     7
+#define PT_YUV       8      // Lu'v'
+#define PT_XYZ       9
+#define PT_Lab       10
+#define PT_YUVK      11     // Lu'v'K
+#define PT_HSV       12
+#define PT_HLS       13
+#define PT_Yxy       14
+#define PT_HiFi      15
+#define PT_HiFi7     16
+#define PT_HiFi8     17
+#define PT_HiFi9     18
+#define PT_HiFi10    19
+#define PT_HiFi11    20
+#define PT_HiFi12    21
+#define PT_HiFi13    22
+#define PT_HiFi14    23
+#define PT_HiFi15    24
+
+#define NOCOLORSPACECHECK(x)    ((x) & 0xFFFF)
+
+// Some (not all!) representations
+
+#ifndef TYPE_RGB_8      // TYPE_RGB_8 is a very common identifier, so don't include ours
+                        // if user has it already defined.
+
+#define TYPE_GRAY_8            (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAY_8_REV        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_GRAY_16           (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAY_16_REV       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_GRAY_16_SE        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8           (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAYA_16          (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAYA_16_SE       (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8_PLANAR    (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_GRAYA_16_PLANAR   (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
+
+#define TYPE_RGB_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGB_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_BGR_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_RGB_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGB_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGB_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_BGR_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_BGR_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_RGBA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGBA_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_RGBA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGBA_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGBA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_ARGB_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ARGB_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
+
+#define TYPE_ABGR_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_ABGR_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_ABGR_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_ABGR_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_BGRA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
+
+#define TYPE_CMY_8             (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_CMY_8_PLANAR      (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMY_16            (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_CMY_16_PLANAR     (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMY_16_SE         (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_CMYK_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
+#define TYPE_CMYKA_8           (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))  
+#define TYPE_CMYK_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_YUVK_8            TYPE_CMYK_8_REV
+#define TYPE_CMYK_8_PLANAR     (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYK_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
+#define TYPE_CMYK_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_YUVK_16           TYPE_CMYK_16_REV
+#define TYPE_CMYK_16_PLANAR    (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYK_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_KYMC_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_KCMY_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
+
+
+// HiFi separations, Thanks to Steven Greaves for providing the code,
+// the colorspace is not checked
+#define TYPE_CMYK5_8           (CHANNELS_SH(5)|BYTES_SH(1))
+#define TYPE_CMYK5_16          (CHANNELS_SH(5)|BYTES_SH(2))
+#define TYPE_CMYK5_16_SE       (CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC5_8           (CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16          (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16_SE       (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_CMYKcm_8          (CHANNELS_SH(6)|BYTES_SH(1))
+#define TYPE_CMYKcm_8_PLANAR   (CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYKcm_16         (CHANNELS_SH(6)|BYTES_SH(2))
+#define TYPE_CMYKcm_16_PLANAR  (CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYKcm_16_SE      (CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// Separations with more than 6 channels aren't very standarized,
+// Except most start with CMYK and add other colors, so I just used
+// then total number of channels after CMYK i.e CMYK8_8
+
+#define TYPE_CMYK7_8           (CHANNELS_SH(7)|BYTES_SH(1))
+#define TYPE_CMYK7_16          (CHANNELS_SH(7)|BYTES_SH(2))
+#define TYPE_CMYK7_16_SE       (CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC7_8           (CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16          (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16_SE       (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK8_8           (CHANNELS_SH(8)|BYTES_SH(1))
+#define TYPE_CMYK8_16          (CHANNELS_SH(8)|BYTES_SH(2))
+#define TYPE_CMYK8_16_SE       (CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC8_8           (CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16          (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16_SE       (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK9_8           (CHANNELS_SH(9)|BYTES_SH(1))
+#define TYPE_CMYK9_16          (CHANNELS_SH(9)|BYTES_SH(2))
+#define TYPE_CMYK9_16_SE       (CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC9_8           (CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16          (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16_SE       (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK10_8          (CHANNELS_SH(10)|BYTES_SH(1))
+#define TYPE_CMYK10_16         (CHANNELS_SH(10)|BYTES_SH(2))
+#define TYPE_CMYK10_16_SE      (CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC10_8          (CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16         (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16_SE      (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK11_8          (CHANNELS_SH(11)|BYTES_SH(1))
+#define TYPE_CMYK11_16         (CHANNELS_SH(11)|BYTES_SH(2))
+#define TYPE_CMYK11_16_SE      (CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC11_8          (CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16         (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16_SE      (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK12_8          (CHANNELS_SH(12)|BYTES_SH(1))
+#define TYPE_CMYK12_16         (CHANNELS_SH(12)|BYTES_SH(2))
+#define TYPE_CMYK12_16_SE      (CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC12_8          (CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16         (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16_SE      (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+// Colorimetric
+
+#define TYPE_XYZ_16            (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Lab_8             (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_ALab_8            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1))
+#define TYPE_Lab_16            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Yxy_16            (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
+
+// YCbCr
+
+#define TYPE_YCbCr_8           (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YCbCr_8_PLANAR    (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YCbCr_16          (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YCbCr_16_PLANAR   (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YCbCr_16_SE       (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// YUV
+
+#define TYPE_YUV_8           (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YUV_8_PLANAR    (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YUV_16          (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YUV_16_PLANAR   (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YUV_16_SE       (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// HLS
+
+#define TYPE_HLS_8           (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HLS_8_PLANAR    (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HLS_16          (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HLS_16_PLANAR   (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HLS_16_SE       (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+
+// HSV
+
+#define TYPE_HSV_8           (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HSV_8_PLANAR    (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HSV_16          (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HSV_16_PLANAR   (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HSV_16_SE       (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// Named color index. Only 16 bits allowed (don't check colorspace) 
+
+#define TYPE_NAMED_COLOR_INDEX   (CHANNELS_SH(1)|BYTES_SH(2))
+
+// Double values. Painful slow, but sometimes helpful. NOTE THAT 'BYTES' FIELD IS SET TO ZERO!
+
+#define TYPE_XYZ_DBL        (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_Lab_DBL        (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_GRAY_DBL       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
+#define TYPE_RGB_DBL        (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_CMYK_DBL       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
+
+#endif
+
+
+// Gamma table parameters
+
+typedef struct {
+
+	unsigned int Crc32;  // Has my table been touched?
+
+	// Keep initial parameters for further serialization
+
+    int          Type;
+    double       Params[10];
+
+	}  LCMSGAMMAPARAMS, FAR* LPLCMSGAMMAPARAMS;
+    
+// Gamma tables.
+
+typedef struct {
+
+	LCMSGAMMAPARAMS Seed;	// Parameters used for table creation
+                      
+    // Table-based representation follows
+
+    int  nEntries;
+    WORD GammaTable[1];
+
+    } GAMMATABLE;
+
+typedef GAMMATABLE FAR* LPGAMMATABLE;
+
+// Sampled curves (1D)
+typedef struct {
+
+    int     nItems;
+    double* Values;
+
+    } SAMPLEDCURVE;
+
+typedef SAMPLEDCURVE FAR* LPSAMPLEDCURVE;
+
+// Vectors
+typedef struct {                // Float Vector
+
+    double n[3];
+
+    } VEC3;
+
+typedef VEC3 FAR* LPVEC3;
+
+
+typedef struct {                // Matrix
+        
+    VEC3 v[3];
+    
+    } MAT3; 
+
+typedef MAT3 FAR* LPMAT3;
+
+// Colorspace values
+typedef struct {
+    
+        double X;
+        double Y;
+        double Z;
+
+    } cmsCIEXYZ; 
+        
+typedef cmsCIEXYZ FAR* LPcmsCIEXYZ;
+
+typedef struct {
+               
+        double x;
+        double y;
+        double Y;
+
+    } cmsCIExyY;
+
+typedef cmsCIExyY FAR* LPcmsCIExyY;
+
+typedef struct {
+               
+        double L;
+        double a;               
+        double b;
+               
+    } cmsCIELab;
+
+typedef cmsCIELab FAR* LPcmsCIELab;
+
+typedef struct {
+               
+        double L;
+        double C;
+        double h;
+
+    } cmsCIELCh;
+
+typedef cmsCIELCh FAR* LPcmsCIELCh;
+
+typedef struct {
+               
+        double J;
+        double C;
+        double h;
+
+    } cmsJCh;
+
+typedef cmsJCh FAR* LPcmsJCh;
+
+// Primaries
+typedef struct {
+
+        cmsCIEXYZ  Red;
+        cmsCIEXYZ  Green;
+        cmsCIEXYZ  Blue;
+
+    } cmsCIEXYZTRIPLE;
+
+typedef cmsCIEXYZTRIPLE FAR* LPcmsCIEXYZTRIPLE;
+
+
+typedef struct {
+              
+        cmsCIExyY  Red;
+        cmsCIExyY  Green;
+        cmsCIExyY  Blue;
+
+    } cmsCIExyYTRIPLE;
+
+typedef cmsCIExyYTRIPLE FAR* LPcmsCIExyYTRIPLE;
+
+
+
+// Following ICC spec
+
+#define D50X  (0.9642)  
+#define D50Y  (1.0)
+#define D50Z  (0.8249)
+
+#define PERCEPTUAL_BLACK_X  (0.00336)
+#define PERCEPTUAL_BLACK_Y  (0.0034731)
+#define PERCEPTUAL_BLACK_Z  (0.00287)
+
+// Does return pointers to constant structs
+
+LCMSAPI LPcmsCIEXYZ LCMSEXPORT cmsD50_XYZ(void);
+LCMSAPI LPcmsCIExyY LCMSEXPORT cmsD50_xyY(void); 
+
+
+// Input/Output
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize);
+LCMSAPI BOOL          LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
+
+// Predefined run-time profiles
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateRGBProfile(LPcmsCIExyY WhitePoint,
+                                        LPcmsCIExyYTRIPLE Primaries,
+                                        LPGAMMATABLE TransferFunction[3]);
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateGrayProfile(LPcmsCIExyY WhitePoint,
+                                              LPGAMMATABLE TransferFunction);
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorSpace,
+                                                        LPGAMMATABLE TransferFunctions[]);
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature ColorSpace,
+                                                      double Limit);
+
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint);
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint);
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateXYZProfile(void);
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreate_sRGBProfile(void);
+
+
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
+                                                     double Bright, 
+                                                     double Contrast,
+                                                     double Hue,
+                                                     double Saturation,
+                                                     int TempSrc, 
+                                                     int TempDest);
+
+LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateNULLProfile(void);
+
+
+// Colorimetric space conversions
+
+LCMSAPI void          LCMSEXPORT cmsXYZ2xyY(LPcmsCIExyY Dest, const cmsCIEXYZ* Source);
+LCMSAPI void          LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, const cmsCIExyY* Source);
+LCMSAPI void          LCMSEXPORT cmsXYZ2Lab(LPcmsCIEXYZ WhitePoint, LPcmsCIELab Lab, const cmsCIEXYZ* xyz);
+LCMSAPI void          LCMSEXPORT cmsLab2XYZ(LPcmsCIEXYZ WhitePoint, LPcmsCIEXYZ xyz, const cmsCIELab* Lab);
+LCMSAPI void          LCMSEXPORT cmsLab2LCh(LPcmsCIELCh LCh, const cmsCIELab* Lab);
+LCMSAPI void          LCMSEXPORT cmsLCh2Lab(LPcmsCIELab Lab, const cmsCIELCh* LCh);
+
+
+// CIELab handling
+
+LCMSAPI double        LCMSEXPORT cmsDeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double        LCMSEXPORT cmsCIE94DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double        LCMSEXPORT cmsBFDdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double        LCMSEXPORT cmsCMCdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double        LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2, double Kl, double Kc, double Kh);
+
+LCMSAPI void          LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin);
+
+LCMSAPI BOOL          LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
+
+LCMSAPI BOOL          LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
+                                                        LPcmsCIEXYZ SourceWhitePt,
+                                                        LPcmsCIEXYZ Illuminant,
+                                                        LPcmsCIEXYZ Value);
+
+LCMSAPI BOOL          LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
+                                                        LPcmsCIExyY WhitePoint,
+                                                        LPcmsCIExyYTRIPLE Primaries);
+
+// Viewing conditions 
+
+#define AVG_SURROUND_4     0
+#define AVG_SURROUND       1
+#define DIM_SURROUND       2
+#define DARK_SURROUND      3
+#define CUTSHEET_SURROUND  4
+
+#define D_CALCULATE             (-1)
+#define D_CALCULATE_DISCOUNT    (-2)
+
+typedef struct {
+
+              cmsCIEXYZ whitePoint;
+              double    Yb;
+              double    La;
+              int       surround;
+              double    D_value;
+
+    } cmsViewingConditions;
+
+typedef cmsViewingConditions FAR* LPcmsViewingConditions;
+
+// CIECAM97s
+
+LCMSAPI LCMSHANDLE    LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC2);
+LCMSAPI void          LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel);
+LCMSAPI void          LCMSEXPORT cmsCIECAM97sForward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
+LCMSAPI void          LCMSEXPORT cmsCIECAM97sReverse(LCMSHANDLE hModel, LPcmsJCh pIn,    LPcmsCIEXYZ pOut);
+
+
+// CIECAM02
+
+LCMSAPI LCMSHANDLE    LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC);
+LCMSAPI void          LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel);
+LCMSAPI void          LCMSEXPORT cmsCIECAM02Forward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
+LCMSAPI void          LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn,    LPcmsCIEXYZ pOut);
+
+
+// Gamma
+
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsBuildGamma(int nEntries, double Gamma);
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]);
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsAllocGamma(int nEntries);
+LCMSAPI void          LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma);
+LCMSAPI void          LCMSEXPORT cmsFreeGammaTriple(LPGAMMATABLE Gamma[3]);
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsDupGamma(LPGAMMATABLE Src);
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma);
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma,  LPGAMMATABLE OutGamma);
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma,  LPGAMMATABLE OutGamma, int nPoints);
+LCMSAPI BOOL          LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
+LCMSAPI double        LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t);
+LCMSAPI double        LCMSEXPORT cmsEstimateGammaEx(LPWORD Table, int nEntries, double Thereshold); 
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig);
+LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSignature sig);
+
+// Access to Profile data.
+
+LCMSAPI BOOL          LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL          LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL          LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL          LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile);
+LCMSAPI DWORD         LCMSEXPORT cmsTakeHeaderFlags(cmsHPROFILE hProfile);
+LCMSAPI DWORD         LCMSEXPORT cmsTakeHeaderAttributes(cmsHPROFILE hProfile);
+
+LCMSAPI void          LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode);
+LCMSAPI const char*   LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile);
+LCMSAPI const char*   LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile);
+LCMSAPI const char*   LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile);
+LCMSAPI const char*   LCMSEXPORT cmsTakeManufacturer(cmsHPROFILE hProfile);
+LCMSAPI const char*   LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile);
+LCMSAPI const char*   LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile);
+LCMSAPI const BYTE*   LCMSEXPORT cmsTakeProfileID(cmsHPROFILE hProfile);
+
+LCMSAPI BOOL          LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL          LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
+
+LCMSAPI BOOL          LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
+LCMSAPI int           LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile);
+
+LCMSAPI BOOL          LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len);
+                                                  
+LCMSAPI int           LCMSEXPORT cmsReadICCTextEx(cmsHPROFILE hProfile, icTagSignature sig, char *Text, size_t size);
+LCMSAPI int           LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Text);
+
+
+#define LCMS_DESC_MAX     512
+
+typedef struct {
+
+            icSignature                 deviceMfg;      
+            icSignature                 deviceModel;                
+            icUInt32Number              attributes[2];     
+            icTechnologySignature       technology;     
+            
+            char Manufacturer[LCMS_DESC_MAX];
+            char Model[LCMS_DESC_MAX];
+
+    } cmsPSEQDESC, FAR *LPcmsPSEQDESC;
+
+typedef struct {
+
+            int n;
+            cmsPSEQDESC seq[1];
+
+    } cmsSEQ, FAR *LPcmsSEQ;
+
+
+LCMSAPI LPcmsSEQ      LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile);
+LCMSAPI void          LCMSEXPORT cmsFreeProfileSequenceDescription(LPcmsSEQ pseq);
+
+
+// Extended gamut tag -- an HP extension
+
+#define LCMSGAMUTMETHOD_SEGMENTMAXIMA   0
+#define LCMSGAMUTMETHOD_CONVEXHULL      1
+#define LCMSGAMUTMETHOD_ALPHASHAPE      2
+
+
+#define LCMSGAMUT_PHYSICAL				0
+#define LCMSGAMUT_HP1					1
+#define LCMSGAMUT_HP2					2
+
+typedef struct {
+
+			icColorSpaceSignature  CoordSig;	// Gamut coordinates signature
+			icUInt16Number         Method;		// Method used to generate gamut
+			icUInt16Number         Usage;       // Gamut usage or intent
+
+			char Description[LCMS_DESC_MAX];	// Textual description
+			
+			cmsViewingConditions   Vc;			// The viewing conditions
+
+			icUInt32Number         Count;		// Number of entries		
+			double				   Data[1];	    // The current data		
+
+	} cmsGAMUTEX, FAR* LPcmsGAMUTEX;
+
+
+LCMSAPI LPcmsGAMUTEX LCMSEXPORT cmsReadExtendedGamut(cmsHPROFILE hProfile, int index);
+LCMSAPI void         LCMSEXPORT cmsFreeExtendedGamut(LPcmsGAMUTEX gex);
+
+
+
+ 
+// Translate form/to our notation to ICC 
+LCMSAPI icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation);
+LCMSAPI                   int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace);
+LCMSAPI                   int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace);
+LCMSAPI BOOL                  LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile);
+
+#define LCMS_USED_AS_INPUT      0
+#define LCMS_USED_AS_OUTPUT     1
+#define LCMS_USED_AS_PROOF      2
+
+LCMSAPI BOOL         LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection);
+
+LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
+LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
+LCMSAPI icProfileClassSignature LCMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);
+LCMSAPI DWORD                   LCMSEXPORT cmsGetProfileICCversion(cmsHPROFILE hProfile);
+LCMSAPI void                    LCMSEXPORT cmsSetProfileICCversion(cmsHPROFILE hProfile, DWORD Version);
+LCMSAPI icInt32Number           LCMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile);
+LCMSAPI icTagSignature          LCMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, icInt32Number n);
+
+
+LCMSAPI void          LCMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, icProfileClassSignature sig);
+LCMSAPI void          LCMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig);
+LCMSAPI void          LCMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs);
+LCMSAPI void          LCMSEXPORT cmsSetRenderingIntent(cmsHPROFILE hProfile, int RenderingIntent);
+LCMSAPI void          LCMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, DWORD Flags);
+LCMSAPI void          LCMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, DWORD Flags);
+LCMSAPI void          LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID);