[PATCH] mscms: Use lcms2, when available [try 2]

Detlef Riekenberg wine.dev at web.de
Sun Jun 2 15:49:45 CDT 2013


try2:
import the unchanged icc34.h from the lcms (v1) dev. package.
(Do we need to add a Wine LGPL licence header for icc34.h?)

The plan is to remove this include, when changing Wine
to use the new getter/setter functions of lcms2
(After the release of Wine-1.6)

********************************

lcms2 was released on 8. May 2010 and should be present in important
distributions since a while.

lcms v1 is on the way to be phased out in the newest distribution versions.

Possible Implementations:
1: Use lcms2 when available with a fallback to lcms v1 (static linking)
2: Replace lcms v1 with lcms2 without fallback (static linking)
3: Use runtime linking, try lcms2 with a fallback to lcms v1

I used Implementation 1 for this patch.
The next step is removing support for lcms v1 after the stable release.

Differences between lcmsv2 and lcms v1
-- cmsCreateLabProfile no longer present in lcms2
   The function was renamed to cmsCreateLab2Profile

-- cmsSetErrorHandler no longer present in lcms2
   Does Wine really need the error handler?
   For this Patch, I added an error handler with cmsSetLogErrorHandler

-- lcms2 supports 24bit profiles, while lcms v1 did not

I have no app to test mscms.

Please commit or comment.

--
By by ... Detlef
---
 configure.ac            |   24 +-
 dlls/mscms/icc34.h      | 1029 +++++++++++++++++++++++++++++++++++++++++++++++
 dlls/mscms/mscms_main.c |    4 +-
 dlls/mscms/mscms_priv.h |   15 +-
 dlls/mscms/transform.c  |    8 +-
 5 files changed, 1068 insertions(+), 12 deletions(-)
 create mode 100644 dlls/mscms/icc34.h

diff --git a/configure.ac b/configure.ac
index 0a8c316..07eb112 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1442,20 +1442,28 @@ dnl **** Check for LittleCMS ***
 if test "x$with_lcms" != "xno"
 then
     ac_save_CPPFLAGS="$CPPFLAGS"
-    WINE_PACKAGE_FLAGS(LCMS,[lcms],[-llcms])
-    AC_CHECK_HEADERS([lcms.h lcms/lcms.h])
-    if test "$ac_cv_header_lcms_h" = "yes" -o "$ac_cv_header_lcms_lcms_h" = "yes"
+    WINE_PACKAGE_FLAGS(LCMS,[lcms2],[-llcms2])
+    AC_CHECK_HEADERS([lcms2.h])
+    if test "$ac_cv_header_lcms2_h" = "yes"
     then
-        AC_CHECK_LIB(lcms, cmsOpenProfileFromFile,
-            [AC_DEFINE(HAVE_LCMS, 1, [Define if you have the LittleCMS development environment])],[LCMS_LIBS=""])
+        AC_CHECK_LIB(lcms2, cmsOpenProfileFromFile,
+            [AC_DEFINE(HAVE_LCMS2, 1, [Define if you have the LittleCMS v2 development environment])],[LCMS_LIBS=""])
     else
-        LCMS_CFLAGS=""
-        LCMS_LIBS=""
+        WINE_PACKAGE_FLAGS(LCMS,[lcms],[-llcms])
+        AC_CHECK_HEADERS([lcms.h lcms/lcms.h])
+        if test "$ac_cv_header_lcms_h" = "yes" -o "$ac_cv_header_lcms_lcms_h" = "yes"
+        then
+            AC_CHECK_LIB(lcms, cmsOpenProfileFromFile,
+                [AC_DEFINE(HAVE_LCMS1, 1, [Define if you have the LittleCMS v1 development environment])],[LCMS_LIBS=""])
+        else
+            LCMS_CFLAGS=""
+            LCMS_LIBS=""
+        fi
     fi
     CPPFLAGS="$ac_save_CPPFLAGS"
 fi
 WINE_NOTICE_WITH(cms,[test "$ac_cv_lib_lcms_cmsOpenProfileFromFile" != "yes"],
-                 [liblcms ${notice_platform}development files not found, Color Management won't be supported.])
+                 [liblcms and liblcms2 ${notice_platform}development files not found, Color Management won't be supported.])
 
 dnl **** Check for FreeType 2 ****
 if test "x$with_freetype" != "xno"
diff --git a/dlls/mscms/icc34.h b/dlls/mscms/icc34.h
new file mode 100644
index 0000000..c8ca35c
--- /dev/null
+++ b/dlls/mscms/icc34.h
@@ -0,0 +1,1029 @@
+/* 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.
+ *
+ */
+
+
+#ifdef PACKAGE_NAME
+/*
+  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 unsigned char	icUInt8Number;
+typedef unsigned short	icUInt16Number;
+typedef unsigned int	icUInt32Number;
+typedef unsigned int	icUInt64Number[2];
+
+typedef char	icInt8Number;
+typedef short	icInt16Number;
+typedef int	icInt32Number;
+typedef int	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__)
+
+#if defined (__MINGW) || defined(__MINGW32__)
+#include <stdint.h>
+#endif
+
+
+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
+ */
+
+/* Unsigned integer numbers */
+typedef unsigned char   icUInt8Number;
+typedef unsigned short  icUInt16Number;
+typedef unsigned long   icUInt32Number;
+typedef unsigned long   icUInt64Number[2];
+
+/* Signed numbers */
+typedef char            icInt8Number;
+typedef short           icInt16Number;
+typedef long            icInt32Number;
+typedef long            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 */
diff --git a/dlls/mscms/mscms_main.c b/dlls/mscms/mscms_main.c
index 1688239..a9ceb96 100644
--- a/dlls/mscms/mscms_main.c
+++ b/dlls/mscms/mscms_main.c
@@ -36,7 +36,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mscms);
 
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS1
 static int lcms_error_handler( int error, const char *text )
 {
     switch (error)
@@ -61,7 +61,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
     {
     case DLL_PROCESS_ATTACH:
         DisableThreadLibraryCalls( hinst );
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS1
         cmsSetErrorHandler( lcms_error_handler );
 #endif
         break;
diff --git a/dlls/mscms/mscms_priv.h b/dlls/mscms/mscms_priv.h
index ffaf13b..ecebf9f 100644
--- a/dlls/mscms/mscms_priv.h
+++ b/dlls/mscms/mscms_priv.h
@@ -18,7 +18,11 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
+#define HAVE_LCMS 2
+#else
+#ifdef HAVE_LCMS1
+#define HAVE_LCMS 1
 
 /*  These basic Windows types are defined in lcms.h when compiling on
  *  a non-Windows platform (why?), so they would normally not conflict
@@ -46,12 +50,21 @@
 #undef LOWORD
 #undef HIWORD
 #undef MAX_PATH
+#endif  /* ifdef HAVE_LCMS1 */
+#endif  /* ifdef HAVE_LCMS2 */
+
+#ifdef HAVE_LCMS
 
+#ifdef HAVE_LCMS2_H
+#include <lcms2.h>
+#include "icc34.h"
+#else
 #ifdef HAVE_LCMS_LCMS_H
 #include <lcms/lcms.h>
 #else
 #include <lcms.h>
 #endif
+#endif
 
 /*  Funny thing is lcms.h defines DWORD as an 'unsigned long' whereas Wine
  *  defines it as an 'unsigned int'. To avoid compiler warnings we use a
diff --git a/dlls/mscms/transform.c b/dlls/mscms/transform.c
index 363400c..a605a93 100644
--- a/dlls/mscms/transform.c
+++ b/dlls/mscms/transform.c
@@ -237,7 +237,13 @@ HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE profiles, DWORD nprofil
     {
         /* insert a conversion profile for pairings that lcms doesn't handle */
         if (out_format == TYPE_RGB_16) cmsconvert = cmsCreate_sRGBProfile();
-        if (out_format == TYPE_Lab_16) cmsconvert = cmsCreateLabProfile( NULL );
+        if (out_format == TYPE_Lab_16)
+#ifdef HAVE_LCMS2
+            cmsconvert = cmsCreateLab2Profile( NULL );
+#else
+            cmsconvert = cmsCreateLabProfile( NULL );
+#endif
+
     }
 
     cmsprofiles = HeapAlloc( GetProcessHeap(), 0, (nprofiles + 1) * sizeof(cmsHPROFILE) );
-- 
1.7.5.4




More information about the wine-patches mailing list