changeset 1493:868030b86280

2009-05-01 Lillian Angel <langel@redhat.com> * HACKING: Updated. * Makefile.am: Updated to new b16 bundle. (ICEDTEA_PATCHES): Removed patches/icedtea-enum-bug-181.patch. * patches/icedtea-lcms.patch: Updated. Only includes a single patch for cmsxform.c. * patches/icedtea-enum-bug-181.patch: Removed.
author Lillian Angel <langel@redhat.com>
date Fri, 01 May 2009 12:26:02 -0400
parents 34524a71ee10
children d0f6e94ed76d
files ChangeLog HACKING Makefile.am patches/icedtea-lcms.patch
diffstat 4 files changed, 27 insertions(+), 6454 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri May 01 05:17:26 2009 -0400
+++ b/ChangeLog	Fri May 01 12:26:02 2009 -0400
@@ -1,3 +1,12 @@
+2009-05-01  Lillian Angel  <langel@redhat.com>
+
+	* HACKING: Updated.
+	* Makefile.am: Updated to new b16 bundle.
+	(ICEDTEA_PATCHES): Removed patches/icedtea-enum-bug-181.patch.
+	* patches/icedtea-lcms.patch: Updated. Only includes a single patch
+	for cmsxform.c.
+	* patches/icedtea-enum-bug-181.patch: Removed.
+
 2009-05-01  Gary Benson  <gbenson@redhat.com>
 
 	* ports/hotspot/src/share/vm/shark/sharkFrameCache.hpp: New file.
--- a/HACKING	Fri May 01 05:17:26 2009 -0400
+++ b/HACKING	Fri May 01 12:26:02 2009 -0400
@@ -22,7 +22,6 @@
 * icedtea-core-build.patch: Add support for building IcedTea core VM.
 * icedtea-debuginfo.patch: Add -g option to build to generate debugging information.
 * icedtea-demos.patch: Fix building of JVMTI demo.
-* icedtea-enum-bug-181.patch: Fixes class type check (PR181/S6736248)
 * icedtea-float-double-trailing-zeros.patch: Remove trailing zeros from Double/Float (PR29/30)
 * icedtea-fonts.patch: Add Fedora fontconfig.
 * icedtea-gcc-4.3.patch: Fix code to compile with GCC 4.3 and turn off -Werror.
@@ -32,7 +31,7 @@
 * icedtea-javac-debuginfo.patch: Ensure debugging information is generated for all class files.
 * icedtea-javafiles.patch: Add missing Java files to list.
 * icedtea-jpegclasses.patch: Add com.sun.image.codec.jpeg support.
-* icedtea-lcms: Updates lcms to 1.18 and applies other security patches.
+* icedtea-lcms: Applies security patch.
 * icedtea-lib64.patch: Add support for building on platforms with /usr/lib64.
 * icedtea-libraries.patch: Use system JPEG and zlib libraries.
 * icedtea-linker-options.patch: Add -Xlinker option when linking.
--- a/Makefile.am	Fri May 01 05:17:26 2009 -0400
+++ b/Makefile.am	Fri May 01 12:26:02 2009 -0400
@@ -1,5 +1,5 @@
-OPENJDK_DATE = 13_apr_2009
-OPENJDK_MD5SUM = d395b4d4ac8b2aff70730b953f9e2736
+OPENJDK_DATE = 24_apr_2009
+OPENJDK_MD5SUM = 850a29b70206bc7fa083cd26acc781f3
 OPENJDK_VERSION = b16
 
 CACAO_VERSION = 0.99.4
@@ -580,7 +580,6 @@
 	patches/icedtea-nomotif.patch \
 	patches/icedtea-alpha-fixes.patch \
 	patches/icedtea-alt-jar.patch \
-	patches/icedtea-enum-bug-181.patch \
 	patches/icedtea-jdk-use-ssize_t.patch \
 	patches/hotspot/$(HSBUILD)/icedtea-use-idx_t.patch \
 	patches/hotspot/$(HSBUILD)/icedtea-params-cast-size_t.patch \
--- a/patches/icedtea-lcms.patch	Fri May 01 05:17:26 2009 -0400
+++ b/patches/icedtea-lcms.patch	Fri May 01 12:26:02 2009 -0400
@@ -1,5507 +1,17 @@
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c	2008-11-25 04:06:03.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -51,7 +51,7 @@
- 
- 
- 
--// CIECAM 02 appearance model
-+// CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging.
- 
- #include "lcms.h"
- 
-@@ -196,6 +196,10 @@
-             clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1;
-         }
-     }
-+    
-+    clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] + 
-+        (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;
-+
-     return clr;
- }
- 
-@@ -249,9 +253,6 @@
-         clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp);
-     }
- 
--    clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] +
--        (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;
--
-     clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A),
-         (pMod->c * pMod->z));
- 
-@@ -395,7 +396,7 @@
-     LPcmsCIECAM02 lpMod;
- 
- 
--   if((lpMod = (LPcmsCIECAM02) malloc(sizeof(cmsCIECAM02))) == NULL) {
-+   if((lpMod = (LPcmsCIECAM02) _cmsMalloc(sizeof(cmsCIECAM02))) == NULL) {
-         return (LCMSHANDLE) NULL;
-     }
- 
-@@ -449,14 +450,19 @@
-     lpMod -> z   = compute_z(lpMod);
-     lpMod -> Nbb = computeNbb(lpMod);
-     lpMod -> FL  = computeFL(lpMod);
-+    
-+    if (lpMod -> D == D_CALCULATE ||
-+        lpMod -> D == D_CALCULATE_DISCOUNT) {
-+
-     lpMod -> D   = computeD(lpMod);
-+    }
-+    
-     lpMod -> Ncb = lpMod -> Nbb;
- 
-     lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite);
-     lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod);
-     lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite);
-     lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod);
--    lpMod -> adoptedWhite = ComputeCorrelates(lpMod -> adoptedWhite, lpMod);
- 
-     return (LCMSHANDLE) lpMod;
- 
-@@ -465,7 +471,7 @@
- void LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel)
- {
-     LPcmsCIECAM02 lpMod = (LPcmsCIECAM02) (LPSTR) hModel;
--    if (lpMod) free(lpMod);
-+    if (lpMod) _cmsFree(lpMod);
- }
- 
- 
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c	2008-11-25 04:06:03.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscam97.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -174,7 +174,7 @@
- LCMSAPI void LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel)
- {
-     LPcmsCIECAM97s lpMod = (LPcmsCIECAM97s) (LPSTR) hModel;
--    if (lpMod) free(lpMod);
-+    if (lpMod) _cmsFree(lpMod);
- }
- 
- // Partial discounting for adaptation degree computation
-@@ -331,7 +331,7 @@
-     LPcmsCIECAM97s lpMod;
-     VEC3 tmp;
- 
--    if((lpMod = (LPcmsCIECAM97s) malloc(sizeof(cmsCIECAM97s))) == NULL) {
-+    if((lpMod = (LPcmsCIECAM97s) _cmsMalloc(sizeof(cmsCIECAM97s))) == NULL) {
-         return (LCMSHANDLE) NULL;
-     }
- 
-@@ -449,7 +449,7 @@
- 
-     // RGB_subw = [MlamRigg][WP/YWp]
- #ifdef USE_CIECAM97s2
--    MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, (LPVEC3) &lpMod -> WP);
-+    MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, &lpMod -> WP);
- #else
-     VEC3divK(&tmp, (LPVEC3) &lpMod -> WP, lpMod->WP.Y);
-     MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, &tmp);
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c	2008-11-25 04:06:03.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -65,22 +65,25 @@
- // Persistence
- LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
- LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
- 
- // Properties
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char* cSubProp, const char *Val);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
- 
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
- LCMSAPI double          LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
--LCMSAPI int             LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames);
-+LCMSAPI const char*     LCMSEXPORT cmsIT8GetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char *cSubProp);
-+LCMSAPI int             LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, const char ***PropertyNames);
-+LCMSAPI int             LCMSEXPORT cmsIT8EnumPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char*** SubpropertyNames);
- 
- // Datasets
- 
-@@ -89,10 +92,10 @@
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);
- LCMSAPI double          LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int col, int row);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, 
-                                                 const char* Val);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, 
-                                                 double Val);
- 
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
-@@ -100,15 +103,15 @@
- 
- LCMSAPI double          LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
-                                                 const char* cSample,
-                                                 const char *Val);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
-                                                 const char* cSample,
-                                                 double Val);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
- LCMSAPI int             LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
- 
- LCMSAPI void            LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
-@@ -126,7 +129,7 @@
- // #define STRICT_CGATS  1
- 
- #define MAXID       128     // Max lenght of identifier
--#define MAXSTR      255     // Max lenght of string
-+#define MAXSTR      1024     // Max lenght of string
- #define MAXTABLES   255     // Max Number of tables in a single stream
- #define MAXINCLUDE   20     // Max number of nested includes
- 
-@@ -137,6 +140,9 @@
- 
- #ifndef NON_WINDOWS
- #include <io.h>
-+#define DIR_CHAR    '\\'
-+#else
-+#define DIR_CHAR    '/'
- #endif
- 
- // Symbols
-@@ -160,6 +166,7 @@
-         SEND_DATA,
-         SEND_DATA_FORMAT,
-         SKEYWORD,
-+        SDATA_FORMAT_ID,
-         SINCLUDE
- 
-     } SYMBOL;
-@@ -171,7 +178,8 @@
-         WRITE_UNCOOKED,
-         WRITE_STRINGIFY,
-         WRITE_HEXADECIMAL,
--        WRITE_BINARY
-+        WRITE_BINARY,
-+        WRITE_PAIR
- 
-     } WRITEMODE;
- 
-@@ -181,6 +189,8 @@
- 
-         struct _KeyVal*  Next;
-         char*            Keyword;       // Name of variable
-+        struct _KeyVal*  NextSubkey;    // If key is a dictionary, points to the next item
-+        char*            Subkey;        // If key is a dictionary, points to the subkey name
-         char*            Value;         // Points to value
-         WRITEMODE        WriteAs;       // How to write the value
- 
-@@ -220,7 +230,12 @@
- 
-     } TABLE, *LPTABLE;
- 
-+// File stream being parsed
- 
-+typedef struct _FileContext {
-+        char           FileName[MAX_PATH];    // File name if being readed from file
-+        FILE*          Stream;                // File stream or NULL if holded in memory
-+    } FILECTX, *LPFILECTX;
- 
- // This struct hold all information about an openened
- // IT8 handler. Only one dataset is allowed.
-@@ -257,9 +272,9 @@
-         char*          Source;                // Points to loc. being parsed
-         int            lineno;                // line counter for error reporting
- 
--        char           FileName[MAX_PATH];    // File name if being readed from file
--        FILE*          Stream[MAXINCLUDE];    // File stream or NULL if holded in memory
-+        LPFILECTX      FileStack[MAXINCLUDE]; // Stack of files being parsed
-         int            IncludeSP;             // Include Stack Pointer
-+
-         char*          MemoryBlock;           // The stream if holded in memory
- 
-         char           DoubleFormatter[MAXID];   // Printf-like 'double' formatter
-@@ -298,6 +313,7 @@
-         {".INCLUDE",            SINCLUDE},
-         {"BEGIN_DATA",          SBEGIN_DATA },
-         {"BEGIN_DATA_FORMAT",   SBEGIN_DATA_FORMAT },
-+        {"DATA_FORMAT_IDENTIFIER", SDATA_FORMAT_ID},
-         {"END_DATA",            SEND_DATA},
-         {"END_DATA_FORMAT",     SEND_DATA_FORMAT},
-         {"KEYWORD",             SKEYWORD}
-@@ -308,49 +324,94 @@
- 
- // Predefined properties
- 
--static const char* PredefinedProperties[] = {
-+// A property
-+typedef struct {
-+        const char *id;
-+        WRITEMODE as;
-+    } PROPERTY;
- 
--        "NUMBER_OF_FIELDS",    // Required - NUMBER OF FIELDS
--        "NUMBER_OF_SETS",      // Required - NUMBER OF SETS
--        "ORIGINATOR",          // Required - Identifies the specific system, organization or individual that created the data file.
--        "FILE_DESCRIPTOR",     // Required - Describes the purpose or contents of the data file.
--        "CREATED",             // Required - Indicates date of creation of the data file.
--        "DESCRIPTOR",          // Required  - Describes the purpose or contents of the data file.
--        "DIFFUSE_GEOMETRY",    // The diffuse geometry used. Allowed values are "sphere" or "opal".
--        "MANUFACTURER",
--        "MANUFACTURE",         // Some broken Fuji targets does store this value
--        "PROD_DATE",           // Identifies year and month of production of the target in the form yyyy:mm.
--        "SERIAL",              // Uniquely identifies individual physical target.
-+static PROPERTY PredefinedProperties[] = {
- 
--        "MATERIAL",            // Identifies the material on which the target was produced using a code
-+        {"NUMBER_OF_FIELDS", WRITE_UNCOOKED},    // Required - NUMBER OF FIELDS
-+        {"NUMBER_OF_SETS",   WRITE_UNCOOKED},    // Required - NUMBER OF SETS
-+        {"ORIGINATOR",       WRITE_STRINGIFY},   // Required - Identifies the specific system, organization or individual that created the data file.
-+        {"FILE_DESCRIPTOR",  WRITE_STRINGIFY},   // Required - Describes the purpose or contents of the data file.
-+        {"CREATED",          WRITE_STRINGIFY},   // Required - Indicates date of creation of the data file.
-+        {"DESCRIPTOR",       WRITE_STRINGIFY},   // Required  - Describes the purpose or contents of the data file.
-+        {"DIFFUSE_GEOMETRY", WRITE_STRINGIFY},   // The diffuse geometry used. Allowed values are "sphere" or "opal".
-+        {"MANUFACTURER",     WRITE_STRINGIFY},
-+        {"MANUFACTURE",      WRITE_STRINGIFY},   // Some broken Fuji targets does store this value
-+        {"PROD_DATE",        WRITE_STRINGIFY},   // Identifies year and month of production of the target in the form yyyy:mm.
-+        {"SERIAL",           WRITE_STRINGIFY},   // Uniquely identifies individual physical target.
-+
-+        {"MATERIAL",         WRITE_STRINGIFY},   // Identifies the material on which the target was produced using a code
-                                // uniquely identifying th e material. This is intend ed to be used for IT8.7
-                                // physical targets only (i.e . IT8.7/1 a nd IT8.7/2).
- 
--        "INSTRUMENTATION",     // Used to report the specific instrumentation used (manufacturer and
-+        {"INSTRUMENTATION",  WRITE_STRINGIFY},   // Used to report the specific instrumentation used (manufacturer and
-                                // model number) to generate the data reported. This data will often
-                                // provide more information about the particular data collected than an
-                                // extensive list of specific details. This is particularly important for
-                                // spectral data or data derived from spectrophotometry.
- 
--        "MEASUREMENT_SOURCE",  // Illumination used for spectral measurements. This data helps provide
-+        {"MEASUREMENT_SOURCE", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide
-                                // a guide to the potential for issues of paper fluorescence, etc.
- 
--        "PRINT_CONDITIONS",    // Used to define the characteristics of the printed sheet being reported.
-+        {"PRINT_CONDITIONS", WRITE_STRINGIFY},   // Used to define the characteristics of the printed sheet being reported.
-                                // Where standard conditions have been defined (e.g., SWOP at nominal)
-                                // named conditions may suffice. Otherwise, detailed information is
-                                // needed.
- 
--        "SAMPLE_BACKING",      // Identifies the backing material used behind the sample during
--                               // measurement. Allowed values are “black”, “white”, or "na".
-+        {"SAMPLE_BACKING",   WRITE_STRINGIFY},   // Identifies the backing material used behind the sample during
-+                               // measurement. Allowed values are “black”, “white”, or {"na".
-+
-+        {"CHISQ_DOF",        WRITE_STRINGIFY},   // Degrees of freedom associated with the Chi squared statistic
-+
-+//    new in recent specs:
-+        {"MEASUREMENT_GEOMETRY", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated 
-+                               // along with details of the geometry and the aperture size and shape. For example, 
-+                               // for transmission measurements it is important to identify 0/diffuse, diffuse/0, 
-+                               // opal or integrating sphere, etc. For reflection it is important to identify 0/45, 
-+                               // 45/0, sphere (specular included or excluded), etc.
-+
-+       {"FILTER",            WRITE_STRINGIFY},   // Identifies the use of physical filter(s) during measurement. Typically used to 
-+                               // denote the use of filters such as none, D65, Red, Green or Blue.
-+
-+       {"POLARIZATION",      WRITE_STRINGIFY},   // Identifies the use of a physical polarization filter during measurement. Allowed 
-+                               // values are {"yes”, “white”, “none” or “na”.
-+
-+       {"WEIGHTING_FUNCTION", WRITE_PAIR},   // Indicates such functions as: the CIE standard observer functions used in the 
-+                               // calculation of various data parameters (2 degree and 10 degree), CIE standard 
-+                               // illuminant functions used in the calculation of various data parameters (e.g., D50,
-+                               // D65, etc.), density status response, etc. If used there shall be at least one 
-+                               // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute 
-+                               // in the set shall be {"name" and shall identify the particular parameter used.
-+                               // The second shall be {"value" and shall provide the value associated with that name. 
-+                               // For ASCII data, a string containing the Name and Value attribute pairs shall follow 
-+                               // the weighting function keyword. A semi-colon separates attribute pairs from each 
-+                               // other and within the attribute the name and value are separated by a comma.
-+
-+       {"COMPUTATIONAL_PARAMETER", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name 
-+                               // of the calculation, parameter is the name of the parameter used in the calculation 
-+                               // and value is the value of the parameter.
-+
-+       {"TARGET_TYPE",        WRITE_STRINGIFY},  // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc.
-+
-+       {"COLORANT",           WRITE_STRINGIFY},  // Identifies the colorant(s) used in creating the target.
- 
--        "CHISQ_DOF"            // Degrees of freedom associated with the Chi squared statistic
-+       {"TABLE_DESCRIPTOR",   WRITE_STRINGIFY},  // Describes the purpose or contents of a data table.
-+
-+       {"TABLE_NAME",         WRITE_STRINGIFY}   // Provides a short name for a data table.
- };
- 
--#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(char *))
-+#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY))
- 
- 
- // Predefined sample types on dataset
- static const char* PredefinedSampleID[] = {
-+        "SAMPLE_ID",      // Identifies sample that data represents
-+        "STRING",         // Identifies label, or other non-machine readable value. 
-+                          // Value must begin and end with a " symbol
- 
-         "CMYK_C",         // Cyan component of CMYK data expressed as a percentage
-         "CMYK_M",         // Magenta component of CMYK data expressed as a percentage
-@@ -378,7 +439,7 @@
-         "LAB_B",          // b* component of Lab data
-         "LAB_C",          // C*ab component of Lab data
-         "LAB_H",          // hab component of Lab data
--        "LAB_DE"          //  CIE dE
-+        "LAB_DE",         //  CIE dE
-         "LAB_DE_94",      //  CIE dE using CIE 94
-         "LAB_DE_CMC",     //  dE using CMC
-         "LAB_DE_2000",    // CIE dE using CIE DE 2000
-@@ -388,7 +449,7 @@
-         "STDEV_Y",        // Standard deviation of Y (tristimulus data)
-         "STDEV_Z",        // Standard deviation of Z (tristimulus data)
-         "STDEV_L",        // Standard deviation of L*
--        "STDEV_A"         // Standard deviation of a*
-+        "STDEV_A",        // Standard deviation of a*
-         "STDEV_B",        // Standard deviation of b*
-         "STDEV_DE",       // Standard deviation of CIE dE
-         "CHI_SQD_PAR"};   // The average of the standard deviations of L*, a* and b*. It is
-@@ -397,57 +458,119 @@
- 
- #define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *))
- 
-+//Forward declaration of some internal functions        
-+static
-+void* AllocChunk(LPIT8 it8, size_t size);
-+
- // Checks if c is a separator
- static
--BOOL isseparator(int c)
-+LCMSBOOL isseparator(int c)
- {
-         return (c == ' ') || (c == '\t') || (c == '\r');
- }
- 
- // Checks whatever if c is a valid identifier char
--
- static
--BOOL ismiddle(int c)
-+LCMSBOOL ismiddle(int c)
- {
-    return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
- }
- 
- // Checks whatsever if c is a valid identifier middle char.
- static
--BOOL isidchar(int c)
-+LCMSBOOL isidchar(int c)
- {
-    return isalnum(c) || ismiddle(c);
- }
- 
- // Checks whatsever if c is a valid identifier first char.
- static
--BOOL isfirstidchar(int c)
-+LCMSBOOL isfirstidchar(int c)
- {
-      return !isdigit(c) && ismiddle(c);
- }
- 
-+// checks whether the supplied path looks like an absolute path
-+// NOTE: this function doesn't checks if the path exists or even if it's legal
-+static
-+LCMSBOOL isabsolutepath(const char *path)
-+{
-+    if(path == NULL)
-+        return FALSE;
-+
-+    if(path[0] == DIR_CHAR)
-+        return TRUE;
-+
-+#ifndef NON_WINDOWS
-+    if(isalpha(path[0]) && path[1] == ':')
-+        return TRUE;
-+#endif
-+    return FALSE;
-+}
-+
-+// Makes a file path based on a given reference path
-+// NOTE: buffer is assumed to point to at least MAX_PATH bytes
-+// NOTE: both relPath and basePath are assumed to be no more than MAX_PATH characters long (including the null terminator!)
-+// NOTE: this function doesn't check if the path exists or even if it's legal
-+static
-+LCMSBOOL _cmsMakePath(const char *relPath, const char *basePath, char *buffer)
-+{
-+    if (!isabsolutepath(relPath)) {
-+
-+        char *tail;
-+        
-+        strncpy(buffer, basePath, MAX_PATH-1);
-+        tail = strrchr(buffer, DIR_CHAR);
-+        if (tail != NULL) {
-+
-+            size_t len = tail - buffer;
-+            strncpy(tail + 1, relPath, MAX_PATH - len -1);
-+            //  TODO: if combined path is longer than MAX_PATH, this should return FALSE!
-+            return TRUE;
-+        }
-+    }
-+    strncpy(buffer, relPath, MAX_PATH - 1);
-+    return TRUE;
-+}
-+
-+
-+// Make sure no exploit is being even tried
-+
-+static
-+const char* NoMeta(const char* str)
-+{
-+    if (strchr(str, '%') != NULL) 
-+        return "**** CORRUPTED FORMAT STRING ***";
-+
-+    return str;
-+}
-+
- 
-+// Syntax error
- static
--BOOL SynError(LPIT8 it8, const char *Txt, ...)
-+LCMSBOOL SynError(LPIT8 it8, const char *Txt, ...)
- {
-         char Buffer[256], ErrMsg[1024];
-         va_list args;
- 
-         va_start(args, Txt);
--        vsprintf(Buffer, Txt, args);
-+        vsnprintf(Buffer, 255, Txt, args);
-+        Buffer[255] = 0;
-         va_end(args);
- 
--        sprintf(ErrMsg, "%s: Line %d, %s", it8->FileName, it8->lineno, Buffer);
-+        snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer);
-+        ErrMsg[1023] = 0;
-         it8->sy = SSYNERROR;
--        cmsSignalError(LCMS_ERRC_ABORTED, ErrMsg);
-+        cmsSignalError(LCMS_ERRC_ABORTED, "%s", ErrMsg);
-         return FALSE;
- }
- 
-+// Check if current symbol is same as specified. issue an error else.
- static
--BOOL Check(LPIT8 it8, SYMBOL sy, const char* Err)
-+LCMSBOOL Check(LPIT8 it8, SYMBOL sy, const char* Err)
- {
-         if (it8 -> sy != sy)
--                return SynError(it8, Err);
-+                return SynError(it8, NoMeta(Err));
-         return TRUE;
- }
- 
-@@ -457,15 +580,15 @@
- static
- void NextCh(LPIT8 it8)
- {
--    if (it8 -> Stream[it8 ->IncludeSP]) {
-+    if (it8 -> FileStack[it8 ->IncludeSP]->Stream) {
- 
--        it8 ->ch = fgetc(it8 ->Stream[it8 ->IncludeSP]);
-+        it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream);
- 
--        if (feof(it8 -> Stream[it8 ->IncludeSP]))  {
-+        if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream))  {
- 
-             if (it8 ->IncludeSP > 0) {
- 
--                fclose(it8 ->Stream[it8->IncludeSP--]);
-+                fclose(it8 ->FileStack[it8->IncludeSP--]->Stream);
-                 it8 -> ch = ' ';                            // Whitespace to be ignored
- 
-             } else
-@@ -799,18 +922,39 @@
- 
-     if (it8 -> sy == SINCLUDE) {
- 
--                FILE* IncludeFile;
-+                LPFILECTX FileNest;
-+
-+                if(it8 -> IncludeSP >= (MAXINCLUDE-1))
-+                {
-+                    SynError(it8, "Too many recursion levels");
-+                    return;
-+                }
- 
-                 InSymbol(it8);
-                 if (!Check(it8, SSTRING, "Filename expected")) return;
--                IncludeFile = fopen(it8 -> str, "rt");
--                if (IncludeFile == NULL) {
- 
--                        SynError(it8, "File %s not found", it8 ->str);
-+                FileNest = it8 -> FileStack[it8 -> IncludeSP + 1];
-+                if(FileNest == NULL)
-+                {
-+                    FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (LPFILECTX)AllocChunk(it8, sizeof(FILECTX));
-+                    //if(FileNest == NULL)
-+                        //  TODO: how to manage out-of-memory conditions?
-+                }
-+
-+                if(_cmsMakePath(it8->str, it8->FileStack[it8->IncludeSP]->FileName, FileNest->FileName) == FALSE)
-+                {
-+                    SynError(it8, "File path too long");
-                         return;
-                 }
- 
--                it8 -> Stream[++it8 -> IncludeSP] = IncludeFile;
-+                FileNest->Stream = fopen(FileNest->FileName, "rt");
-+                if (FileNest->Stream == NULL) {
-+
-+                        SynError(it8, "File %s not found", FileNest->FileName);
-+                        return;
-+                }
-+                it8->IncludeSP++;
-+
-                 it8 ->ch = ' ';
-                 InSymbol(it8);
-     }
-@@ -819,7 +963,7 @@
- 
- // Checks end of line separator
- static
--BOOL CheckEOLN(LPIT8 it8)
-+LCMSBOOL CheckEOLN(LPIT8 it8)
- {
-         if (!Check(it8, SEOLN, "Expected separator")) return FALSE;
-         while (it8 -> sy == SEOLN)
-@@ -850,20 +994,21 @@
- 
- // Returns a string holding current value
- static
--BOOL GetVal(LPIT8 it8, char* Buffer, const char* ErrorTitle)
-+LCMSBOOL GetVal(LPIT8 it8, char* Buffer, size_t max, const char* ErrorTitle)
- {
-     switch (it8->sy) {
- 
--    case SIDENT:  strncpy(Buffer, it8->id, MAXID-1); break;
--    case SINUM:   sprintf(Buffer, "%d", it8 -> inum); break;
--    case SDNUM:   sprintf(Buffer, it8->DoubleFormatter, it8 -> dnum); break;
--    case SSTRING: strncpy(Buffer, it8->str, MAXSTR-1); break;
-+    case SIDENT:  strncpy(Buffer, it8->id, max); break;
-+    case SINUM:   snprintf(Buffer, max, "%d", it8 -> inum); break;
-+    case SDNUM:   snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break;
-+    case SSTRING: strncpy(Buffer, it8->str, max); break;
- 
- 
-     default:
--         return SynError(it8, ErrorTitle);
-+         return SynError(it8, "%s", ErrorTitle);
-     }
- 
-+    Buffer[max] = 0;
-      return TRUE;
- }
- 
-@@ -872,6 +1017,12 @@
- static
- LPTABLE GetTable(LPIT8 it8)
- {
-+   if ((it8 -> nTable >= it8 ->TablesCount) || (it8 -> nTable < 0)) {
-+
-+           SynError(it8, "Table %d out of sequence", it8 -> nTable);
-+           return it8 -> Tab;
-+   }            
-+
-     return it8 ->Tab + it8 ->nTable;
- }
- 
-@@ -896,15 +1047,15 @@
-         for (p = it8->MemorySink; p != NULL; p = n) {
- 
-             n = p->Next;
--            if (p->Ptr) free(p->Ptr);
--            free(p);
-+            if (p->Ptr) _cmsFree(p->Ptr);
-+            _cmsFree(p);
-         }
-     }
- 
-     if (it8->MemoryBlock)
--        free(it8->MemoryBlock);
-+        _cmsFree(it8->MemoryBlock);    
- 
--    free(it8);
-+     _cmsFree(it8);
- }
- 
- 
-@@ -913,16 +1064,16 @@
- void* AllocBigBlock(LPIT8 it8, size_t size)
- {
-    LPOWNEDMEM ptr1;
--   void* ptr = malloc(size);
-+   void* ptr = _cmsMalloc(size);
- 
-         if (ptr) {
- 
-                 ZeroMemory(ptr, size);
--                ptr1 = (LPOWNEDMEM) malloc(sizeof(OWNEDMEM));
-+                ptr1 = (LPOWNEDMEM) _cmsMalloc(sizeof(OWNEDMEM));
- 
-                 if (ptr1 == NULL) {
- 
--                    free(ptr);
-+                     _cmsFree(ptr);
-                     return NULL;
-                 }
- 
-@@ -986,8 +1137,9 @@
- // Searches through linked list
- 
- static
--BOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, LPKEYVALUE* LastPtr)
-+LCMSBOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, const char* Subkey, LPKEYVALUE* LastPtr)
- {
-+    if (LastPtr) *LastPtr = p;
- 
-     for (;  p != NULL; p = p->Next) {
- 
-@@ -996,10 +1148,24 @@
-         if (*Key != '#') { // Comments are ignored
- 
-             if (stricmp(Key, p->Keyword) == 0)
--                    return TRUE;
-+                    break;
-         }
-     }
- 
-+    if (p == NULL)
-+        return FALSE;
-+
-+    if (Subkey == 0)
-+        return TRUE;
-+
-+    for (; p != NULL; p = p->NextSubkey) {
-+
-+        if (LastPtr) *LastPtr = p;
-+
-+        if (stricmp(Subkey, p->Subkey) == 0)
-+            return TRUE;
-+    }
-+
-     return FALSE;
- }
- 
-@@ -1007,66 +1173,77 @@
- 
- // Add a property into a linked list
- static
--BOOL AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char* xValue, WRITEMODE WriteAs)
-+LPKEYVALUE AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs)
- {
-     LPKEYVALUE p;
--    LPKEYVALUE last;
--
- 
-     // Check if property is already in list (this is an error)
- 
--    if (IsAvailableOnList(*Head, Key, &last)) {
-+    if (IsAvailableOnList(*Head, Key, Subkey, &p)) {
- 
-                         // This may work for editing properties
- 
--                         last->Value   = AllocString(it8, xValue);
--                         last->WriteAs = WriteAs;
--                         return TRUE;
--
-              // return SynError(it8, "duplicate key <%s>", Key);
-     }
-+    else {
-+        LPKEYVALUE last = p;
- 
-         // Allocate the container
-     p = (LPKEYVALUE) AllocChunk(it8, sizeof(KEYVALUE));
-     if (p == NULL)
-     {
--        return SynError(it8, "AddToList: out of memory");
-+            SynError(it8, "AddToList: out of memory");
-+            return NULL;
-     }
- 
-     // Store name and value
-     p->Keyword = AllocString(it8, Key);
-+        p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey);
- 
--    if (xValue != NULL) {
-+        // Keep the container in our list
-+        if (*Head == NULL)
-+            *Head = p;
-+        else
-+        {
-+            if(Subkey != 0 && last != 0) {
-+                last->NextSubkey = p;
- 
--        p->Value   = AllocString(it8, xValue);
-+                // If Subkey is not null, then last is the last property with the same key,
-+                // but not necessarily is the last property in the list, so we need to move
-+                // to the actual list end
-+                while(last->Next != 0) 
-+                    last = last->Next;
-     }
--    else {
--        p->Value   = NULL;
-+            last->Next = p;
-     }
- 
-     p->Next    = NULL;
-+        p->NextSubkey = NULL;
-+    }
-+
-     p->WriteAs = WriteAs;
-+    if (xValue != NULL) {
- 
--    // Keep the container in our list
--    if (*Head == NULL)
--        *Head = p;
--    else
--        last->Next = p;
-+        p->Value   = AllocString(it8, xValue);
-+    }
-+    else {
-+        p->Value   = NULL;
-+    }
- 
--    return TRUE;
-+    return p;
- }
- 
- static
--BOOL AddAvailableProperty(LPIT8 it8, const char* Key)
-+LPKEYVALUE AddAvailableProperty(LPIT8 it8, const char* Key, WRITEMODE as)
- {
--        return AddToList(it8, &it8->ValidKeywords, Key, NULL, WRITE_UNCOOKED);
-+        return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as);
- }
- 
- 
- static
--BOOL AddAvailableSampleID(LPIT8 it8, const char* Key)
-+LPKEYVALUE AddAvailableSampleID(LPIT8 it8, const char* Key)
- {
--        return AddToList(it8, &it8->ValidSampleID, Key, NULL, WRITE_UNCOOKED);
-+        return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED);
- }
- 
- 
-@@ -1122,8 +1299,6 @@
-     AllocTable(it8);
- 
-     it8->MemoryBlock = NULL;
--    it8->Stream[0]   = NULL;
--    it8->IncludeSP   = 0;
-     it8->MemorySink  = NULL;
- 
-     it8 ->nTable = 0;
-@@ -1141,6 +1316,8 @@
-     it8 -> inum = 0;
-     it8 -> dnum = 0.0;
- 
-+    it8->FileStack[0] = (LPFILECTX)AllocChunk(it8, sizeof(FILECTX));
-+    it8->IncludeSP   = 0;
-     it8 -> lineno = 1;
- 
-     strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
-@@ -1149,7 +1326,7 @@
-     // Initialize predefined properties & data
- 
-     for (i=0; i < NUMPREDEFINEDPROPS; i++)
--            AddAvailableProperty(it8, PredefinedProperties[i]);
-+            AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as);
- 
-     for (i=0; i < NUMPREDEFINEDSAMPLEID; i++)
-             AddAvailableSampleID(it8, PredefinedSampleID[i]);
-@@ -1167,7 +1344,7 @@
- 
- }
- 
--BOOL  LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type)
-+LCMSBOOL  LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type)
- {
-         LPIT8 it8 = (LPIT8) hIT8;
- 
-@@ -1175,57 +1352,63 @@
-         return TRUE;
- }
- 
--BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* Val)
-+LCMSBOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* Val)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
- 
-     if (!Val) return FALSE;
-     if (!*Val) return FALSE;
- 
--    return AddToList(it8, &GetTable(it8)->HeaderList, "# ", Val, WRITE_UNCOOKED);
-+    return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL;
- }
- 
- 
- 
- // Sets a property
--BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* Key, const char *Val)
-+LCMSBOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* Key, const char *Val)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
- 
-     if (!Val) return FALSE;
-     if (!*Val) return FALSE;
- 
--    return AddToList(it8, &GetTable(it8)->HeaderList, Key, Val, WRITE_STRINGIFY);
-+    return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL;
- }
- 
- 
--BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val)
-+LCMSBOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
-     char Buffer[1024];
- 
-     sprintf(Buffer, it8->DoubleFormatter, Val);
- 
--    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_UNCOOKED);
-+    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL;    
- }
- 
--BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val)
-+LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
-     char Buffer[1024];
- 
-     sprintf(Buffer, "%d", Val);
- 
--    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_HEXADECIMAL);
-+    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL;    
- }
- 
--BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer)
-+LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
- 
--    return AddToList(it8, &GetTable(it8)->HeaderList, Key, Buffer, WRITE_UNCOOKED);
-+    return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL;
- }
- 
-+LCMSBOOL LCMSEXPORT cmsIT8SetPropertyMulti(LCMSHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer)
-+{
-+    LPIT8 it8 = (LPIT8) hIT8;
-+
-+    return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL;
-+}
- 
- // Gets a property
- const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* Key)
-@@ -1233,7 +1416,7 @@
-     LPIT8 it8 = (LPIT8) hIT8;
-     LPKEYVALUE p;
- 
--    if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, &p))
-+    if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p))
-     {
-         return p -> Value;
-     }
-@@ -1249,6 +1432,18 @@
-     else return 0.0;
- }
- 
-+const char* LCMSEXPORT cmsIT8GetPropertyMulti(LCMSHANDLE hIT8, const char* Key, const char *SubKey)
-+{
-+    LPIT8 it8 = (LPIT8) hIT8;
-+    LPKEYVALUE p;
-+
-+    if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p))
-+    {
-+        return p -> Value;
-+    }
-+    return NULL;
-+}
-+
- // ----------------------------------------------------------------- Datasets
- 
- 
-@@ -1287,10 +1482,17 @@
- }
- 
- static
--BOOL SetDataFormat(LPIT8 it8, int n, const char *label)
-+LCMSBOOL SetDataFormat(LPIT8 it8, int n, const char *label)
- {
-     LPTABLE t = GetTable(it8);
- 
-+#ifdef  STRICT_CGATS
-+    if (!IsAvailableOnList(it8-> ValidSampleID, label, NULL, NULL)) {
-+        SynError(it8, "Invalid data format '%s'.", label);
-+        return FALSE;
-+    }
-+#endif
-+
-     if (!t->DataFormat)
-         AllocateDataFormat(it8);
- 
-@@ -1308,7 +1510,7 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE h, int n, const char *Sample)
-+LCMSBOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE h, int n, const char *Sample)
- {
-         LPIT8 it8 = (LPIT8) h;
-         return SetDataFormat(it8, n, Sample);
-@@ -1348,7 +1550,7 @@
- }
- 
- static
--BOOL SetData(LPIT8 it8, int nSet, int nField, const char *Val)
-+LCMSBOOL SetData(LPIT8 it8, int nSet, int nField, const char *Val)
- {
-     LPTABLE t = GetTable(it8);
- 
-@@ -1418,7 +1620,8 @@
- }
- 
- 
--//
-+// Write formatted
-+
- static
- void Writef(LPSAVESTREAM f, const char* frm, ...)
- {
-@@ -1426,7 +1629,8 @@
-     va_list args;
- 
-     va_start(args, frm);
--    vsprintf(Buffer, frm, args);
-+    vsnprintf(Buffer, 4095, frm, args);
-+    Buffer[4095] = 0;
-     WriteStr(f, Buffer);
-     va_end(args);
- 
-@@ -1462,7 +1666,7 @@
-         }
- 
- 
--        if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL)) {
-+        if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) {
- 
- #ifdef STRICT_CGATS
-             WriteStr(fp, "KEYWORD\t\"");
-@@ -1470,7 +1674,7 @@
-             WriteStr(fp, "\"\n");
- #endif
- 
--            AddAvailableProperty(it8, p->Keyword);
-+            AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED);
- 
-         }
- 
-@@ -1495,6 +1699,10 @@
-                     Writef(fp, "\t0x%B", atoi(p ->Value));
-                     break;
- 
-+            case WRITE_PAIR:
-+                    Writef(fp, "\t\"%s,%s\"", p->Subkey, p->Value);
-+                    break;
-+
-             default: SynError(it8, "Unknown write mode %d", p ->WriteAs);
-                      return;
-             }
-@@ -1573,7 +1781,7 @@
- 
- 
- // Saves whole file
--BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName)
-+LCMSBOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName)
- {
-     SAVESTREAM sd;
-     int i;
-@@ -1601,7 +1809,7 @@
- 
- 
- // Saves to memory
--BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded)
-+LCMSBOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded)
- {
-     SAVESTREAM sd;
-     int i;
-@@ -1644,7 +1852,7 @@
- // -------------------------------------------------------------- Higer level parsing
- 
- static
--BOOL DataFormatSection(LPIT8 it8)
-+LCMSBOOL DataFormatSection(LPIT8 it8)
- {
-     int iField = 0;
-     LPTABLE t = GetTable(it8);
-@@ -1685,16 +1893,19 @@
- 
- 
- static
--BOOL DataSection (LPIT8 it8)
-+LCMSBOOL DataSection (LPIT8 it8)
- {
-     int  iField = 0;
-     int  iSet   = 0;
--    char Buffer[256];
-+    char Buffer[MAXSTR];
-     LPTABLE t = GetTable(it8);
- 
-     InSymbol(it8);   // Eats "BEGIN_DATA"
-     CheckEOLN(it8);
- 
-+    if (!t->Data)
-+        AllocateDataSet(it8);
-+
-     while (it8->sy != SEND_DATA && it8->sy != SEOF)
-     {
-         if (iField >= t -> nSamples) {
-@@ -1705,7 +1916,7 @@
- 
-         if (it8->sy != SEND_DATA && it8->sy != SEOF) {
- 
--            if (!GetVal(it8, Buffer, "Sample data expected"))
-+            if (!GetVal(it8, Buffer, 255, "Sample data expected"))
-                 return FALSE;
- 
-             if (!SetData(it8, iSet, iField, Buffer))
-@@ -1734,10 +1945,11 @@
- 
- 
- static
--BOOL HeaderSection(LPIT8 it8)
-+LCMSBOOL HeaderSection(LPIT8 it8)
- {
-     char VarName[MAXID];
-     char Buffer[MAXSTR];
-+    LPKEYVALUE Key;
- 
-         while (it8->sy != SEOF &&
-                it8->sy != SSYNERROR &&
-@@ -1749,8 +1961,16 @@
- 
-         case SKEYWORD:
-                 InSymbol(it8);
--                if (!GetVal(it8, Buffer, "Keyword expected")) return FALSE;
--                if (!AddAvailableProperty(it8, Buffer)) return FALSE;
-+                if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE;                
-+                if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE;
-+                InSymbol(it8);
-+                break;
-+
-+
-+        case SDATA_FORMAT_ID:
-+                InSymbol(it8);
-+                if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE;                
-+                if (!AddAvailableSampleID(it8, Buffer)) return FALSE;
-                 InSymbol(it8);
-                 break;
- 
-@@ -1758,21 +1978,61 @@
-         case SIDENT:
-                 strncpy(VarName, it8->id, MAXID-1);
- 
--                if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL)) {
-+                if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL, &Key)) {
- 
- #ifdef STRICT_CGATS
-                  return SynError(it8, "Undefined keyword '%s'", VarName);
- #else
--                if (!AddAvailableProperty(it8, VarName)) return FALSE;
-+                    Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED);
-+                    if (Key == NULL) return FALSE;
- #endif
-                 }
- 
-                 InSymbol(it8);
--                if (!GetVal(it8, Buffer, "Property data expected")) return FALSE;
--
-+                if (!GetVal(it8, Buffer, MAXSTR-1, "Property data expected")) return FALSE;
- 
--                AddToList(it8, &GetTable(it8)->HeaderList, VarName, Buffer,
-+                if(Key->WriteAs != WRITE_PAIR) {
-+                    AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer, 
-                                                                 (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED);
-+                }
-+                else {
-+                    const char *Subkey;
-+                    char *Nextkey;
-+                    if (it8->sy != SSTRING)
-+                        return SynError(it8, "Invalid value '%s' for property '%s'.", Buffer, VarName);
-+
-+                    // chop the string as a list of "subkey, value" pairs, using ';' as a separator
-+                    for(Subkey = Buffer; Subkey != NULL; Subkey = Nextkey)
-+                    {
-+                        char *Value, *temp;
-+
-+                        //  identify token pair boundary
-+                        Nextkey = (char*) strchr(Subkey, ';');
-+                        if(Nextkey)
-+                            *Nextkey++ = '\0';
-+
-+                        // for each pair, split the subkey and the value
-+                        Value = (char*) strrchr(Subkey, ',');
-+                        if(Value == NULL)
-+                            return SynError(it8, "Invalid value for property '%s'.", VarName);
-+
-+                        // gobble the spaces before the coma, and the coma itself
-+                        temp = Value++;
-+                        do *temp-- = '\0'; while(temp >= Subkey && *temp == ' ');
-+
-+                        // gobble any space at the right
-+                        temp = Value + strlen(Value) - 1;
-+                        while(*temp == ' ') *temp-- = '\0'; 
-+
-+                        // trim the strings from the left
-+                        Subkey += strspn(Subkey, " ");
-+                        Value += strspn(Value, " ");
-+
-+                        if(Subkey[0] == 0 || Value[0] == 0)
-+                            return SynError(it8, "Invalid value for property '%s'.", VarName);
-+                        AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR);
-+                    }
-+                }
- 
-                 InSymbol(it8);
-                 break;
-@@ -1793,22 +2053,23 @@
- 
- 
- static
--BOOL ParseIT8(LPIT8 it8)
-+LCMSBOOL ParseIT8(LPIT8 it8, LCMSBOOL nosheet)
- {
--    char* SheetTypePtr;
-+    char* SheetTypePtr = it8 ->SheetType;
-+
-+    if (nosheet == 0) {
- 
-     // First line is a very special case.
- 
-     while (isseparator(it8->ch))
-             NextCh(it8);
- 
--    SheetTypePtr = it8 ->SheetType;
--
-     while (it8->ch != '\r' && it8 ->ch != '\n' && it8->ch != '\t' && it8 -> ch != -1) {
- 
-         *SheetTypePtr++= (char) it8 ->ch;
-         NextCh(it8);
-     }
-+    }
- 
-     *SheetTypePtr = 0;
-     InSymbol(it8);
-@@ -1869,6 +2130,12 @@
- 
-     for (idField = 0; idField < t -> nSamples; idField++)
-     {
-+        if (t ->DataFormat == NULL) {
-+             SynError(it8, "Undefined DATA_FORMAT");
-+             return;
-+
-+        }
-+
-         Fld = t->DataFormat[idField];
-         if (!Fld) continue;
- 
-@@ -1916,7 +2183,7 @@
-                                     LPTABLE Table = it8 ->Tab + k;
-                                     LPKEYVALUE p;
- 
--                                    if (IsAvailableOnList(Table->HeaderList, Label, &p)) {
-+                                    if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) {
- 
-                                         // Available, keep type and table
-                                         char Buffer[256];
-@@ -1924,7 +2191,7 @@
-                                         char *Type  = p ->Value;
-                                         int  nTable = k;
- 
--                                        sprintf(Buffer, "%s %d %s", Label, nTable, Type );
-+                                        snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
- 
-                                         SetData(it8, i, idField, Buffer);
-                                     }
-@@ -1948,8 +2215,9 @@
- // that should be something like some printable characters plus a \n
- 
- static
--BOOL IsMyBlock(LPBYTE Buffer, size_t n)
-+int IsMyBlock(LPBYTE Buffer, size_t n)
- {
-+    int cols = 1, space = 0, quot = 0;
-     size_t i;
- 
-     if (n < 10) return FALSE;   // Too small
-@@ -1959,9 +2227,26 @@
- 
-     for (i = 1; i < n; i++) {
- 
--        if (Buffer[i] == '\n' || Buffer[i] == '\r' || Buffer[i] == '\t') return TRUE;
--        if (Buffer[i] < 32) return FALSE;
--
-+        switch(Buffer[i])
-+        {
-+        case '\n':
-+        case '\r':
-+            return quot == 1 || cols > 2 ? 0 : cols;
-+        case '\t':
-+        case ' ':
-+            if(!quot && !space)
-+                space = 1;
-+            break;
-+        case '\"':
-+            quot = !quot;
-+            break;
-+        default:
-+            if (Buffer[i] < 32) return 0;
-+            if (Buffer[i] > 127) return 0;
-+            cols += space;
-+            space = 0;
-+            break;
-+        }
-     }
- 
-     return FALSE;
-@@ -1970,7 +2255,7 @@
- 
- 
- static
--BOOL IsMyFile(const char* FileName)
-+int IsMyFile(const char* FileName)
- {
-    FILE *fp;
-    size_t Size;
-@@ -1998,21 +2283,22 @@
-     LCMSHANDLE hIT8;
-     LPIT8  it8;
- 
--    if (!IsMyBlock((LPBYTE) Ptr, len)) return NULL;
-+    int type = IsMyBlock((LPBYTE) Ptr, len);
-+    if (type == 0) return NULL;
- 
-     hIT8 = cmsIT8Alloc();
-     if (!hIT8) return NULL;
- 
-     it8 = (LPIT8) hIT8;
--    it8 ->MemoryBlock = (char*) malloc(len + 1);
-+    it8 ->MemoryBlock = (char*) _cmsMalloc(len + 1);
- 
-     strncpy(it8 ->MemoryBlock, (const char*) Ptr, len);
-     it8 ->MemoryBlock[len] = 0;
- 
--    strncpy(it8->FileName, "", MAX_PATH-1);
-+    strncpy(it8->FileStack[0]->FileName, "", MAX_PATH-1);
-     it8-> Source = it8 -> MemoryBlock;
- 
--    if (!ParseIT8(it8)) {
-+    if (!ParseIT8(it8, type-1)) { 
- 
-         cmsIT8Free(hIT8);
-         return FALSE;
-@@ -2021,7 +2307,7 @@
-     CookPointers(it8);
-     it8 ->nTable = 0;
- 
--    free(it8->MemoryBlock);
-+     _cmsFree(it8->MemoryBlock);
-     it8 -> MemoryBlock = NULL;
- 
-     return hIT8;
-@@ -2036,26 +2322,27 @@
-      LCMSHANDLE hIT8;
-      LPIT8  it8;
- 
--     if (!IsMyFile(cFileName)) return NULL;
-+     int type = IsMyFile(cFileName);
-+     if (type == 0) return NULL;
- 
-      hIT8 = cmsIT8Alloc();
-      it8 = (LPIT8) hIT8;
-      if (!hIT8) return NULL;
- 
- 
--     it8 ->Stream[0] = fopen(cFileName, "rt");
-+     it8 ->FileStack[0]->Stream = fopen(cFileName, "rt");
- 
--     if (!it8 ->Stream[0]) {
-+     if (!it8 ->FileStack[0]->Stream) {         
-          cmsIT8Free(hIT8);
-          return NULL;
-      }
- 
- 
--    strncpy(it8->FileName, cFileName, MAX_PATH-1);
-+    strncpy(it8->FileStack[0]->FileName, cFileName, MAX_PATH-1);    
- 
--    if (!ParseIT8(it8)) {
-+    if (!ParseIT8(it8, type-1)) { 
- 
--            fclose(it8 ->Stream[0]);
-+            fclose(it8 ->FileStack[0]->Stream);
-             cmsIT8Free(hIT8);
-             return NULL;
-     }
-@@ -2063,7 +2350,7 @@
-     CookPointers(it8);
-     it8 ->nTable = 0;
- 
--    fclose(it8 ->Stream[0]);
-+    fclose(it8 ->FileStack[0]->Stream);    
-     return hIT8;
- 
- }
-@@ -2078,12 +2365,12 @@
- }
- 
- 
--int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, char ***PropertyNames)
-+int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, const char ***PropertyNames)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
-     LPKEYVALUE p;
-     int n;
--    char **Props;
-+    const char **Props;
-     LPTABLE t = GetTable(it8);
- 
-     // Pass#1 - count properties
-@@ -2094,7 +2381,7 @@
-     }
- 
- 
--    Props = (char **) AllocChunk(it8, sizeof(char *) * n);
-+    Props = (const char **) AllocChunk(it8, sizeof(char *) * n);
- 
-     // Pass#2 - Fill pointers
-     n = 0;
-@@ -2106,6 +2393,41 @@
-     return n;
- }
- 
-+int LCMSEXPORT cmsIT8EnumPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char ***SubpropertyNames)
-+{
-+    LPIT8 it8 = (LPIT8) hIT8;
-+    LPKEYVALUE p, tmp;
-+    int n;
-+    const char **Props;
-+    LPTABLE t = GetTable(it8);
-+
-+    if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) {
-+        *SubpropertyNames = 0;
-+        return 0;
-+    }
-+
-+    // Pass#1 - count properties
-+
-+    n = 0;
-+    for (tmp = p;  tmp != NULL; tmp = tmp->NextSubkey) {
-+        if(tmp->Subkey != NULL)
-+            n++;
-+    }
-+
-+
-+    Props = (const char **) AllocChunk(it8, sizeof(char *) * n);
-+
-+    // Pass#2 - Fill pointers
-+    n = 0;
-+    for (tmp = p;  tmp != NULL; tmp = tmp->NextSubkey) {
-+        if(tmp->Subkey != NULL)
-+            Props[n++] = p ->Subkey;
-+    }
-+
-+    *SubpropertyNames = Props;
-+    return n;
-+}
-+
- static
- int LocatePatch(LPIT8 it8, const char* cPatch)
- {
-@@ -2201,7 +2523,7 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val)
-+LCMSBOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
- 
-@@ -2209,7 +2531,7 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val)
-+LCMSBOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
-     char Buff[256];
-@@ -2260,7 +2582,7 @@
- 
- 
- 
--BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch,
-+LCMSBOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch,
-                         const char* cSample,
-                         const char *Val)
- {
-@@ -2305,18 +2627,19 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
-+LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
-                         const char* cSample,
-                         double Val)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
-     char Buff[256];
- 
--        sprintf(Buff, it8->DoubleFormatter, Val);
-+        snprintf(Buff, 255, it8->DoubleFormatter, Val);
-         return cmsIT8SetData(hIT8, cPatch, cSample, Buff);
- 
- }
- 
-+// Buffer should get MAXSTR at least
- 
- const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer)
- {
-@@ -2327,10 +2650,15 @@
-         if (!Data) return NULL;
-         if (!buffer) return Data;
- 
--        strcpy(buffer, Data);
-+        strncpy(buffer, Data, MAXSTR-1);        
-         return buffer;
- }
- 
-+int LCMSEXPORT cmsIT8GetPatchByName(LCMSHANDLE hIT8, const char *cPatch)
-+{
-+    return LocatePatch((LPIT8)hIT8, cPatch);
-+}
-+
- int LCMSEXPORT cmsIT8TableCount(LCMSHANDLE hIT8)
- {
-         LPIT8 it8 = (LPIT8) hIT8;
-@@ -2356,7 +2684,7 @@
-     cLabelFld = cmsIT8GetData(hIT8, cSet, cField);
-     if (!cLabelFld) return -1;
- 
--    if (sscanf(cLabelFld, "%s %d %s", Label, &nTable, Type) != 3)
-+    if (sscanf(cLabelFld, "%255s %d %255s", Label, &nTable, Type) != 3)
-             return -1;
- 
-     if (ExpectedType != NULL && *ExpectedType == 0)
-@@ -2371,6 +2699,19 @@
- }
- 
- 
-+LCMSBOOL LCMSEXPORT cmsIT8SetIndexColumn(LCMSHANDLE hIT8, const char* cSample)
-+{
-+    LPIT8 it8 = (LPIT8) hIT8;
-+
-+    int pos = LocateSample(it8, cSample);
-+    if(pos == -1)
-+        return FALSE;
-+
-+    it8->Tab[it8->nTable].SampleID = pos;
-+    return TRUE;
-+}
-+
-+
- void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE hIT8, const char* Formatter)
- {
-     LPIT8 it8 = (LPIT8) hIT8;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -256,7 +256,7 @@
- // Return TRUE if both m and of are empy -- "m" being identity and "of" being 0
- 
- static
--BOOL IdentityParameters(LPWMAT3 m, LPWVEC3 of)
-+LCMSBOOL IdentityParameters(LPWMAT3 m, LPWVEC3 of)
- {
-     WVEC3 wv0;
- 
-@@ -661,3 +661,6 @@
- 
-        return rc;
- }
-+
-+
-+      
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -96,7 +96,7 @@
- 
-             char Buffer[1024];
- 
--            vsprintf(Buffer, ErrorText, args);
-+            vsnprintf(Buffer, 1023, ErrorText, args);
-             va_end(args);
- 
-             if (UserErrorHandler(ErrorCode, Buffer)) {
-@@ -118,8 +118,8 @@
-               char Buffer1[1024];
-               char Buffer2[256];
- 
--              sprintf(Buffer1, "Error #%x; ", ErrorCode);
--              vsprintf(Buffer2, ErrorText, args);
-+              snprintf(Buffer1,  767, "Error #%x; ", ErrorCode);
-+              vsnprintf(Buffer2, 255, ErrorText, args);
-               strcat(Buffer1, Buffer2);
-               MessageBox(NULL, Buffer1, "Little cms",
-                                           MB_OK|MB_ICONSTOP|MB_TASKMODAL);
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -63,9 +63,9 @@
- LPGAMMATABLE LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]);
- LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma);
- LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma, int nPoints);
--BOOL         LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
-+LCMSBOOL         LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
- 
--BOOL         cdecl _cmsSmoothEndpoints(LPWORD Table, int nPoints);
-+LCMSBOOL         cdecl _cmsSmoothEndpoints(LPWORD Table, int nPoints);
- 
- 
- // Sampled curves
-@@ -74,7 +74,7 @@
- void           cdecl cmsFreeSampledCurve(LPSAMPLEDCURVE p);
- void           cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
- void           cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
--BOOL           cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
-+LCMSBOOL       cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
- void           cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
- 
- LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
-@@ -84,7 +84,6 @@
- 
- // ----------------------------------------------------------------------------------------
- 
--// #define DEBUG 1
- 
- #define MAX_KNOTS   4096
- typedef float vec[MAX_KNOTS+1];
-@@ -144,14 +143,14 @@
-        LPGAMMATABLE p;
-        size_t size;
- 
--       if (nEntries > 65530) {
--                cmsSignalError(LCMS_ERRC_WARNING, "Couldn't create gammatable of more than 65530 entries; 65530 assumed");
--                nEntries = 65530;
-+       if (nEntries > 65530 || nEntries <= 0) {
-+                cmsSignalError(LCMS_ERRC_ABORTED, "Couldn't create gammatable of more than 65530 entries");
-+                return NULL;
-        }
- 
-        size = sizeof(GAMMATABLE) + (sizeof(WORD) * (nEntries-1));
- 
--       p = (LPGAMMATABLE) malloc(size);
-+       p = (LPGAMMATABLE) _cmsMalloc(size);
-        if (!p) return NULL;
- 
-        ZeroMemory(p, size);
-@@ -164,7 +163,7 @@
- 
- void LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma)
- {
--       if (Gamma) free(Gamma);
-+       if (Gamma)  _cmsFree(Gamma);
- }
- 
- 
-@@ -278,6 +277,15 @@
-        LPWORD InPtr;
-        LPGAMMATABLE p;
- 
-+       // Try to reverse it analytically whatever possible
-+       if (InGamma -> Seed.Type > 0 && InGamma -> Seed.Type <= 5 &&             
-+            _cmsCrc32OfGammaTable(InGamma) == InGamma -> Seed.Crc32) {
-+
-+                return cmsBuildParametricGamma(nResultSamples, -(InGamma -> Seed.Type), InGamma ->Seed.Params);
-+       }
-+
-+
-+       // Nope, reverse the table 
-        p = cmsAllocGamma(nResultSamples);
-        if (!p) return NULL;
- 
-@@ -528,7 +536,7 @@
- 
- // Smooths a curve sampled at regular intervals
- 
--BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda)
-+LCMSBOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda)
- 
- {
-     vec w, y, z;
-@@ -640,13 +648,13 @@
- {
-     LPSAMPLEDCURVE pOut;
- 
--    pOut = (LPSAMPLEDCURVE) malloc(sizeof(SAMPLEDCURVE));
-+    pOut = (LPSAMPLEDCURVE) _cmsMalloc(sizeof(SAMPLEDCURVE));
-     if (pOut == NULL)
-             return NULL;
- 
--    if((pOut->Values = (double *) malloc(nItems * sizeof(double))) == NULL)
-+    if((pOut->Values = (double *) _cmsMalloc(nItems * sizeof(double))) == NULL)
-     {
--        free(pOut);
-+         _cmsFree(pOut);
-         return NULL;
-     }
- 
-@@ -659,8 +667,8 @@
- 
- void cmsFreeSampledCurve(LPSAMPLEDCURVE p)
- {
--    free((LPVOID) p -> Values);
--    free((LPVOID) p);
-+     _cmsFree((LPVOID) p -> Values);
-+     _cmsFree((LPVOID) p);
- }
- 
- 
-@@ -731,7 +739,7 @@
- 
- // Smooths a curve sampled at regular intervals
- 
--BOOL cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double lambda)
-+LCMSBOOL cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double lambda)
- {
-     vec w, y, z;
-     int i, nItems;
-@@ -915,14 +923,11 @@
- 
- // Smooth endpoints (used in Black/White compensation)
- 
--BOOL _cmsSmoothEndpoints(LPWORD Table, int nEntries)
-+LCMSBOOL _cmsSmoothEndpoints(LPWORD Table, int nEntries)
- {
-     vec w, y, z;
-     int i, Zeros, Poles;
- 
--#ifdef DEBUG
--        ASAVE(Table, nEntries, "nonsmt.txt");
--#endif
- 
- 
-     if (cmsIsLinear(Table, nEntries)) return FALSE; // Nothing to do
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -66,7 +66,7 @@
- */
- 
- 
--BOOL _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black,
-+LCMSBOOL _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black,
-                             int *nOutputs)
- {
-        // Only most common spaces
-@@ -390,15 +390,21 @@
-     double C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps));
-     double h_ps = atan2deg(a_ps, b_ps);
- 
--
--
-     double meanC_p =(C_p + C_ps) / 2;
- 
--    double meanh_p = fabs(h_ps-h_p) <= 180 ? (h_ps + h_p)/2 : (h_ps+h_p-360)/2;
-+    double hps_plus_hp  = h_ps + h_p;
-+    double hps_minus_hp = h_ps - h_p;
-+
-+    double meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 : 
-+                            (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 : 
-+                                                 (hps_plus_hp - 360)/2;
-+
-+    double delta_h = (hps_minus_hp) <= -180.000001 ?  (hps_minus_hp + 360) :
-+                            (hps_minus_hp) > 180 ? (hps_minus_hp - 360) : 
-+                                                    (hps_minus_hp);
-+    double delta_L = (Ls - L1);
-+    double delta_C = (C_ps - C_p );
- 
--    double delta_h = fabs(h_p - h_ps) <= 180 ? fabs(h_p - h_ps) : 360 - fabs(h_p - h_ps);
--    double delta_L = fabs(L1 - Ls);
--    double delta_C = fabs(C_p - C_ps);
- 
-     double delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANES(delta_h) / 2);
- 
-@@ -1065,7 +1071,7 @@
- // Check for monotonicity.
- 
- static
--BOOL IsMonotonic(LPGAMMATABLE t)
-+LCMSBOOL IsMonotonic(LPGAMMATABLE t)
- {
-     int n = t -> nEntries;
-     int i, last;
-@@ -1088,7 +1094,7 @@
- // Check for endpoints
- 
- static
--BOOL HasProperEndpoints(LPGAMMATABLE t)
-+LCMSBOOL HasProperEndpoints(LPGAMMATABLE t)
- {
-     if (t ->GammaTable[0] != 0) return FALSE;
-     if (t ->GammaTable[t ->nEntries-1] != 0xFFFF) return FALSE;
-@@ -1109,7 +1115,7 @@
-     unsigned int t, i, v;
-     int j;
-     WORD In[MAXCHANNELS], Out[MAXCHANNELS];
--    BOOL lIsSuitable;
-+    LCMSBOOL lIsSuitable;
-     _LPcmsTRANSFORM InputXForm   = (_LPcmsTRANSFORM) h[0];
-     _LPcmsTRANSFORM OutputXForm  = (_LPcmsTRANSFORM) h[nTransforms-1];
- 
-@@ -1126,10 +1132,10 @@
-     }
- 
- 
--    // Do nothing on all but RGB to RGB transforms
-+    // Do nothing on all but Gray/RGB to Gray/RGB transforms
- 
--    if ((InputXForm ->EntryColorSpace != icSigRgbData) ||
--        (OutputXForm->ExitColorSpace  != icSigRgbData)) return;
-+    if (((InputXForm ->EntryColorSpace != icSigRgbData) && (InputXForm ->EntryColorSpace != icSigGrayData)) || 
-+        ((OutputXForm->ExitColorSpace  != icSigRgbData) && (OutputXForm->ExitColorSpace  != icSigGrayData))) return;
- 
- 
-     for (t = 0; t < Grid -> InputChan; t++)
-@@ -1169,10 +1175,13 @@
-         if (!HasProperEndpoints(Trans[t]))
-                     lIsSuitable = FALSE;
- 
-+        /*
-         // Exclude if transfer function is not smooth enough
-         // to be modelled as a gamma function, or the gamma is reversed
-+        
-         if (cmsEstimateGamma(Trans[t]) < 1.0)
-                     lIsSuitable = FALSE;
-+        */
- 
-     }
- 
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -282,7 +282,7 @@
- // Fills optimization parameters
- 
- void cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan,
--                                            BOOL lUseTetrahedral, LPL16PARAMS p)
-+                                            LCMSBOOL lUseTetrahedral, LPL16PARAMS p)
- {
-        int clutPoints;
- 
-@@ -579,7 +579,7 @@
- 
-                 // Identify if value fall downto 0 or FFFF zone
-                 if (Value == 0) return 0;
--                if (Value == 0xFFFF) return 0xFFFF;
-+               // if (Value == 0xFFFF) return 0xFFFF;
- 
-                 // else restrict to valid zone
- 
-@@ -631,7 +631,7 @@
-         a = (y1 - y0) / (x1 - x0);
-         b = y0 - a * x0;
- 
--        if (a == 0) return (WORD) x;
-+        if (fabs(a) < 0.01) return (WORD) x;
- 
-         f = ((Value - b) / a);
- 
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c	2009-04-03 13:43:04.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -62,7 +62,7 @@
- typedef struct {
-                 LPBYTE Block;           // Points to allocated memory
-                 size_t Size;            // Size of allocated memory
--                int Pointer;            // Points to current location
-+                size_t Pointer;         // Points to current location
-                 int FreeBlockOnClose;   // As title
- 
-                 } FILEMEM;
-@@ -70,14 +70,16 @@
- static
- LPVOID MemoryOpen(LPBYTE Block, size_t Size, char Mode)
- {
--    FILEMEM* fm = (FILEMEM*) malloc(sizeof(FILEMEM));
-+    FILEMEM* fm = (FILEMEM*) _cmsMalloc(sizeof(FILEMEM));
-+    if (fm == NULL) return NULL;
-+
-     ZeroMemory(fm, sizeof(FILEMEM));
- 
-     if (Mode == 'r') {
- 
--        fm ->Block   = (LPBYTE) malloc(Size);
-+        fm ->Block   = (LPBYTE) _cmsMalloc(Size);
-         if (fm ->Block == NULL) {
--            free(fm);
-+             _cmsFree(fm);
-             return NULL;
-         }
- 
-@@ -103,13 +105,27 @@
-      FILEMEM* ResData = (FILEMEM*) Icc ->stream;
-      LPBYTE Ptr;
-      size_t len = size * count;
-+     size_t extent = ResData -> Pointer + len;
- 
-+      if (len == 0) {
-+          return 0;
-+      }
-+
-+      if (len / size != count) {
-+          cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Integer overflow with count / size.");
-+          return 0;
-+      }
-+
-+      if (extent < len || extent < ResData -> Pointer) {
-+          cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Integer overflow with len.");
-+          return 0;
-+      } 
- 
--     if (ResData -> Pointer + len > ResData -> Size){
-+      if (ResData -> Pointer + len > ResData -> Size) {
- 
-          len = (ResData -> Size - ResData -> Pointer);
--         cmsSignalError(LCMS_ERRC_WARNING, "Read from memory error. Got %d bytes, block should be of %d bytes", len * size, count * size);
--
-+         cmsSignalError(LCMS_ERRC_ABORTED, "Read from memory error. Got %d bytes, block should be of %d bytes", len * size, count * size);
-+         return 0;
-      }
- 
-     Ptr  = ResData -> Block;
-@@ -123,7 +139,7 @@
- // SEEK_CUR is assumed
- 
- static
--BOOL MemorySeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
-+LCMSBOOL MemorySeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
- {
-     FILEMEM* ResData = (FILEMEM*) Icc ->stream;
- 
-@@ -147,10 +163,10 @@
- }
- 
- 
--// Writes data to memory, also keeps used space for further reference
-+// Writes data to memory, also keeps used space for further reference. NO CHECK IS PERFORMED
- 
- static
--BOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr)
-+LCMSBOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr)
- {
-         FILEMEM* ResData = (FILEMEM*) Icc ->stream;
- 
-@@ -167,7 +183,7 @@
- 
- 
- static
--BOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
-+LCMSBOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
- {
-   FILEMEM* ResData = (FILEMEM*) Icc->stream;
-   ResData->Size += size;
-@@ -179,15 +195,15 @@
- 
- 
- static
--BOOL MemoryClose(struct _lcms_iccprofile_struct* Icc)
-+LCMSBOOL MemoryClose(struct _lcms_iccprofile_struct* Icc)
- {
-     FILEMEM* ResData = (FILEMEM*) Icc ->stream;
- 
-     if (ResData ->FreeBlockOnClose) {
- 
--        if (ResData ->Block) free(ResData ->Block);
-+        if (ResData ->Block)  _cmsFree(ResData ->Block);
-     }
--    free(ResData);
-+     _cmsFree(ResData);
-     return 0;
- }
- 
-@@ -205,7 +221,7 @@
- {
-     size_t nReaded = fread(buffer, size, count, (FILE*) Icc->stream);
-     if (nReaded != count) {
--            cmsSignalError(LCMS_ERRC_WARNING, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size);
-+            cmsSignalError(LCMS_ERRC_ABORTED, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size);
-             return 0;
-     }
- 
-@@ -214,7 +230,7 @@
- 
- 
- static
--BOOL FileSeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
-+LCMSBOOL FileSeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
- {
-     if (fseek((FILE*) Icc ->stream, (long) offset, SEEK_SET) != 0) {
- 
-@@ -236,7 +252,7 @@
- 
- 
- static
--BOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr)
-+LCMSBOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr)
- {
-        if (size == 0) return TRUE;
- 
-@@ -252,14 +268,14 @@
- 
- 
- static
--BOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
-+LCMSBOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size)
- {
-   return TRUE;
- }
- 
- 
- static
--BOOL FileClose(struct _lcms_iccprofile_struct* Icc)
-+LCMSBOOL FileClose(struct _lcms_iccprofile_struct* Icc)
- {
-     return fclose((FILE*) Icc ->stream);
- }
-@@ -272,7 +288,7 @@
- cmsHPROFILE _cmsCreateProfilePlaceholder(void)
- {
- 
--    LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) malloc(sizeof(LCMSICCPROFILE));
-+    LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) _cmsMalloc(sizeof(LCMSICCPROFILE));
-     if (Icc == NULL) return NULL;
- 
-     // Empty values
-@@ -310,7 +326,7 @@
- // Search for a specific tag in tag dictionary
- // Returns position or -1 if tag not found
- 
--icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError)
-+icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, LCMSBOOL lSignalError)
- {
-        icInt32Number i;
- 
-@@ -331,7 +347,7 @@
- 
- // Check existance
- 
--BOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig)
-+LCMSBOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig)
- {
-        LPLCMSICCPROFILE  Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-        return _cmsSearchTag(Icc, sig, FALSE) >= 0;
-@@ -350,7 +366,7 @@
- 
-     if (i >=0) {
- 
--        if (Icc -> TagPtrs[i]) free(Icc -> TagPtrs[i]);
-+        if (Icc -> TagPtrs[i]) _cmsFree(Icc -> TagPtrs[i]);
-     }
-     else  {
- 
-@@ -361,11 +377,14 @@
- 
-             cmsSignalError(LCMS_ERRC_ABORTED, "Too many tags (%d)", MAX_TABLE_TAG);
-             Icc ->TagCount = MAX_TABLE_TAG-1;
-+            return NULL;
-         }
-     }
- 
- 
--    Ptr = malloc(size);
-+    Ptr = _cmsMalloc(size);
-+    if (Ptr == NULL) return NULL;
-+
-     CopyMemory(Ptr, Init, size);
- 
-     Icc ->TagNames[i] = sig;
-@@ -396,6 +415,8 @@
-     if (NewIcc == NULL) return NULL;
- 
-     strncpy(NewIcc -> PhysicalFile, FileName, MAX_PATH-1);
-+    NewIcc -> PhysicalFile[MAX_PATH-1] = 0;
-+
-     NewIcc ->stream = ICCfile;
- 
-     NewIcc ->Read  = FileRead;
-@@ -498,7 +519,7 @@
- 
- 
- 
--BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
-+LCMSBOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
- {
-      LPLCMSICCPROFILE    Icc = (LPLCMSICCPROFILE) hProfile;
-      *Dest = Icc -> MediaWhitePoint;
-@@ -506,14 +527,14 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
-+LCMSBOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
- {
-       LPLCMSICCPROFILE    Icc = (LPLCMSICCPROFILE) hProfile;
-       *Dest = Icc -> MediaBlackPoint;
-       return TRUE;
- }
- 
--BOOL  LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
-+LCMSBOOL  LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
- {
-        LPLCMSICCPROFILE  Icc = (LPLCMSICCPROFILE) hProfile;
-        *Dest = Icc -> Illuminant;
-@@ -571,7 +592,7 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
-+LCMSBOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
- {
-     LPLCMSICCPROFILE  Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-     CopyMemory(Dest, &Icc ->Created, sizeof(struct tm));
-@@ -660,7 +681,7 @@
- 
- // This is tricky, since LUT structs does have pointers
- 
--BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut)
-+LCMSBOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, const void* lut)
- {
-        LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-        LPLUT Orig, Stored;
-@@ -688,7 +709,7 @@
- }
- 
- 
--BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ)
-+LCMSBOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ)
- {
-        LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-@@ -697,7 +718,7 @@
- }
- 
- 
--BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text)
-+LCMSBOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text)
- {
-        LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-@@ -705,7 +726,7 @@
-        return TRUE;
- }
- 
--BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction)
-+LCMSBOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction)
- {
-     LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-@@ -714,7 +735,7 @@
- }
- 
- 
--BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm)
-+LCMSBOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm)
- {
-     LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-@@ -723,7 +744,7 @@
- }
- 
- 
--BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ pseq)
-+LCMSBOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ pseq)
- {
-     LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-@@ -733,28 +754,40 @@
- }
- 
- 
--BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
-+LCMSBOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
- {
-     LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-     _cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc);
--    return FALSE;
-+    return TRUE;
- }
- 
- 
--BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime)
-+LCMSBOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime)
- {
-     LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-     _cmsInitTag(Icc, sig, sizeof(struct tm), DateTime);
--    return FALSE;
-+    return TRUE;
- }
- 
- 
--BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
-+LCMSBOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
- {
-     LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
- 
-     _cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc);
--    return FALSE;
-+    return TRUE;
-+}
-+
-+
-+LCMSBOOL LCMSEXPORT _cmsAddChromaticAdaptationTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* mat)
-+{
-+    LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-+   
-+    _cmsInitTag(Icc, sig, 3*sizeof(cmsCIEXYZ), mat);
-+    return TRUE;
-+
- }
-+
-+
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c	2009-04-03 13:43:04.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -288,13 +288,17 @@
- // Read profile header and validate it
- 
- static
--LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, BOOL lIsFromMemory)
-+LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc,
-+                            LCMSBOOL lIsFromMemory,
-+                            DWORD dwSize)
- {
-      icTag Tag;
-      icHeader Header;
-      icInt32Number TagCount, i;
-+     icUInt32Number extent;
- 
--     Icc -> Read(&Header, sizeof(icHeader), 1, Icc);
-+       if (Icc -> Read(&Header, sizeof(icHeader), 1, Icc) != 1) 
-+                      goto ErrorCleanup;
- 
-        // Convert endian
- 
-@@ -313,6 +317,9 @@
- 
-        if (Header.magic != icMagicNumber) goto ErrorCleanup;
- 
-+       if (dwSize && dwSize != Header.size) {
-+            goto ErrorCleanup;
-+        }
- 
-        if (Icc ->Read(&TagCount, sizeof(icInt32Number), 1, Icc) != 1)
-                      goto ErrorCleanup;
-@@ -348,7 +355,7 @@
- 
-        // Read tag directory
- 
--       if (TagCount > MAX_TABLE_TAG) {
-+       if (TagCount > MAX_TABLE_TAG || TagCount < 0) {
- 
-            cmsSignalError(LCMS_ERRC_ABORTED, "Too many tags (%d)", TagCount);
-            goto ErrorCleanup;
-@@ -357,12 +364,18 @@
-        Icc -> TagCount = TagCount;
-        for (i=0; i < TagCount; i++) {
- 
--              Icc ->Read(&Tag, sizeof(icTag), 1, Icc);
-+              if (Icc ->Read(&Tag, sizeof(icTag), 1, Icc) != 1) 
-+                  goto ErrorCleanup;
- 
-               AdjustEndianess32((LPBYTE) &Tag.offset);
-               AdjustEndianess32((LPBYTE) &Tag.size);
-               AdjustEndianess32((LPBYTE) &Tag.sig);            // Signature
- 
-+              // Perform some sanity check. Offset + size should fall inside file.
-+              extent = Tag.offset + Tag.size;
-+              if (extent > Header.size || extent < Tag.offset)
-+                  goto ErrorCleanup;
-+
-               Icc -> TagNames[i]   = Tag.sig;
-               Icc -> TagOffsets[i] = Tag.offset;
-               Icc -> TagSizes[i]   = Tag.size;
-@@ -381,7 +394,7 @@
-              cmsSignalError(LCMS_ERRC_ABORTED, "Corrupted profile: '%s'", Icc->PhysicalFile);
- 
- 
--       free(Icc);
-+        _cmsFree(Icc);
-        return NULL;
- }
- 
-@@ -497,7 +510,7 @@
- // The infamous LUT 8
- 
- static
--void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig)
-+LCMSBOOL ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig)
- {
-     icLut8 LUT8;
-     LPBYTE Temp;
-@@ -506,7 +519,7 @@
-     unsigned int AllLinear;
-     LPWORD PtrW;
- 
--       Icc ->Read(&LUT8, sizeof(icLut8) - SIZEOF_UINT8_ALIGNED, 1, Icc);
-+       if (Icc ->Read(&LUT8, sizeof(icLut8) - SIZEOF_UINT8_ALIGNED, 1, Icc) != 1) return FALSE;
- 
-        NewLUT -> wFlags        = LUT_HASTL1|LUT_HASTL2|LUT_HAS3DGRID;
-        NewLUT -> cLutPoints    = LUT8.clutPoints;
-@@ -515,6 +528,10 @@
-        NewLUT -> InputEntries  = 256;
-        NewLUT -> OutputEntries = 256;
- 
-+       // Do some checking
-+       if (!_cmsValidateLUT(NewLUT)) {
-+          return FALSE;
-+       }
- 
-        AdjustEndianess32((LPBYTE) &LUT8.e00);
-        AdjustEndianess32((LPBYTE) &LUT8.e01);
-@@ -550,13 +567,24 @@
- 
-        // Copy input tables
- 
--       Temp = (LPBYTE) malloc(256);
-+       Temp = (LPBYTE) _cmsMalloc(256);
-+       if (Temp == NULL) return FALSE;
-+
-        AllLinear = 0;
-        for (i=0; i < NewLUT -> InputChan; i++) {
- 
--              PtrW = (LPWORD) malloc(sizeof(WORD) * 256);
-+              PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * 256);
-+              if (PtrW == NULL) {
-+                   _cmsFree(Temp);
-+                  return FALSE;
-+                  }
-+
-               NewLUT -> L1[i] = PtrW;
--              Icc ->Read(Temp, 1, 256, Icc);
-+              if (Icc ->Read(Temp, 1, 256, Icc) != 256) {
-+                   _cmsFree(Temp);
-+                  return FALSE;
-+                  }
-+
-               for (j=0; j < 256; j++)
-                      PtrW[j] = TO16_TAB(Temp[j]);
-                      AllLinear += cmsIsLinear(NewLUT -> L1[i], NewLUT -> InputEntries);
-@@ -569,7 +597,7 @@
-               NewLUT -> wFlags &= ~LUT_HASTL1;
-        }
- 
--       free(Temp);
-+        _cmsFree(Temp);
- 
-        // Copy 3D CLUT
- 
-@@ -578,9 +606,20 @@
- 
-        if (nTabSize > 0) {
- 
--            PtrW = (LPWORD) malloc(sizeof(WORD) * nTabSize);
--            Temp = (LPBYTE) malloc(nTabSize);
--            Icc ->Read(Temp, 1, nTabSize, Icc);
-+            PtrW = (LPWORD) _cmsCalloc(sizeof(WORD), nTabSize);
-+            if (PtrW == NULL) return FALSE;
-+
-+            Temp = (LPBYTE) _cmsMalloc(nTabSize);
-+            if (Temp == NULL) {
-+                 _cmsFree(PtrW);
-+                return FALSE;
-+                }
-+
-+            if (Icc ->Read(Temp, 1, nTabSize, Icc) != nTabSize) {
-+                 _cmsFree(Temp);
-+                _cmsFree(PtrW);
-+                return FALSE;
-+                }
- 
-             NewLUT -> T = PtrW;
-             NewLUT -> Tsize = (unsigned int) (nTabSize * sizeof(WORD));
-@@ -589,25 +628,37 @@
- 
-                      *PtrW++ = TO16_TAB(Temp[i]);
-             }
--            free(Temp);
-+            _cmsFree(Temp);
-        }
-        else {
-            NewLUT ->T = NULL;
-            NewLUT ->Tsize = 0;
--           NewLUT -> wFlags &= ~LUT_HAS3DGRID;
-+           NewLUT ->wFlags &= ~LUT_HAS3DGRID;
-        }
- 
- 
--
-        // Copy output tables
- 
--       Temp = (LPBYTE) malloc(256);
-+       Temp = (LPBYTE) _cmsMalloc(256);
-+       if (Temp == NULL) {
-+           return FALSE;
-+           }
-+
-        AllLinear = 0;
-        for (i=0; i < NewLUT -> OutputChan; i++) {
- 
--              PtrW = (LPWORD) malloc(sizeof(WORD) * 256);
-+              PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * 256);
-+              if (PtrW == NULL) {
-+                  _cmsFree(Temp);
-+                  return FALSE;
-+                  }
-+
-               NewLUT -> L2[i] = PtrW;
--              Icc ->Read(Temp, 1, 256, Icc);
-+              if (Icc ->Read(Temp, 1, 256, Icc) != 256) {
-+                  _cmsFree(Temp);
-+                  return FALSE;
-+                  }
-+
-               for (j=0; j < 256; j++)
-                      PtrW[j] = TO16_TAB(Temp[j]);
-                      AllLinear += cmsIsLinear(NewLUT -> L2[i], 256);
-@@ -621,7 +672,7 @@
-        }
- 
- 
--       free(Temp);
-+       _cmsFree(Temp);
- 
-        cmsCalcL16Params(NewLUT -> InputEntries,  &NewLUT -> In16params);
-        cmsCalcL16Params(NewLUT -> OutputEntries, &NewLUT -> Out16params);
-@@ -646,6 +697,15 @@
-            // some profiles does claim to do that. Poor lcms will try
-            // to detect such condition and fix up "on the fly".
- 
-+           switch (sig) {
-+
-+            case icSigBToA0Tag:
-+            case icSigBToA1Tag:
-+            case icSigBToA2Tag:
-+            case icSigGamutTag:
-+            case icSigPreview0Tag:
-+            case icSigPreview1Tag:
-+            case icSigPreview2Tag: 
-            {
-                LPWORD WhiteLab, ExpectedWhite;
-                WORD WhiteFixed[MAXCHANNELS], WhiteUnfixed[MAXCHANNELS];
-@@ -685,9 +745,13 @@
-                }
- 
-            }
-+           break;
- 
-+        default:;
-+        }           
-        }
- 
-+       return TRUE;
- }
- 
- 
-@@ -696,7 +760,7 @@
- // Case LUT 16
- 
- static
--void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT)
-+LCMSBOOL ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT)
- {
-     icLut16 LUT16;
-     size_t nTabSize;
-@@ -705,7 +769,8 @@
-     LPWORD PtrW;
- 
- 
--       Icc ->Read(&LUT16, sizeof(icLut16)- SIZEOF_UINT16_ALIGNED, 1, Icc);
-+       if (Icc ->Read(&LUT16, sizeof(icLut16)- SIZEOF_UINT16_ALIGNED, 1, Icc) != 1) 
-+            return FALSE;
- 
-        NewLUT -> wFlags        = LUT_HASTL1 | LUT_HASTL2 | LUT_HAS3DGRID;
-        NewLUT -> cLutPoints    = LUT16.clutPoints;
-@@ -718,6 +783,9 @@
-        NewLUT -> InputEntries  = LUT16.inputEnt;
-        NewLUT -> OutputEntries = LUT16.outputEnt;
- 
-+       if (!_cmsValidateLUT(NewLUT)) {
-+         return FALSE;
-+       }
- 
-        // Matrix handling
- 
-@@ -754,9 +822,14 @@
-        AllLinear = 0;
-        for (i=0; i < NewLUT -> InputChan; i++) {
- 
--              PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> InputEntries);
-+              PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> InputEntries);
-+              if (PtrW == NULL) return FALSE;
-+
-               NewLUT -> L1[i] = PtrW;
--              Icc ->Read(PtrW, sizeof(WORD), NewLUT -> InputEntries, Icc);
-+              if (Icc ->Read(PtrW, sizeof(WORD), NewLUT -> InputEntries, Icc) != NewLUT -> InputEntries) {                 
-+                  return FALSE;
-+                  }
-+
-               AdjustEndianessArray16(PtrW, NewLUT -> InputEntries);
-               AllLinear += cmsIsLinear(NewLUT -> L1[i], NewLUT -> InputEntries);
-               }
-@@ -775,12 +848,19 @@
-                                                 NewLUT->InputChan));
-        if (nTabSize > 0) {
- 
--           PtrW = (LPWORD) malloc(sizeof(WORD) * nTabSize);
-+           PtrW = (LPWORD) _cmsCalloc(sizeof(WORD), nTabSize);
-+           if (PtrW == NULL) {
-+               _cmsFree(PtrW);
-+               return FALSE;
-+           }
- 
-            NewLUT -> T = PtrW;
-            NewLUT -> Tsize = (unsigned int) (nTabSize * sizeof(WORD));
- 
--           Icc -> Read(PtrW, sizeof(WORD), nTabSize, Icc);
-+           if (Icc -> Read(PtrW, sizeof(WORD), nTabSize, Icc) != nTabSize) {
-+               return FALSE;
-+           }
-+
-            AdjustEndianessArray16(NewLUT -> T, nTabSize);
-        }
-        else {
-@@ -794,9 +874,16 @@
-        AllLinear = 0;
-        for (i=0; i < NewLUT -> OutputChan; i++) {
- 
--              PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> OutputEntries);
-+              PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> OutputEntries);
-+              if (PtrW == NULL) {
-+                  return FALSE;
-+                  }
-+
-               NewLUT -> L2[i] = PtrW;
--              Icc ->Read(PtrW, sizeof(WORD), NewLUT -> OutputEntries, Icc);
-+              if (Icc ->Read(PtrW, sizeof(WORD), NewLUT -> OutputEntries, Icc) != NewLUT -> OutputEntries) {
-+                  return FALSE;
-+                  }
-+
-               AdjustEndianessArray16(PtrW, NewLUT -> OutputEntries);
-               AllLinear += cmsIsLinear(NewLUT -> L2[i], NewLUT -> OutputEntries);
-               }
-@@ -814,6 +901,8 @@
-        cmsCalcCLUT16Params(NewLUT -> cLutPoints,  NewLUT -> InputChan,
-                                                   NewLUT -> OutputChan,
-                                                   &NewLUT -> CLut16params);
-+
-+       return TRUE;
- }
- 
- 
-@@ -834,13 +923,12 @@
-        switch (BaseType) {
- 
- 
--       case 0x9478ee00L:    // Monaco 2 profiler is BROKEN!
-+       case ((icTagTypeSignature) 0x9478ee00):    // Monaco 2 profiler is BROKEN!
-        case icSigCurveType:
- 
--           Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
-+           if (Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return NULL;
-            AdjustEndianess32((LPBYTE) &Count);
- 
--
-            switch (Count) {
- 
-            case 0:   // Linear.
-@@ -855,7 +943,7 @@
-                     {
-                      WORD SingleGammaFixed;
- 
--                     Icc ->Read(&SingleGammaFixed, sizeof(WORD), 1, Icc);
-+                     if (Icc ->Read(&SingleGammaFixed, sizeof(WORD), 1, Icc) != 1) return NULL;
-                      AdjustEndianess16((LPBYTE) &SingleGammaFixed);
-                      return cmsBuildGamma(4096, Convert8Fixed8(SingleGammaFixed));
-                      }
-@@ -865,10 +953,9 @@
-                      NewGamma = cmsAllocGamma(Count);
-                      if (!NewGamma) return NULL;
- 
--                     Icc ->Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc);
--
-+                     if (Icc ->Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc) != Count) 
-+                         return NULL;                    
-                      AdjustEndianessArray16(NewGamma -> GammaTable, Count);
--
-                      return NewGamma;
-                     }
-               }
-@@ -885,8 +972,8 @@
-            icUInt16Number   Type;
-            int i;
- 
--           Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc);
--           Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc);
-+           if (Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc) != 1) return NULL;
-+           if (Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc) != 1) return NULL;
- 
-            AdjustEndianess16((LPBYTE) &Type);
-            if (Type > 5) {
-@@ -900,7 +987,7 @@
- 
-           for (i=0; i < n; i++) {
-                 Num = 0;
--                Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
-+                if (Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc) != 1) return NULL;
-                 Params[i] = Convert15Fixed16(Num);
-           }
- 
-@@ -938,7 +1025,7 @@
-        case 0x9478ee00L:    // Monaco 2 profiler is BROKEN!
-        case icSigCurveType:
- 
--           Icc -> Read(&Count, sizeof(icUInt32Number), 1, Icc);
-+           if (Icc -> Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return NULL;
-            AdjustEndianess32((LPBYTE) &Count);
- 
- 
-@@ -955,7 +1042,7 @@
-            case 1:  {
-                      WORD SingleGammaFixed;
- 
--                     Icc -> Read(&SingleGammaFixed, sizeof(WORD), 1, Icc);
-+                     if (Icc -> Read(&SingleGammaFixed, sizeof(WORD), 1, Icc) != 1) return NULL;
-                      AdjustEndianess16((LPBYTE) &SingleGammaFixed);
-                      return cmsBuildGamma(4096, 1./Convert8Fixed8(SingleGammaFixed));
-                      }
-@@ -965,7 +1052,8 @@
-                      NewGamma = cmsAllocGamma(Count);
-                      if (!NewGamma) return NULL;
- 
--                     Icc -> Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc);
-+                     if (Icc -> Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc) != Count)
-+                         return NULL;
- 
-                      AdjustEndianessArray16(NewGamma -> GammaTable, Count);
- 
-@@ -992,8 +1080,8 @@
-            int i;
- 
- 
--           Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc);
--           Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc);
-+           if (Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc) != 1) return NULL;
-+           if (Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc) != 1) return NULL;
- 
-            AdjustEndianess16((LPBYTE) &Type);
-            if (Type > 5) {
-@@ -1006,7 +1094,7 @@
-           n = ParamsByType[Type];
- 
-           for (i=0; i < n; i++) {
--                Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
-+                if (Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc) != 1) return NULL;
-                 Params[i] = Convert15Fixed16(Num);
-           }
- 
-@@ -1028,7 +1116,7 @@
- // V4 stuff. Read matrix for LutAtoB and LutBtoA
- 
- static
--BOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD dwFlags)
-+LCMSBOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD dwFlags)
- {
- 
-     icS15Fixed16Number All[12];
-@@ -1038,7 +1126,8 @@
- 
-     if (Icc -> Seek(Icc, Offset)) return FALSE;
- 
--    Icc ->Read(All, sizeof(icS15Fixed16Number), 12, Icc);
-+    if (Icc ->Read(All, sizeof(icS15Fixed16Number), 12, Icc) != 12) 
-+        return FALSE;
- 
-     for (i=0; i < 12;  i++)
-               AdjustEndianess32((LPBYTE) &All[i]);
-@@ -1067,17 +1156,26 @@
- //  V4 stuff. Read CLUT part for LutAtoB and LutBtoA
- 
- static
--BOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT)
-+LCMSBOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT)
- {
--
-+    unsigned int j;
-     icCLutStruct CLUT;
- 
-     if (Icc -> Seek(Icc, Offset)) return FALSE;
--    Icc ->Read(&CLUT, sizeof(icCLutStruct), 1, Icc);
-+    if (Icc ->Read(&CLUT, sizeof(icCLutStruct), 1, Icc) != 1) return FALSE;
- 
- 
--    cmsAlloc3DGrid(NewLUT, CLUT.gridPoints[0], NewLUT ->InputChan,
--                                               NewLUT ->OutputChan);
-+    for (j=1; j < NewLUT ->InputChan; j++) {
-+        if (CLUT.gridPoints[0] != CLUT.gridPoints[j]) {
-+            cmsSignalError(LCMS_ERRC_ABORTED, "CLUT with different granulatity is currently unsupported."); 
-+            return FALSE;
-+        }
-+
-+                
-+    }
-+
-+    if (cmsAlloc3DGrid(NewLUT, CLUT.gridPoints[0], NewLUT ->InputChan, 
-+                                               NewLUT ->OutputChan) == NULL) return FALSE;
- 
-     // Precission can be 1 or 2 bytes
- 
-@@ -1087,7 +1185,7 @@
-         unsigned int i;
- 
-         for (i=0; i < NewLUT->Tsize / sizeof(WORD); i++) {
--                Icc ->Read(&v, sizeof(BYTE), 1, Icc);
-+                if (Icc ->Read(&v, sizeof(BYTE), 1, Icc) != 1) return FALSE;
-                 NewLUT->T[i] = TO16_TAB(v);
-         }
- 
-@@ -1095,9 +1193,9 @@
-     else
-         if (CLUT.prec == 2) {
- 
--         Icc ->Read(NewLUT ->T, sizeof(WORD),
--                    NewLUT->Tsize / sizeof(WORD), Icc);
-+         size_t n = NewLUT->Tsize / sizeof(WORD);
- 
-+         if (Icc ->Read(NewLUT ->T, sizeof(WORD), n, Icc) != n) return FALSE;
-         AdjustEndianessArray16(NewLUT ->T, NewLUT->Tsize / sizeof(WORD));
-     }
-     else {
-@@ -1110,6 +1208,22 @@
- 
- 
- static
-+void ResampleCurves(LPGAMMATABLE Curves[], int nCurves)
-+{
-+    int i;
-+    LPSAMPLEDCURVE sc;
-+
-+    for (i=0; i < nCurves; i++) {
-+        sc = cmsConvertGammaToSampledCurve(Curves[i], 4096);
-+        cmsFreeGamma(Curves[i]);
-+        Curves[i] = cmsConvertSampledCurveToGamma(sc, 0xFFFF);
-+        cmsFreeSampledCurve(sc);
-+    }
-+
-+}
-+
-+
-+static
- void SkipAlignment(LPLCMSICCPROFILE Icc)
- {
-     BYTE Buffer[4];
-@@ -1121,7 +1235,7 @@
- 
- // Read a set of curves from specific offset
- static
--BOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLocation)
-+LCMSBOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLocation)
- {
-     LPGAMMATABLE Curves[MAXCHANNELS];
-     unsigned int i, nCurves;
-@@ -1134,11 +1248,22 @@
-     else
-         nCurves = NewLUT ->OutputChan;
- 
-+    ZeroMemory(Curves, sizeof(Curves));
-     for (i=0; i < nCurves; i++) {
- 
-         Curves[i] = ReadCurve(Icc);
-+        if (Curves[i] == NULL) goto Error;
-         SkipAlignment(Icc);
-+    }
- 
-+    // March-26'08: some V4 profiles may have different sampling
-+    // rates, in this case resample all curves to maximum
-+
-+    for (i=1; i < nCurves; i++) {
-+        if (Curves[i]->nEntries != Curves[0]->nEntries) {
-+            ResampleCurves(Curves, nCurves);
-+        break;
-+        }
-     }
- 
-     NewLUT = cmsAllocLinearTable(NewLUT, Curves, nLocation);
-@@ -1148,6 +1273,16 @@
- 
-     return TRUE;
- 
-+Error:
-+    for (i=0; i < nCurves; i++) {
-+
-+        if (Curves[i]) 
-+            cmsFreeGamma(Curves[i]);
-+    }
-+
-+    return FALSE;
-+
-+
- }
- 
- // V4 stuff. LutAtoB type
-@@ -1160,15 +1295,22 @@
- //   L2 = B curves
- 
- static
--BOOL ReadLUT_A2B(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig)
-+LCMSBOOL ReadLUT_A2B(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig)
- {
-     icLutAtoB LUT16;
- 
--       Icc ->Read(&LUT16, sizeof(icLutAtoB), 1, Icc);
-+       if (Icc ->Read(&LUT16, sizeof(icLutAtoB), 1, Icc) != 1) return FALSE;
- 
-        NewLUT -> InputChan     = LUT16.inputChan;
-        NewLUT -> OutputChan    = LUT16.outputChan;
- 
-+       // Validate the NewLUT here to avoid excessive number of channels
-+       // (leading to stack-based buffer overflow in ReadSetOfCurves).
-+       // Needs revalidation after table size is filled in.
-+       if (!_cmsValidateLUT(NewLUT)) {
-+           return FALSE;
-+       }
-+
-        AdjustEndianess32((LPBYTE) &LUT16.offsetB);
-        AdjustEndianess32((LPBYTE) &LUT16.offsetMat);
-        AdjustEndianess32((LPBYTE) &LUT16.offsetM);
-@@ -1220,15 +1362,22 @@
- // V4 stuff. LutBtoA type
- 
- static
--BOOL ReadLUT_B2A(LPLCMSICCPROFILE Icc, LPLUT NewLUT,  size_t BaseOffset, icTagSignature sig)
-+LCMSBOOL ReadLUT_B2A(LPLCMSICCPROFILE Icc, LPLUT NewLUT,  size_t BaseOffset, icTagSignature sig)
- {
-   icLutBtoA LUT16;
- 
--       Icc ->Read(&LUT16, sizeof(icLutBtoA), 1, Icc);
-+       if (Icc ->Read(&LUT16, sizeof(icLutBtoA), 1, Icc) != 1) return FALSE;
- 
-        NewLUT -> InputChan     = LUT16.inputChan;
-        NewLUT -> OutputChan    = LUT16.outputChan;
- 
-+       // Validate the NewLUT here to avoid excessive number of channels
-+       // (leading to stack-based buffer overflow in ReadSetOfCurves).
-+       // Needs revalidation after table size is filled in.
-+       if (!_cmsValidateLUT(NewLUT)) {
-+           return FALSE;
-+       }
-+
-        AdjustEndianess32((LPBYTE) &LUT16.offsetB);
-        AdjustEndianess32((LPBYTE) &LUT16.offsetMat);
-        AdjustEndianess32((LPBYTE) &LUT16.offsetM);
-@@ -1294,7 +1443,7 @@
- 
- 
-     // If is in memory, the LUT is already there, so throw a copy
--    if (!Icc -> stream) {
-+    if (Icc -> TagPtrs[n]) {
- 
-         return cmsDupLUT((LPLUT) Icc ->TagPtrs[n]);
-     }
-@@ -1308,8 +1457,8 @@
- 
- 
-     NewLUT = cmsAllocLUT();
--    if (!NewLUT)
--    {
-+    if (!NewLUT) {
-+
-        cmsSignalError(LCMS_ERRC_ABORTED, "cmsAllocLUT() failed");
-        return NULL;
-     }
-@@ -1317,11 +1466,29 @@
- 
-     switch (BaseType) {
- 
--    case icSigLut8Type:    ReadLUT8(Icc, NewLUT, sig); break;
--    case icSigLut16Type:   ReadLUT16(Icc, NewLUT);     break;
--
--    case icSiglutAtoBType: ReadLUT_A2B(Icc, NewLUT, offset, sig); break;
--    case icSiglutBtoAType: ReadLUT_B2A(Icc, NewLUT, offset, sig); break;
-+    case icSigLut8Type:    if (!ReadLUT8(Icc, NewLUT, sig)) {
-+                                cmsFreeLUT(NewLUT);
-+                                return NULL;
-+                           }
-+                           break;
-+
-+    case icSigLut16Type:   if (!ReadLUT16(Icc, NewLUT)) {
-+                                cmsFreeLUT(NewLUT);
-+                                return NULL;
-+                           }
-+                           break;
-+
-+    case icSiglutAtoBType: if (!ReadLUT_A2B(Icc, NewLUT, offset, sig)) {
-+                                cmsFreeLUT(NewLUT);
-+                                return NULL;
-+                           }
-+                           break;
-+
-+    case icSiglutBtoAType: if (!ReadLUT_B2A(Icc, NewLUT, offset, sig)) {
-+                                cmsFreeLUT(NewLUT);
-+                                return NULL;
-+                           }
-+                           break;
- 
-     default:  cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature %lx found.", BaseType);
-               cmsFreeLUT(NewLUT);
-@@ -1335,16 +1502,23 @@
- 
- // Sets the language & country preferences. Used only in ICC 4.0 profiles
- 
--void LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode)
-+void LCMSEXPORT cmsSetLanguage(const char LanguageCode[4], const char CountryCode[4])
- {
--    GlobalLanguageCode = LanguageCode;
--    GlobalCountryCode  = CountryCode;
-+
-+    int LanguageCodeInt = *(int *) LanguageCode;
-+    int CountryCodeInt  = *(int *) CountryCode;
-+    
-+    AdjustEndianess32((LPBYTE) &LanguageCodeInt);
-+    AdjustEndianess32((LPBYTE) &CountryCodeInt);
-+
-+    GlobalLanguageCode = LanguageCodeInt;
-+    GlobalCountryCode  = CountryCodeInt;
- }
- 
- 
- 
- // Some tags (e.g, 'pseq') can have text tags embedded. This function
--// handles such special case.
-+// handles such special case. Returns -1 on error, or the number of bytes left on success. 
- 
- static
- int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name, size_t size_max)
-@@ -1365,7 +1539,7 @@
-            icUInt16Number  ScriptCodeCode, Dummy;
-            icUInt8Number   ScriptCodeCount;
- 
--           Icc ->Read(&AsciiCount, sizeof(icUInt32Number), 1, Icc);
-+           if (Icc ->Read(&AsciiCount, sizeof(icUInt32Number), 1, Icc) != 1) return -1;
- 
-                    if (size < sizeof(icUInt32Number)) return (int) size;
-            size -= sizeof(icUInt32Number);
-@@ -1379,11 +1553,11 @@
- 
-            // Skip Unicode code
- 
--           Icc ->Read(&UnicodeCode,  sizeof(icUInt32Number), 1, Icc);
-+           if (Icc ->Read(&UnicodeCode,  sizeof(icUInt32Number), 1, Icc) != 1) return -1;
-                    if (size < sizeof(icUInt32Number)) return (int) size;
-            size -= sizeof(icUInt32Number);
- 
--           Icc ->Read(&UnicodeCount, sizeof(icUInt32Number), 1, Icc);
-+           if (Icc ->Read(&UnicodeCount, sizeof(icUInt32Number), 1, Icc) != 1) return -1;
-                    if (size < sizeof(icUInt32Number)) return (int) size;
-            size -= sizeof(icUInt32Number);
- 
-@@ -1391,24 +1565,28 @@
- 
-            if (UnicodeCount > size) return (int) size;
- 
--           for (i=0; i < UnicodeCount; i++)
--                Icc ->Read(&Dummy, sizeof(icUInt16Number), 1, Icc);
--
--           size -= UnicodeCount * sizeof(icUInt16Number);
-+           for (i=0; i < UnicodeCount; i++) { 
-+                size_t nread = Icc ->Read(&Dummy, sizeof(icUInt16Number), 1, Icc);
-+                if (nread != 1) return (int) size;
-+                size -= sizeof(icUInt16Number);
-+           }
- 
-           // Skip ScriptCode code
- 
--           Icc ->Read(&ScriptCodeCode,  sizeof(icUInt16Number), 1, Icc);
-+           if (Icc ->Read(&ScriptCodeCode,  sizeof(icUInt16Number), 1, Icc) != 1) return -1;
-            size -= sizeof(icUInt16Number);
--           Icc ->Read(&ScriptCodeCount, sizeof(icUInt8Number), 1, Icc);
-+           if (Icc ->Read(&ScriptCodeCount, sizeof(icUInt8Number), 1, Icc) != 1) return -1;
-            size -= sizeof(icUInt8Number);
- 
--           if (size < 67) return (int) size;
-+           // Should remain 67 bytes as filler
- 
--           for (i=0; i < 67; i++)
--                Icc ->Read(&Dummy, sizeof(icUInt8Number), 1, Icc);
-+           if (size < 67) return (int) size;
- 
--           size -= 67;
-+           for (i=0; i < 67; i++) {
-+                size_t nread = Icc ->Read(&Dummy, sizeof(icUInt8Number), 1, Icc);
-+                if (nread != 1) return (int) size;
-+                size --;
-+               }           
-            }
-            break;
- 
-@@ -1425,7 +1603,7 @@
-              size = size_max - 1;
-          }
- 
--         Icc -> Read(Name, 1, size, Icc);
-+         if (Icc -> Read(Name, 1, size, Icc) != size) return -1;
- 
-          for (i=0; i < Missing; i++)
-              Icc -> Read(&Dummy, 1, 1, Icc);
-@@ -1445,9 +1623,9 @@
-         wchar_t*       wchar  = L"";
- 
- 
--            Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
-+            if (Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return -1;
-             AdjustEndianess32((LPBYTE) &Count);
--            Icc ->Read(&RecLen, sizeof(icUInt32Number), 1, Icc);
-+            if (Icc ->Read(&RecLen, sizeof(icUInt32Number), 1, Icc) != 1) return -1;
-             AdjustEndianess32((LPBYTE) &RecLen);
- 
-             if (RecLen != 12) {
-@@ -1458,15 +1636,15 @@
- 
-             for (i=0; i < Count; i++) {
- 
--                Icc ->Read(&Language, sizeof(icUInt16Number), 1, Icc);
-+                if (Icc ->Read(&Language, sizeof(icUInt16Number), 1, Icc) != 1) return -1;
-                 AdjustEndianess16((LPBYTE) &Language);
--                Icc ->Read(&Country, sizeof(icUInt16Number), 1, Icc);
-+                if (Icc ->Read(&Country, sizeof(icUInt16Number), 1, Icc) != 1) return -1;
-                 AdjustEndianess16((LPBYTE) &Country);
- 
--                Icc ->Read(&ThisLen, sizeof(icUInt32Number), 1, Icc);
-+                if (Icc ->Read(&ThisLen, sizeof(icUInt32Number), 1, Icc) != 1) return -1;
-                 AdjustEndianess32((LPBYTE) &ThisLen);
- 
--                Icc ->Read(&ThisOffset, sizeof(icUInt32Number), 1, Icc);
-+                if (Icc ->Read(&ThisOffset, sizeof(icUInt32Number), 1, Icc) != 1) return -1;
-                 AdjustEndianess32((LPBYTE) &ThisOffset);
- 
-                 if (Language == GlobalLanguageCode || Offset == 0) {
-@@ -1492,14 +1670,20 @@
-             for (i=0; i < Offset; i++) {
- 
-                     char Discard;
--
-+                    // No return checking; could lead to large loop in
-+                    // combination with int oflow above computing Offset.
-                     Icc ->Read(&Discard, 1, 1, Icc);
-             }
- 
--            wchar = (wchar_t*) malloc(Len+2);
-+
-+            // Bound len
-+            if (Len < 0) Len = 0;
-+            if (Len > 20*1024) Len = 20 * 1024; 
-+
-+            wchar = (wchar_t*) _cmsMalloc(Len*sizeof(wchar_t)+2);
-             if (!wchar) return -1;
- 
--            Icc ->Read(wchar, 1, Len, Icc);
-+            if (Icc ->Read(wchar, 1, Len, Icc) != Len) return -1;
-             AdjustEndianessArray16((LPWORD) wchar, Len / 2);
- 
-             wchar[Len / 2] = L'\0';
-@@ -1509,7 +1693,7 @@
-                 Name[0] = 0;    // Error
-             }
- 
--            free((void*) wchar);
-+            _cmsFree((void*) wchar);
-             }
-             break;
- 
-@@ -1535,7 +1719,7 @@
-     if (n < 0)
-         return -1;
- 
--    if (!Icc -> stream) {
-+    if (Icc -> TagPtrs[n]) {
- 
-         CopyMemory(Name, Icc -> TagPtrs[n], Icc -> TagSizes[n]);
-         return (int) Icc -> TagSizes[n];
-@@ -1561,7 +1745,7 @@
- // Take an XYZ item
- 
- static
--int ReadICCXYZ(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIEXYZ Value, BOOL lIsFatal)
-+int ReadICCXYZ(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIEXYZ Value, LCMSBOOL lIsFatal)
- {
-     LPLCMSICCPROFILE    Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-     icTagTypeSignature  BaseType;
-@@ -1573,7 +1757,7 @@
-     if (n < 0)
-             return -1;
- 
--    if (!Icc -> stream) {
-+    if (Icc -> TagPtrs[n]) {
- 
-          CopyMemory(Value, Icc -> TagPtrs[n], Icc -> TagSizes[n]);
-          return (int) Icc -> TagSizes[n];
-@@ -1628,7 +1812,7 @@
-     if (n < 0)
-             return -1; // Not found
- 
--    if (!Icc -> stream) {
-+    if (Icc -> TagPtrs[n]) {
- 
-             CopyMemory(v, Icc -> TagPtrs[n], Icc -> TagSizes[n]);
-             return (int) Icc -> TagSizes[n];
-@@ -1677,7 +1861,7 @@
- 
- // Primaries are to be in xyY notation
- 
--BOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile)
-+LCMSBOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile)
- {
-        if (ReadICCXYZ(hProfile, icSigRedColorantTag, &Dest -> Red, TRUE) < 0) return FALSE;
-        if (ReadICCXYZ(hProfile, icSigGreenColorantTag, &Dest -> Green, TRUE) < 0) return FALSE;
-@@ -1687,7 +1871,7 @@
- }
- 
- 
--BOOL cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile)
-+LCMSBOOL cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile)
- {
-        cmsCIEXYZTRIPLE Primaries;
- 
-@@ -1704,7 +1888,7 @@
- 
- // Always return a suitable matrix
- 
--BOOL cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile)
-+LCMSBOOL cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile)
- {
- 
-     if (ReadICCXYZArray(hProfile, icSigChromaticAdaptationTag, r) < 0) {
-@@ -1741,7 +1925,7 @@
-        if (n < 0)
-            return NULL;
- 
--       if (!Icc -> stream) {
-+       if (Icc -> TagPtrs[n]) {
- 
-             return cmsDupGamma((LPGAMMATABLE) Icc -> TagPtrs[n]);
-        }
-@@ -1769,7 +1953,7 @@
-        if (n < 0)
-             return NULL;
- 
--       if (!Icc -> stream) {
-+       if (Icc -> TagPtrs[n]) {
- 
-             return cmsReverseGamma(256, (LPGAMMATABLE) Icc -> TagPtrs[n]);
-        }
-@@ -1785,7 +1969,7 @@
- // Check Named color header
- 
- static
--BOOL CheckHeader(LPcmsNAMEDCOLORLIST v, icNamedColor2* nc2)
-+LCMSBOOL CheckHeader(LPcmsNAMEDCOLORLIST v, icNamedColor2* nc2)
- {
-     if (v ->Prefix[0] == 0 && v ->Suffix[0] == 0 && v ->ColorantCount == 0) return TRUE;
- 
-@@ -1809,13 +1993,13 @@
-        if (n < 0)
-             return 0;
- 
--       if (!Icc -> stream) {
-+       if (Icc -> TagPtrs[n]) {
- 
-             // This replaces actual named color list.
-             size_t size   = Icc -> TagSizes[n];
- 
-             if (v ->NamedColorList) cmsFreeNamedColorList(v ->NamedColorList);
--            v -> NamedColorList = (LPcmsNAMEDCOLORLIST) malloc(size);
-+            v -> NamedColorList = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size);           
-             CopyMemory(v -> NamedColorList, Icc ->TagPtrs[n], size);
-             return v ->NamedColorList->nColors;
-        }
-@@ -1844,7 +2028,7 @@
-                 icNamedColor2 nc2;
-                 unsigned int i, j;
- 
--                Icc -> Read(&nc2, sizeof(icNamedColor2) - SIZEOF_UINT8_ALIGNED, 1, Icc);
-+                if (Icc -> Read(&nc2, sizeof(icNamedColor2) - SIZEOF_UINT8_ALIGNED, 1, Icc) != 1) return 0;
-                 AdjustEndianess32((LPBYTE) &nc2.vendorFlag);
-                 AdjustEndianess32((LPBYTE) &nc2.count);
-                 AdjustEndianess32((LPBYTE) &nc2.nDeviceCoords);
-@@ -1854,6 +2038,11 @@
-                      return 0;
-                 }
- 
-+                if (nc2.nDeviceCoords > MAXCHANNELS) {
-+                          cmsSignalError(LCMS_ERRC_WARNING, "Too many device coordinates.");
-+                          return 0;
-+                }
-+
-                 strncpy(v ->NamedColorList->Prefix, (const char*) nc2.prefix, 32);
-                 strncpy(v ->NamedColorList->Suffix, (const char*) nc2.suffix, 32);
-                 v ->NamedColorList->Prefix[32] = v->NamedColorList->Suffix[32] = 0;
-@@ -1867,6 +2056,8 @@
-                     char Root[33];
- 
-                     ZeroMemory(Colorant, sizeof(WORD) * MAXCHANNELS);
-+                    // No return value checking; could cause trouble with
-+                    // large count.
-                     Icc -> Read(Root, 1, 32, Icc);
-                     Icc -> Read(PCS,  3, sizeof(WORD), Icc);
- 
-@@ -1900,7 +2091,8 @@
- 
- LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile, icTagSignature sig)
- {
--    icInt32Number n, Count, i;
-+    icInt32Number n;
-+    icUInt32Number Count, i; 
-     size_t offset;
-     icTagTypeSignature  BaseType;
-     LPLCMSICCPROFILE   Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-@@ -1910,10 +2102,12 @@
-     if (n < 0)
-             return NULL; // Not found
- 
--    if (!Icc -> stream) {
-+    if (Icc -> TagPtrs[n]) {
- 
-             size_t size   = Icc -> TagSizes[n];
--            void* v = malloc(size);
-+            void* v = _cmsMalloc(size);
-+            
-+            if (v == NULL) return NULL;
-             CopyMemory(v, Icc -> TagPtrs[n], size);
-             return (LPcmsNAMEDCOLORLIST) v;
-     }
-@@ -1932,9 +2126,14 @@
-     }
- 
- 
--    Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
-+    if (Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc) != 1) return NULL;
-     AdjustEndianess32((LPBYTE) &Count);
- 
-+    if (Count > MAXCHANNELS) {
-+        cmsSignalError(LCMS_ERRC_ABORTED, "Too many colorants '%lx'", Count);
-+        return NULL;
-+    }
-+
-     List = cmsAllocNamedColorList(Count);
-     for (i=0; i < Count; i++) {
- 
-@@ -1965,7 +2164,7 @@
- 
-        if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) {
- 
--            cmsReadICCText(hProfile, icSigDeviceMfgDescTag, Manufacturer);
-+            cmsReadICCTextEx(hProfile, icSigDeviceMfgDescTag, Manufacturer, LCMS_DESC_MAX);
-        }
- 
-     return Manufacturer;
-@@ -1982,7 +2181,7 @@
- 
-        if (cmsIsTag(hProfile, icSigDeviceModelDescTag)) {
- 
--            cmsReadICCText(hProfile, icSigDeviceModelDescTag, Model);
-+            cmsReadICCTextEx(hProfile, icSigDeviceModelDescTag, Model, LCMS_DESC_MAX);
-        }
- 
-     return Model;
-@@ -1995,10 +2194,9 @@
-     static char Copyright[LCMS_DESC_MAX] = "";
- 
-        Copyright[0] = 0;
--
-        if (cmsIsTag(hProfile, icSigCopyrightTag)) {
- 
--            cmsReadICCText(hProfile, icSigCopyrightTag, Copyright);
-+            cmsReadICCTextEx(hProfile, icSigCopyrightTag, Copyright, LCMS_DESC_MAX);
-        }
- 
-     return Copyright;
-@@ -2009,7 +2207,7 @@
- 
- const char*  LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile)
- {
--    static char Name[2048];
-+    static char Name[LCMS_DESC_MAX*2+4];
-     char Manufacturer[LCMS_DESC_MAX], Model[LCMS_DESC_MAX];
- 
-     Name[0] = '\0';
-@@ -2017,19 +2215,19 @@
- 
-     if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) {
- 
--        cmsReadICCText(hProfile, icSigDeviceMfgDescTag, Manufacturer);
-+        cmsReadICCTextEx(hProfile, icSigDeviceMfgDescTag, Manufacturer, LCMS_DESC_MAX);
-     }
- 
-     if (cmsIsTag(hProfile, icSigDeviceModelDescTag)) {
- 
--        cmsReadICCText(hProfile, icSigDeviceModelDescTag, Model);
-+        cmsReadICCTextEx(hProfile, icSigDeviceModelDescTag, Model, LCMS_DESC_MAX);
-     }
- 
-     if (!Manufacturer[0] && !Model[0]) {
- 
-         if (cmsIsTag(hProfile, icSigProfileDescriptionTag)) {
- 
--            cmsReadICCText(hProfile, icSigProfileDescriptionTag, Name);
-+            cmsReadICCTextEx(hProfile, icSigProfileDescriptionTag, Name, LCMS_DESC_MAX);
-             return Name;
-         }
-         else return "{no name}";
-@@ -2129,7 +2327,7 @@
- 
- // Extract the target data as a big string. Does not signal if tag is not present.
- 
--BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len)
-+LCMSBOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len)
- {
-     LPLCMSICCPROFILE  Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-     int n;
-@@ -2142,7 +2340,11 @@
- 
- 
-     *len =  Icc -> TagSizes[n];
--    *Data = (char*) malloc(*len + 1);  // Plus zero marker
-+
-+    // Make sure that is reasonable (600K)
-+    if (*len > 600*1024) *len = 600*1024;
-+
-+    *Data = (char*) _cmsMalloc(*len + 1);  // Plus zero marker
- 
-     if (!*Data) {
- 
-@@ -2162,7 +2364,7 @@
- 
- 
- 
--BOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
-+LCMSBOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
- {
-     LPLCMSICCPROFILE  Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-     int n;
-@@ -2170,8 +2372,8 @@
-     n = _cmsSearchTag(Icc, icSigCalibrationDateTimeTag, FALSE);
-     if (n < 0) return FALSE;
- 
--    if (!Icc ->stream)
--    {
-+    if (Icc ->TagPtrs[n]) {
-+
-         CopyMemory(Dest, Icc ->TagPtrs[n],  sizeof(struct tm));
-     }
-     else
-@@ -2212,9 +2414,10 @@
-     size   = Icc -> TagSizes[n];
-     if (size < 12)  return NULL;
- 
--    if (!Icc -> stream) {
-+    if (Icc -> TagPtrs[n]) {
- 
--            OutSeq = (LPcmsSEQ) malloc(size);
-+            OutSeq = (LPcmsSEQ) _cmsMalloc(size);  
-+            if (OutSeq == NULL) return NULL;
-             CopyMemory(OutSeq, Icc ->TagPtrs[n], size);
-             return OutSeq;
-     }
-@@ -2231,8 +2434,13 @@
-     Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
-     AdjustEndianess32((LPBYTE) &Count);
- 
-+    if (Count > 1000) {
-+         return NULL;
-+    }
-+ 
-     size = sizeof(int) + Count * sizeof(cmsPSEQDESC);
--    OutSeq = (LPcmsSEQ) malloc(size);
-+    OutSeq = (LPcmsSEQ) _cmsMalloc(size);
-+    if (OutSeq == NULL) return NULL;
- 
-     OutSeq ->n = Count;
- 
-@@ -2268,181 +2476,11 @@
- void LCMSEXPORT cmsFreeProfileSequenceDescription(LPcmsSEQ pseq)
- {
-     if (pseq)
--        free(pseq);
--}
--
--
--
--// Extended gamut -- an HP extension
--
--
--LPcmsGAMUTEX LCMSEXPORT cmsReadExtendedGamut(cmsHPROFILE hProfile, int index)
--{
--    LPLCMSICCPROFILE  Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
--    size_t size, offset;
--    icUInt32Number off_samp, off_desc, off_vc;
--    int n;
--    icTagTypeSignature     BaseType;
--    icColorSpaceSignature  CoordSig;
--    icUInt16Number         Method, Usage;
--    icUInt32Number         GamutCount, SamplesCount;
--    LPcmsGAMUTEX gex;
--    size_t                 Offsets[256];
--    size_t                 i, Actual, Loc;
--    icS15Fixed16Number     Num;
--    icUInt16Number         Surround;
--
--
--    n = _cmsSearchTag(Icc, icSigHPGamutDescTag, FALSE);
--    if (n < 0) return NULL;
--
--    if (!Icc ->stream) return NULL;     // In memory is not supported
--
--    // Read the header
--
--    offset = Icc -> TagOffsets[n];
--
--    if (Icc -> Seek(Icc, offset))
--            return NULL;
--
--    // Here is the beginning of tag
--    Actual   = Icc ->Tell(Icc);
--
--
--    BaseType = ReadBase(Icc);
--
--    if (BaseType != icSigHPGamutDescType) {
--            cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature '%lx' found.", BaseType);
--            return NULL;
--    }
--
--
--    // Read the gamut descriptors count
--    Icc ->Read(&GamutCount, sizeof(icUInt32Number), 1, Icc);
--    AdjustEndianess32((LPBYTE) &GamutCount);
--
--
--    if (GamutCount >= 256) {
--            cmsSignalError(LCMS_ERRC_ABORTED, "Too many gamut structures '%d'.", GamutCount);
--            return NULL;
--    }
--
--    // Read the directory
--
--    for (i=0; i < GamutCount; i++) {
--
--        Icc ->Read(&Offsets[i], sizeof(icUInt32Number), 1, Icc);
--        AdjustEndianess32((LPBYTE) &Offsets[i]);
--    }
--
--
--    // Is there such element?
--    if (index >= (int) GamutCount) return NULL;
--    Loc = Actual + Offsets[index];
--
--
--    // Go to specified index
--    if (Icc -> Seek(Icc, Loc))
--            return NULL;
--
--
--    // Read all members
--    Icc ->Read(&CoordSig, sizeof(icColorSpaceSignature), 1, Icc);
--    AdjustEndianess32((LPBYTE) &CoordSig);
--
--    Icc ->Read(&Method, sizeof(icUInt16Number), 1, Icc);
--    AdjustEndianess16((LPBYTE) &Method);
--
--    Icc ->Read(&Usage, sizeof(icUInt16Number), 1, Icc);
--    AdjustEndianess16((LPBYTE) &Usage);
--
--    Icc ->Read(&SamplesCount, sizeof(icUInt32Number), 1, Icc);
--    AdjustEndianess32((LPBYTE) &SamplesCount);
--
--    Icc ->Read(&off_samp, sizeof(icUInt32Number), 1, Icc);
--    AdjustEndianess32((LPBYTE) &off_samp);
--
--    Icc ->Read(&off_desc, sizeof(icUInt32Number), 1, Icc);
--    AdjustEndianess32((LPBYTE) &off_desc);
--
--    Icc ->Read(&off_vc, sizeof(icUInt32Number), 1, Icc);
--    AdjustEndianess32((LPBYTE) &off_vc);
--
--
--    size = sizeof(cmsGAMUTEX) + (SamplesCount - 1) * sizeof(double);
--
--    gex = (LPcmsGAMUTEX) malloc(size);
--        if (gex == NULL) return NULL;
--
--
--    gex ->CoordSig = CoordSig;
--    gex ->Method   = Method;
--    gex ->Usage    = Usage;
--        gex ->Count    = SamplesCount;
--
--
--    // Read data
--    if (Icc -> Seek(Icc, Loc + off_samp))
--            return NULL;
--
--    for (i=0; i < SamplesCount; i++) {
--                Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
--                gex ->Data[i] = Convert15Fixed16(Num);
--    }
--
--
--    // Read mluc
--    if (Icc -> Seek(Icc, Loc + off_desc)) {
--
--                        free(gex);
--            return NULL;
--        }
--
--    ReadEmbeddedTextTag(Icc, 256, gex ->Description, LCMS_DESC_MAX);
--
--
--    // Read viewing conditions
--    if (Icc -> Seek(Icc, Loc + off_vc)) {
--                        free(gex);
--            return NULL;
--        }
--
--
--    Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
--    gex ->Vc.whitePoint.X = Convert15Fixed16(Num);
--
--    Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
--    gex ->Vc.whitePoint.Y = Convert15Fixed16(Num);
--
--    Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
--    gex ->Vc.whitePoint.Z = Convert15Fixed16(Num);
--
--    Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
--    gex ->Vc.La = Convert15Fixed16(Num);
--
--    Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
--    gex ->Vc.Yb = Convert15Fixed16(Num);
--
--    Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
--    gex ->Vc.D_value = Convert15Fixed16(Num);
--
--    Icc -> Read(&Surround, sizeof(icUInt16Number), 1, Icc);
--    AdjustEndianess16((LPBYTE) &Surround);
--    gex ->Vc.surround = Surround;
--
--
--    // All OK
--    return gex;
--
-+        _cmsFree(pseq);
- }
- 
- 
- 
--void LCMSEXPORT cmsFreeExtendedGamut(LPcmsGAMUTEX gex)
--{
--    if (gex)
--        free(gex);
--}
- 
- 
- // Read a few tags that are hardly required
-@@ -2564,6 +2602,7 @@
-            NewIcc = (LPLCMSICCPROFILE) (LPSTR) hEmpty;
-            NewIcc -> IsWrite = TRUE;
-            strncpy(NewIcc ->PhysicalFile, lpFileName, MAX_PATH-1);
-+           NewIcc ->PhysicalFile[MAX_PATH-1] = 0;
- 
-            // Save LUT as 8 bit
- 
-@@ -2579,7 +2618,7 @@
-        NewIcc = _cmsCreateProfileFromFilePlaceholder(lpFileName);
-         if (!NewIcc) return NULL;
- 
--       if (!ReadHeader(NewIcc, FALSE)) return NULL;
-+       if (!ReadHeader(NewIcc, FALSE, 0)) return NULL;
- 
-        ReadCriticalTags(NewIcc);
- 
-@@ -2599,7 +2638,7 @@
-        NewIcc = _cmsCreateProfileFromMemPlaceholder(MemPtr, dwSize);
-        if (!NewIcc) return NULL;
- 
--       if (!ReadHeader(NewIcc, TRUE)) return NULL;
-+       if (!ReadHeader(NewIcc, TRUE, dwSize)) return NULL;
- 
-        ReadCriticalTags(NewIcc);
- 
-@@ -2609,10 +2648,11 @@
- 
- 
- 
--BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)
-+LCMSBOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)
- {
-        LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
--       BOOL rc = TRUE;
-+       LCMSBOOL rc = TRUE;
-+       icInt32Number i;         
- 
-        if (!Icc) return FALSE;
- 
-@@ -2624,21 +2664,15 @@
-            rc = _cmsSaveProfile(hProfile, Icc ->PhysicalFile);
-        }
- 
--
--       if (Icc -> stream == NULL) {     // Was a memory (i.e. not serialized) profile?
--
--
--              icInt32Number i;          // Yes, free tags
--
-               for (i=0; i < Icc -> TagCount; i++) {
- 
-                   if (Icc -> TagPtrs[i])
-                             free(Icc -> TagPtrs[i]);
-               }
- 
-+       if (Icc -> stream != NULL) {     // Was a memory (i.e. not serialized) profile?
-+                 Icc -> Close(Icc);     // No, close the stream      
-        }
--       else   Icc -> Close(Icc);    // No, close the stream
--
- 
-        free(Icc);   // Free placeholder memory
- 
-@@ -2652,11 +2686,11 @@
- 
- 
- static
--BOOL SaveWordsTable(int nEntries, LPWORD Tab, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveWordsTable(int nEntries, LPWORD Tab, LPLCMSICCPROFILE Icc)
- {
-    size_t nTabSize = sizeof(WORD) * nEntries;
--   LPWORD PtrW = (LPWORD) malloc(nTabSize);
--   BOOL rc;
-+   LPWORD PtrW = (LPWORD) _cmsMalloc(nTabSize);
-+   LCMSBOOL rc;
- 
-    if (!PtrW) return FALSE;
-    CopyMemory(PtrW, Tab, nTabSize);
-@@ -2672,7 +2706,7 @@
- // Saves profile header
- 
- static
--BOOL SaveHeader(LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveHeader(LPLCMSICCPROFILE Icc)
- {
-   icHeader Header;
-   time_t now = time(NULL);
-@@ -2727,7 +2761,7 @@
- // Setup base marker
- 
- static
--BOOL SetupBase(icTagTypeSignature sig, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SetupBase(icTagTypeSignature sig, LPLCMSICCPROFILE Icc)
- {
-     icTagBase  Base;
- 
-@@ -2737,10 +2771,10 @@
- }
- 
- 
--// Store an XYZ tag
-+// Store a XYZ tag
- 
- static
--BOOL SaveXYZNumber(LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveXYZNumber(LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc)
- {
- 
-     icXYZNumber XYZ;
-@@ -2756,11 +2790,36 @@
- }
- 
- 
-+// Store a XYZ array.
-+
-+static 
-+LCMSBOOL SaveXYZArray(int n, LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc)
-+{
-+    int i;
-+    icXYZNumber XYZ;
-+
-+    if (!SetupBase(icSigS15Fixed16ArrayType, Icc)) return FALSE;
-+
-+    for (i=0; i < n; i++) {
-+
-+        XYZ.X = TransportValue32(DOUBLE_TO_FIXED(Value -> X));
-+        XYZ.Y = TransportValue32(DOUBLE_TO_FIXED(Value -> Y));
-+        XYZ.Z = TransportValue32(DOUBLE_TO_FIXED(Value -> Z));
-+
-+        if (!Icc -> Write(Icc, sizeof(icXYZNumber), &XYZ)) return FALSE;
-+
-+        Value++;
-+    }
-+
-+    return TRUE;
-+}
-+
-+
- 
- // Save a gamma structure as a table
- 
- static
--BOOL SaveGammaTable(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveGammaTable(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
- {
-         icInt32Number Count;
- 
-@@ -2777,7 +2836,7 @@
- // Save a gamma structure as a one-value
- 
- static
--BOOL SaveGammaOneValue(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveGammaOneValue(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
- {
-         icInt32Number Count;
-         Fixed32 GammaFixed32;
-@@ -2798,7 +2857,7 @@
- // Save a gamma structure as a parametric gamma
- 
- static
--BOOL SaveGammaParametric(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveGammaParametric(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
- {
-         icUInt16Number Type, Reserved;
-         int i, nParams;
-@@ -2829,7 +2888,7 @@
- // Save a gamma table
- 
- static
--BOOL SaveGamma(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveGamma(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
- {
-                 // Is the gamma curve type supported by ICC format?
- 
-@@ -2861,7 +2920,7 @@
- // Save an DESC Tag
- 
- static
--BOOL SaveDescription(const char *Text, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveDescription(const char *Text, LPLCMSICCPROFILE Icc)
- {
- 
-     icUInt32Number len, Count, TotalSize, AlignedSize;
-@@ -2893,6 +2952,11 @@
-     if (!Icc ->Write(Icc, len, (LPVOID)Text)) return FALSE;
-     AlignedSize -= len;
- 
-+    if (AlignedSize < 0)
-+            AlignedSize = 0;
-+    if (AlignedSize > 255) 
-+            AlignedSize = 255;
-+
-     ZeroMemory(Filler, AlignedSize);
-     if (!Icc ->Write(Icc, AlignedSize, Filler)) return FALSE;
- 
-@@ -2902,7 +2966,7 @@
- // Save an ASCII Tag
- 
- static
--BOOL SaveText(const char *Text, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveText(const char *Text, LPLCMSICCPROFILE Icc)
- {
-     size_t len = strlen(Text) + 1;
- 
-@@ -2915,7 +2979,7 @@
- // Save one of these new chromaticity values
- 
- static
--BOOL SaveOneChromaticity(double x, double y, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveOneChromaticity(double x, double y, LPLCMSICCPROFILE Icc)
- {
-        Fixed32 xf, yf;
- 
-@@ -2932,7 +2996,7 @@
- // New tag added in Addendum II of old spec.
- 
- static
--BOOL SaveChromaticities(LPcmsCIExyYTRIPLE chrm, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveChromaticities(LPcmsCIExyYTRIPLE chrm, LPLCMSICCPROFILE Icc)
- {
-        WORD nChans, Table;
- 
-@@ -2952,7 +3016,7 @@
- 
- 
- static
--BOOL SaveSequenceDescriptionTag(LPcmsSEQ seq, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveSequenceDescriptionTag(LPcmsSEQ seq, LPLCMSICCPROFILE Icc)
- {
-     icUInt32Number nSeqs;
-     icDescStruct   DescStruct;
-@@ -2989,7 +3053,7 @@
- // Saves a timestamp tag
- 
- static
--BOOL SaveDateTimeNumber(const struct tm *DateTime, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveDateTimeNumber(const struct tm *DateTime, LPLCMSICCPROFILE Icc)
- {
-     icDateTimeNumber Dest;
- 
-@@ -3003,14 +3067,14 @@
- 
- // Saves a named color list into a named color profile
- static
--BOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc)
- {
- 
-     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
-+    char                prefix[32];     // Prefix for each color name 
-+    char                suffix[32];     // Suffix for each color name 
-     int i;
- 
-     if (!SetupBase(icSigNamedColor2Type, Icc)) return FALSE;
-@@ -3022,6 +3086,8 @@
-     strncpy(prefix, (const char*) NamedColorList->Prefix, 32);
-     strncpy(suffix, (const char*) NamedColorList->Suffix, 32);
- 
-+    suffix[31] = prefix[31] = 0;
-+
-     if (!Icc ->Write(Icc, sizeof(icUInt32Number), &vendorFlag)) return FALSE;
-     if (!Icc ->Write(Icc, sizeof(icUInt32Number), &count)) return FALSE;
-     if (!Icc ->Write(Icc, sizeof(icUInt32Number), &nDeviceCoords)) return FALSE;
-@@ -3032,13 +3098,15 @@
- 
-           icUInt16Number PCS[3];
-           icUInt16Number Colorant[MAXCHANNELS];
--          icInt8Number root[32];
-+          char            root[32];
-           LPcmsNAMEDCOLOR Color;
-           int j;
- 
-                     Color = NamedColorList ->List + i;
- 
--                    strncpy((char*) root, Color ->Name, 32);
-+                    strncpy(root, Color ->Name, 32);
-+                    Color ->Name[32] = 0;
-+
-                     if (!Icc ->Write(Icc, 32 , root)) return FALSE;
- 
-                     for (j=0; j < 3; j++)
-@@ -3062,7 +3130,7 @@
- // Saves a colorant table. It is using the named color structure for simplicity sake
- 
- static
--BOOL SaveColorantTable(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveColorantTable(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc)
- {
-      icUInt32Number count;  // Count of named colors
-      int i;
-@@ -3076,13 +3144,15 @@
-      for (i=0; i < NamedColorList ->nColors; i++) {
- 
-       icUInt16Number PCS[3];
--      icInt8Number root[32];
-+      icInt8Number root[33];
-       LPcmsNAMEDCOLOR Color;
-       int j;
- 
-             Color = NamedColorList ->List + i;
- 
-             strncpy((char*) root, Color ->Name, 32);
-+            root[32] = 0;
-+
-             if (!Icc ->Write(Icc, 32 , root)) return FALSE;
- 
-             for (j=0; j < 3; j++)
-@@ -3099,7 +3169,7 @@
- // Does serialization of LUT16 and writes it.
- 
- static
--BOOL SaveLUT(const LUT* NewLUT, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveLUT(const LUT* NewLUT, LPLCMSICCPROFILE Icc)
- {
-        icLut16 LUT16;
-        unsigned int i;
-@@ -3189,7 +3259,7 @@
- // Does serialization of LUT8 and writes it
- 
- static
--BOOL SaveLUT8(const LUT* NewLUT, LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveLUT8(const LUT* NewLUT, LPLCMSICCPROFILE Icc)
- {
-        icLut8 LUT8;
-        unsigned int i, j;
-@@ -3323,7 +3393,7 @@
- // Saves Tag directory
- 
- static
--BOOL SaveTagDirectory(LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveTagDirectory(LPLCMSICCPROFILE Icc)
- {
-        icInt32Number i;
-        icTag Tag;
-@@ -3356,7 +3426,7 @@
- // Dump tag contents
- 
- static
--BOOL SaveTags(LPLCMSICCPROFILE Icc)
-+LCMSBOOL SaveTags(LPLCMSICCPROFILE Icc, LPLCMSICCPROFILE FileOrig)
- {
- 
-     LPBYTE Data;
-@@ -3384,8 +3454,31 @@
- 
-        Icc -> TagOffsets[i] = Begin = Icc ->UsedSpace;
-        Data = (LPBYTE) Icc -> TagPtrs[i];
--       if (!Data)
-+       if (!Data) {
-+
-+           // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user. 
-+           // In this case a blind copy of the block data is performed
-+
-+           if (Icc -> TagOffsets[i]) {
-+
-+                    size_t TagSize   = FileOrig -> TagSizes[i];
-+                    size_t TagOffset = FileOrig -> TagOffsets[i];
-+                    void* Mem;
-+
-+                    if (FileOrig ->Seek(FileOrig, TagOffset)) return FALSE;
-+
-+                    Mem = _cmsMalloc(TagSize);                  
-+
-+                    if (FileOrig ->Read(Mem, TagSize, 1, FileOrig) != 1) return FALSE;
-+                    if (!Icc ->Write(Icc, TagSize, Mem)) return FALSE;
-+
-+                    Icc -> TagSizes[i] = (Icc ->UsedSpace - Begin);
-+                    free(Mem);
-+           }
-+
-               continue;
-+       }
-+
- 
-        switch (Icc -> TagNames[i]) {
- 
-@@ -3464,6 +3557,10 @@
-              break;
- 
- 
-+       case icSigChromaticAdaptationTag:
-+              if (!SaveXYZArray(3, (LPcmsCIEXYZ) Data, Icc)) return FALSE;
-+              break;
-+
-        default:
-               return FALSE;
-        }
-@@ -3480,9 +3577,9 @@
- 
- // Add tags to profile structure
- 
--BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* Tag)
-+LCMSBOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* Tag)
- {
--   BOOL rc;
-+   LCMSBOOL rc;
- 
-    switch (sig) {
- 
-@@ -3543,6 +3640,11 @@
-               rc = _cmsAddColorantTableTag(hProfile, sig, (LPcmsNAMEDCOLORLIST) Tag);
-               break;
- 
-+
-+       case icSigChromaticAdaptationTag:
-+              rc = _cmsAddChromaticAdaptationTag(hProfile, sig, (const cmsCIEXYZ*) Tag);
-+              break;
-+
-        default:
-             cmsSignalError(LCMS_ERRC_ABORTED, "cmsAddTag: Tag '%x' is unsupported", sig);
-             return FALSE;
-@@ -3568,11 +3670,11 @@
- 
- // Low-level save to disk. It closes the profile on exit
- 
--BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName)
-+LCMSBOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName)
- {
-        LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-        LCMSICCPROFILE Keep;
--       BOOL rc;
-+       LCMSBOOL rc;
- 
-         CopyMemory(&Keep, Icc, sizeof(LCMSICCPROFILE));
-        _cmsSetSaveToDisk(Icc, NULL);
-@@ -3581,7 +3683,7 @@
- 
-        if (!SaveHeader(Icc)) return FALSE;
-        if (!SaveTagDirectory(Icc)) return FALSE;
--       if (!SaveTags(Icc)) return FALSE;
-+       if (!SaveTags(Icc, &Keep)) return FALSE;
- 
- 
-        _cmsSetSaveToDisk(Icc, FileName);
-@@ -3591,7 +3693,7 @@
- 
-        if (!SaveHeader(Icc)) goto CleanUp;
-        if (!SaveTagDirectory(Icc)) goto CleanUp;
--       if (!SaveTags(Icc)) goto CleanUp;
-+       if (!SaveTags(Icc, &Keep)) goto CleanUp;
- 
-        rc = (Icc ->Close(Icc) == 0);
-        CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE));
-@@ -3608,7 +3710,7 @@
- 
- 
- // Low-level save from open stream
--BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr,
-+LCMSBOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, 
-                                                            size_t* BytesNeeded)
- {
-     LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
-@@ -3623,7 +3725,7 @@
- 
-     if (!SaveHeader(Icc)) return FALSE;
-     if (!SaveTagDirectory(Icc)) return FALSE;
--    if (!SaveTags(Icc)) return FALSE;
-+    if (!SaveTags(Icc, &Keep)) return FALSE;              
- 
-     if (!MemPtr) {
- 
-@@ -3646,7 +3748,7 @@
-     // Pass #2 does save to file into supplied stream
-     if (!SaveHeader(Icc)) goto CleanUp;
-     if (!SaveTagDirectory(Icc)) goto CleanUp;
--    if (!SaveTags(Icc)) goto CleanUp;
-+    if (!SaveTags(Icc, &Keep)) goto CleanUp;
- 
-     // update BytesSaved so caller knows how many bytes put into stream
-     *BytesNeeded = Icc ->UsedSpace;
-@@ -3662,10 +3764,10 @@
-     return FALSE;
- }
- 
--BOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig,
-+LCMSBOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig,
- 				  void *data, size_t size)
- {
--  BOOL isNew;
-+  LCMSBOOL isNew;
-   int i, idx, delta, count;
-   LPBYTE padChars[3] = {0, 0, 0};
-   LPBYTE beforeBuf, afterBuf, ptr;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -118,7 +118,7 @@
- {
-        LPLUT NewLUT;
- 
--       NewLUT = (LPLUT) malloc(sizeof(LUT));
-+       NewLUT = (LPLUT) _cmsMalloc(sizeof(LUT));
-        if (NewLUT)
-               ZeroMemory(NewLUT, sizeof(LUT));
- 
-@@ -171,9 +171,10 @@
- static
- LPVOID DupBlockTab(LPVOID Org, size_t size)
- {
--    LPVOID mem = malloc(size);
--
-+    LPVOID mem = _cmsMalloc(size);
-+    if (mem != NULL)
-     CopyMemory(mem, Org, size);
-+
-     return mem;
- }
- 
-@@ -211,6 +212,37 @@
- }
- 
- 
-+LCMSBOOL _cmsValidateLUT(LPLUT NewLUT)
-+{
-+    unsigned int calc = 1;
-+    unsigned int oldCalc;
-+    unsigned int power = NewLUT -> InputChan;
-+
-+    if (NewLUT -> cLutPoints > 100) return FALSE;
-+    if (NewLUT -> InputChan > MAXCHANNELS)  return FALSE;
-+    if (NewLUT -> OutputChan > MAXCHANNELS) return FALSE;
-+
-+    if (NewLUT -> cLutPoints == 0) return TRUE;
-+    
-+    for (; power > 0; power--) {
-+
-+      oldCalc = calc;
-+      calc *= NewLUT -> cLutPoints;
-+
-+      if (calc / NewLUT -> cLutPoints != oldCalc) {
-+        return FALSE;
-+      }
-+    }
-+
-+    oldCalc = calc;
-+    calc *= NewLUT -> OutputChan;
-+    if (NewLUT -> OutputChan && calc / NewLUT -> OutputChan != oldCalc) {
-+      return FALSE;
-+    }
-+
-+    return TRUE;
-+}
-+
- LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT NewLUT, int clutPoints, int inputChan, int outputChan)
- {
-     DWORD nTabSize;
-@@ -220,12 +252,17 @@
-        NewLUT -> InputChan     = inputChan;
-        NewLUT -> OutputChan    = outputChan;
- 
-+       if (!_cmsValidateLUT(NewLUT)) {
-+         return NULL;
-+       }
-+
-+       nTabSize = NewLUT -> OutputChan * UIpow(NewLUT->cLutPoints,
-+                                               NewLUT->InputChan);
- 
--       nTabSize = (NewLUT -> OutputChan * UIpow(NewLUT->cLutPoints,
--                                                NewLUT->InputChan)
--                                                * sizeof(WORD));
-+       NewLUT -> T = (LPWORD) _cmsCalloc(sizeof(WORD), nTabSize);
-+       nTabSize *= sizeof(WORD);
-+       if (NewLUT -> T == NULL) return NULL;
- 
--       NewLUT -> T = (LPWORD) malloc(nTabSize);
-        ZeroMemory(NewLUT -> T, nTabSize);
-        NewLUT ->Tsize = nTabSize;
- 
-@@ -254,7 +291,9 @@
- 
-                for (i=0; i < NewLUT -> InputChan; i++) {
- 
--                     PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> InputEntries);
-+                     PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> InputEntries);
-+                     if (PtrW == NULL) return NULL;
-+
-                      NewLUT -> L1[i] = PtrW;
-                      CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> InputEntries);
-                                          CopyMemory(&NewLUT -> LCurvesSeed[0][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
-@@ -268,7 +307,9 @@
-                NewLUT -> OutputEntries = Tables[0] -> nEntries;
-                for (i=0; i < NewLUT -> OutputChan; i++) {
- 
--                     PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> OutputEntries);
-+                     PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> OutputEntries);
-+                     if (PtrW == NULL) return NULL;
-+
-                      NewLUT -> L2[i] = PtrW;
-                      CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> OutputEntries);
-                                          CopyMemory(&NewLUT -> LCurvesSeed[1][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
-@@ -285,7 +326,9 @@
- 
-                for (i=0; i < NewLUT -> InputChan; i++) {
- 
--                     PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L3Entries);
-+                     PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> L3Entries);
-+                     if (PtrW == NULL) return NULL;
-+
-                      NewLUT -> L3[i] = PtrW;
-                      CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L3Entries);
-                                          CopyMemory(&NewLUT -> LCurvesSeed[2][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
-@@ -298,7 +341,9 @@
-                NewLUT -> L4Entries = Tables[0] -> nEntries;
-                for (i=0; i < NewLUT -> OutputChan; i++) {
- 
--                     PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L4Entries);
-+                     PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewLUT -> L4Entries);
-+                     if (PtrW == NULL) return NULL;
-+
-                      NewLUT -> L4[i] = PtrW;
-                      CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L4Entries);
-                                          CopyMemory(&NewLUT -> LCurvesSeed[3][i], &Tables[i] -> Seed, sizeof(LCMSGAMMAPARAMS));
-@@ -580,7 +625,7 @@
-    LPL16PARAMS p = &Lut ->CLut16params;
- 
- 
--   p8 = (LPL8PARAMS) malloc(sizeof(L8PARAMS));
-+   p8 = (LPL8PARAMS) _cmsMalloc(sizeof(L8PARAMS));
-    if (p8 == NULL) return NULL;
- 
-   // values comes * 257, so we can safely take first byte (x << 8 + x)
-@@ -593,8 +638,8 @@
-            if (Lut ->wFlags & LUT_HASTL1) {
- 
-               for (j=0; j < 3; j++)
--                     StageABC[i] = cmsLinearInterpLUT16(StageABC[i],
--                                                        Lut -> L1[i],
-+                     StageABC[j] = cmsLinearInterpLUT16(StageABC[j],
-+                                                        Lut -> L1[j],
-                                                        &Lut -> In16params);
-               Lut ->wFlags &= ~LUT_HASTL1;
-            }
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmatsh.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -89,7 +89,7 @@
-        {
-         LPWORD PtrW;
- 
--        PtrW = (LPWORD) malloc(sizeof(WORD) * p16 -> nSamples);
-+        PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * p16 -> nSamples);
- 
-         if (PtrW == NULL) return -1;  // Signal error
- 
-@@ -119,7 +119,7 @@
-        LPMATSHAPER NewMatShaper;
-        int rc;
- 
--       NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER));
-+       NewMatShaper = (LPMATSHAPER) _cmsMalloc(sizeof(MATSHAPER));
-        if (NewMatShaper)
-               ZeroMemory(NewMatShaper, sizeof(MATSHAPER));
- 
-@@ -171,7 +171,7 @@
-        LPMATSHAPER NewMatShaper;
-        int i, AllLinear;
- 
--       NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER));
-+       NewMatShaper = (LPMATSHAPER) _cmsMalloc(sizeof(MATSHAPER));
-        if (NewMatShaper)
-               ZeroMemory(NewMatShaper, sizeof(MATSHAPER));
- 
-@@ -197,7 +197,7 @@
-        {
-         LPWORD PtrW;
- 
--        PtrW = (LPWORD) malloc(sizeof(WORD) * NewMatShaper -> p16.nSamples);
-+        PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewMatShaper -> p16.nSamples);
- 
-         if (PtrW == NULL) {
-               cmsFreeMatShaper(NewMatShaper);
-@@ -235,11 +235,11 @@
- 
-        for (i=0; i < 3; i++)
-        {
--              if (MatShaper -> L[i]) free(MatShaper ->L[i]);
--              if (MatShaper -> L2[i]) free(MatShaper ->L2[i]);
-+              if (MatShaper -> L[i]) _cmsFree(MatShaper ->L[i]);
-+              if (MatShaper -> L2[i]) _cmsFree(MatShaper ->L2[i]);
-        }
- 
--       free(MatShaper);
-+       _cmsFree(MatShaper);
- }
- 
- 
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsmtrx.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -74,7 +74,7 @@
- void   cdecl MAT3identity(LPMAT3 a);
- void   cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
- int    cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
--BOOL   cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
-+LCMSBOOL  cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
- double cdecl MAT3det(LPMAT3 m);
- void   cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
- void   cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
-@@ -345,13 +345,13 @@
- // Check id two vectors are the same, allowing tolerance
- 
- static
--BOOL RangeCheck(double l, double h, double v)
-+LCMSBOOL RangeCheck(double l, double h, double v)
- {
-        return (v >= l && v <= h);
- }
- 
- 
--BOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance)
-+LCMSBOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance)
- {
-        int i;
-        double c;
-@@ -367,7 +367,7 @@
-        return TRUE;
- }
- 
--BOOL VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance)
-+LCMSBOOL VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance)
- {
-        int i;
-        double c;
-@@ -462,7 +462,7 @@
- 
- // Check if matrix is Identity. Allow a tolerance as %
- 
--BOOL MAT3isIdentity(LPWMAT3 a, double Tolerance)
-+LCMSBOOL MAT3isIdentity(LPWMAT3 a, double Tolerance)
- {
-        int i;
-        MAT3 Idd;
-@@ -545,7 +545,7 @@
- 
- // Solve a system in the form Ax = b
- 
--BOOL MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b)
-+LCMSBOOL MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b)
- {
-         MAT3 m, a_1;
- 
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -74,7 +74,7 @@
-                 NewElements *= 2;
- 
-         size = sizeof(cmsNAMEDCOLORLIST) + (sizeof(cmsNAMEDCOLOR) * NewElements);
--        TheNewList = (LPcmsNAMEDCOLORLIST) malloc(size);
-+        TheNewList = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size);
- 
- 
-         if (TheNewList == NULL) {
-@@ -86,7 +86,7 @@
-               CopyMemory(TheNewList, v, sizeof(cmsNAMEDCOLORLIST) + (v ->nColors - 1) * sizeof(cmsNAMEDCOLOR));
-               TheNewList -> Allocated = NewElements;
- 
--              free(v);
-+              _cmsFree(v);
-               return TheNewList;
-         }
-     }
-@@ -99,7 +99,7 @@
- {
-     size_t size = sizeof(cmsNAMEDCOLORLIST) + (n - 1) * sizeof(cmsNAMEDCOLOR);
- 
--    LPcmsNAMEDCOLORLIST v = (LPcmsNAMEDCOLORLIST) malloc(size);
-+    LPcmsNAMEDCOLORLIST v = (LPcmsNAMEDCOLORLIST) _cmsMalloc(size);
- 
- 
-     if (v == NULL) {
-@@ -124,10 +124,10 @@
-         return;
-     }
- 
--    free(v);
-+    _cmsFree(v);
- }
- 
--BOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS])
-+LCMSBOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS])
- {
-     _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
-     LPcmsNAMEDCOLORLIST List;
-@@ -164,7 +164,7 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix)
-+LCMSBOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix)
- {
-     _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
- 
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c	2009-04-03 13:42:46.000000000 -0400
-@@ -28,7 +28,7 @@
- // file:
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -639,9 +639,81 @@
- 
- 
- 
-+static
-+LPBYTE UnrollDouble1Chan(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
-+{
-+    double* Inks = (double*) accum;
-+    double v;
-+    
-+    
-+    v = floor(Inks[0] * 65535.0 + 0.5);
-+    
-+    if (v > 65535.0) v = 65535.0;
-+    if (v < 0) v = 0;
-+    
-+    
-+    wIn[0] = wIn[1] = wIn[2] = (WORD) v;
-+    
-+    return accum + sizeof(double);    
-+}
-+
-+
- // ----------------------------------------------------------- Packing routines
- 
- 
-+// Generic N-bytes plus dither 16-to-8 conversion. Currently is just a quick hack
-+
-+static int err[MAXCHANNELS];
-+
-+static
-+LPBYTE PackNBytesDither(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
-+{
-+       int nChan  = T_CHANNELS(info -> OutputFormat);
-+       register int i;
-+       unsigned int n, pe, pf;
-+
-+       for (i=0; i < nChan;  i++) {
-+
-+              n = wOut[i] + err[i]; // Value
-+             
-+              pe = (n / 257);       // Whole part
-+              pf = (n % 257);       // Fractional part
-+
-+              err[i] = pf;          // Store it for next pixel
-+
-+              *output++ = (BYTE) pe;
-+       }
-+
-+       return output + T_EXTRA(info ->OutputFormat);
-+}
-+
-+
-+
-+static
-+LPBYTE PackNBytesSwapDither(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
-+{
-+       int nChan  = T_CHANNELS(info -> OutputFormat);
-+       register int i;
-+       unsigned int n, pe, pf;
-+
-+       for (i=nChan-1; i >= 0;  --i) {
-+
-+              n = wOut[i] + err[i];     // Value
-+
-+              pe = (n / 257);           // Whole part
-+              pf = (n % 257);           // Fractional part
-+
-+              err[i] = pf;              // Store it for next pixel
-+
-+              *output++ = (BYTE) pe;
-+       }
-+
-+
-+       return output + T_EXTRA(info ->OutputFormat);
-+}
-+
-+
-+
- // Generic chunky for byte
- 
- static
-@@ -1486,6 +1558,9 @@
-            case PT_HSV:
-            case PT_HLS:
-            case PT_Yxy:
-+                    if (T_CHANNELS(dwInput) == 1)
-+                        FromInput = UnrollDouble1Chan;
-+                    else
-                     FromInput = UnrollDouble;
-                     break;
- 
-@@ -1749,6 +1824,9 @@
-                      switch (T_CHANNELS(dwOutput))
-                      {
-                      case 1:
-+                            if (T_DITHER(dwOutput))
-+                                    ToOutput = PackNBytesDither;
-+                            else                                        
-                             ToOutput = Pack1Byte;
-                             if (T_EXTRA(dwOutput) == 1) {
-                                 if (T_SWAPFIRST(dwOutput))
-@@ -1766,8 +1844,12 @@
-                                  else
-                                      if (T_COLORSPACE(dwOutput) == PT_Lab)
-                                         ToOutput = Pack3BytesLab;
-+                                     else {
-+                                         if (T_DITHER(dwOutput))
-+                                                 ToOutput = PackNBytesDither;
-                                      else
-                                         ToOutput = Pack3Bytes;
-+                                     }
-                              break;
- 
-                          case 1:    // TODO: ALab8 should be handled here
-@@ -1793,13 +1875,23 @@
- 
-                      case 4: if (T_EXTRA(dwOutput) == 0) {
- 
-+ 
-                                 if (T_DOSWAP(dwOutput)) {
- 
--                                     if (T_SWAPFIRST(dwOutput))
-+
-+                                     if (T_SWAPFIRST(dwOutput)) {
-                                          ToOutput = Pack4BytesSwapSwapFirst;
--                                     else
-+                                     }
-+                                     else {
-+
-+                                           if (T_DITHER(dwOutput)) {
-+                                                  ToOutput = PackNBytesSwapDither;
-+                                           }
-+                                           else {
-                                          ToOutput = Pack4BytesSwap;
-                                  }
-+                                     }
-+                                 }
-                                  else {
-                                      if (T_SWAPFIRST(dwOutput))
-                                          ToOutput = Pack4BytesSwapFirst;
-@@ -1807,11 +1899,15 @@
- 
-                                          if (T_FLAVOR(dwOutput))
-                                              ToOutput = Pack4BytesReverse;
-+                                         else {
-+                                             if (T_DITHER(dwOutput))
-+                                                 ToOutput = PackNBytesDither;
-                                          else
-                                              ToOutput = Pack4Bytes;
-                                      }
-                                  }
-                              }
-+                             }
-                             else {
-                                     if (!T_DOSWAP(dwOutput) && !T_SWAPFIRST(dwOutput))
-                                              ToOutput = PackNBytes;
-@@ -1849,9 +1945,14 @@
-                             {
-                                    if (T_DOSWAP(dwOutput))
-                                           ToOutput = PackNBytesSwap;
-+                                   else {
-+
-+                                       if (T_DITHER(dwOutput))
-+                                                 ToOutput = PackNBytesDither;
-                                    else
-                                           ToOutput = PackNBytes;
-                             }
-+                            }
-                             break;
- 
-                      default:;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -144,6 +144,8 @@
-             /Table [ p p p [<...>]]
-             /RangeABC [ 0 1 0 1 0 1]
-             /DecodeABC[ <postlinearization> ]
-+            /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ] 
-+               % -128/500 1+127/500 0 1  -127/200 1+128/200 
-             /MatrixABC [ 1 1 1 1 0 0 0 0 -1]
-             /WhitePoint [D50]
-             /BlackPoint [BP]
-@@ -347,7 +349,8 @@
- static
- LPMEMSTREAM CreateMemStream(LPBYTE Buffer, DWORD dwMax, int MaxCols)
- {
--    LPMEMSTREAM m = (LPMEMSTREAM) malloc(sizeof(MEMSTREAM));
-+    LPMEMSTREAM m = (LPMEMSTREAM) _cmsMalloc(sizeof(MEMSTREAM));
-+    if (m == NULL) return NULL;
- 
-     ZeroMemory(m, sizeof(MEMSTREAM));
- 
-@@ -422,7 +425,7 @@
- 
- }
- 
--// Does write a formatted string
-+// Does write a formatted string. Guaranteed to be 2048 bytes at most.
- static
- void Writef(LPMEMSTREAM m, const char *frm, ...)
- {
-@@ -432,7 +435,7 @@
- 
-         va_start(args, frm);
- 
--        vsprintf((char*) Buffer, frm, args);
-+        vsnprintf((char*) Buffer, 2048, frm, args);
- 
-         for (pt = Buffer; *pt; pt++)  {
- 
-@@ -562,7 +565,7 @@
-     Writef(m, "{255 mul 128 sub 200 div } bind\n");
-     Writef(m, "]\n");
-     Writef(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n");
--        Writef(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
-+    Writef(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n"); 
-     Writef(m, "/DecodeLMN [\n");
-     Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n");
-     Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n");
-@@ -584,7 +587,11 @@
-     if (nEntries <= 0) return;  // Empty table
- 
-     // Suppress whole if identity
--    if (cmsIsLinear(Table, nEntries)) return;
-+    if (cmsIsLinear(Table, nEntries)) {
-+            Writef(m, "{} ");
-+            return;
-+    }
-+
- 
-     // Check if is really an exponential. If so, emit "exp"
-      gamma = cmsEstimateGammaEx(Table, nEntries, 0.001);
-@@ -646,7 +653,7 @@
- // Compare gamma table
- 
- static
--BOOL GammaTableEquals(LPWORD g1, LPWORD g2, int nEntries)
-+LCMSBOOL GammaTableEquals(LPWORD g1, LPWORD g2, int nEntries)
- {
-     return memcmp(g1, g2, nEntries* sizeof(WORD)) == 0;
- }
-@@ -676,7 +683,7 @@
- // Check whatever a profile has CLUT tables (only on input)
- 
- static
--BOOL IsLUTbased(cmsHPROFILE hProfile, int Intent)
-+LCMSBOOL IsLUTbased(cmsHPROFILE hProfile, int Intent)
- {
-     icTagSignature Tag;
- 
-@@ -718,10 +725,10 @@
- 
-     if (sc -> FixWhite) {
- 
--        if (In[0] == 0xFFFF) {  // Only in L* = 100
-+        if (In[0] == 0xFFFF) {  // Only in L* = 100, ab = [-8..8]
- 
--            if ((In[1] >= 0x8000 && In[1] <= 0x87FF) ||
--                (In[2] >= 0x8000 && In[2] <= 0x87FF)) {
-+            if ((In[1] >= 0x7800 && In[1] <= 0x8800) &&
-+                (In[2] >= 0x7800 && In[2] <= 0x8800)) {
- 
-                 WORD* Black;
-                 WORD* White;
-@@ -830,7 +837,7 @@
-     sc.PostMaj= PostMaj;
- 
-     sc.PreMin = PreMin;
--    sc.PostMin= PostMin;
-+    sc.PostMin  = PostMin;
-     sc.lIsInput = lIsInput;
-     sc.FixWhite = FixWhite;
-     sc.ColorSpace = ColorSpace;
-@@ -1231,7 +1238,7 @@
- 
-         if (!WriteNamedColorCSA(mem, hProfile, Intent)) {
- 
--                    free((void*) mem);
-+                    _cmsFree((void*) mem);
-                     return 0;
-         }
-     }
-@@ -1246,7 +1253,7 @@
-         ColorSpace != icSigLabData) {
- 
-             cmsSignalError(LCMS_ERRC_ABORTED, "Invalid output color space");
--            free((void*) mem);
-+            _cmsFree((void*) mem);
-             return 0;
-     }
- 
-@@ -1256,7 +1263,7 @@
-         // Yes, so handle as LUT-based
-         if (!WriteInputLUT(mem, hProfile, Intent)) {
- 
--                    free((void*) mem);
-+                    _cmsFree((void*) mem);
-                     return 0;
-         }
-     }
-@@ -1266,7 +1273,7 @@
- 
-         if (!WriteInputMatrixShaper(mem, hProfile)) {
- 
--                    free((void*) mem);  // Something went wrong
-+                    _cmsFree((void*) mem);  // Something went wrong
-                     return 0;
-         }
-     }
-@@ -1277,7 +1284,7 @@
-     dwBytesUsed = mem ->dwUsed;
- 
-     // Get rid of memory stream
--    free((void*) mem);
-+    _cmsFree((void*) mem);
- 
-     // Finally, return used byte count
-     return dwBytesUsed;
-@@ -1350,27 +1357,40 @@
- 
- 
- static
--void EmitPQRStage(LPMEMSTREAM m, int DoBPC, int lIsAbsolute)
-+void EmitPQRStage(LPMEMSTREAM m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute)
- {
- 
- 
--        Writef(m,"%% Bradford Cone Space\n"
--                 "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n");
-+        if (lIsAbsolute) {
- 
--        Writef(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
-+            // For absolute colorimetric intent, encode back to relative 
-+            // and generate a relative LUT
- 
-+            // Relative encoding is obtained across XYZpcs*(D50/WhitePoint)
- 
--        if (lIsAbsolute) {
-+            cmsCIEXYZ White;
- 
--            // For absolute colorimetric intent, do nothing
-+            cmsTakeMediaWhitePoint(&White, hProfile);
- 
--            Writef(m, "%% Absolute colorimetric -- no transformation\n"
-+            Writef(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n");
-+            Writef(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
-+
-+            Writef(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n"
-                       "/TransformPQR [\n"
--                      "{exch pop exch pop exch pop exch pop} bind dup dup]\n");
-+                      "{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n"
-+                      "{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n"
-+                      "{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n", 
-+                      White.X, White.Y, White.Z);
-             return;
-         }
- 
- 
-+        Writef(m,"%% Bradford Cone Space\n"
-+                 "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n");
-+
-+        Writef(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
-+
-+
-         // No BPC
- 
-         if (!DoBPC) {
-@@ -1414,6 +1434,7 @@
- static
- void EmitXYZ2Lab(LPMEMSTREAM m)
- {
-+    Writef(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n"); 
-     Writef(m, "/EncodeLMN [\n");
-     Writef(m, "{ 0.964200  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
-     Writef(m, "{ 1.000000  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
-@@ -1423,17 +1444,10 @@
-     Writef(m, "/EncodeABC [\n");
- 
- 
--
-     Writef(m, "{ 116 mul  16 sub 100 div  } bind\n");
--    Writef(m, "{ 500 mul 128 add 255 div  } bind\n");
--    Writef(m, "{ 200 mul 128 add 255 div  } bind\n");
--
-+    Writef(m, "{ 500 mul 128 add 256 div  } bind\n");
-+    Writef(m, "{ 200 mul 128 add 256 div  } bind\n");
- 
--    /*
--    Writef(m, "{ 116 mul  16 sub 256 mul 25700 div  } bind\n");
--    Writef(m, "{ 500 mul 128 add 256 mul 65535 div  } bind\n");
--    Writef(m, "{ 200 mul 128 add 256 mul 65535 div  } bind\n");
--    */
- 
-     Writef(m, "]\n");
- 
-@@ -1458,20 +1472,27 @@
-     LPLUT DeviceLink;
-     cmsHPROFILE Profiles[3];
-     cmsCIEXYZ BlackPointAdaptedToD50;
--    BOOL lFreeDeviceLink = FALSE;
--    BOOL lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
-+    LCMSBOOL lFreeDeviceLink = FALSE;
-+    LCMSBOOL lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
-+    LCMSBOOL lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP);
-+    int RelativeEncodingIntent;
- 
- 
--    // Trick our v4 profile as it were v2. This prevents the ajusting done
--    // in perceptual & saturation. We only neew v4 encoding!
- 
--    hLab         = cmsCreateLab4Profile(NULL);
--    cmsSetProfileICCversion(hLab, 0);
-+    hLab = cmsCreateLabProfile(NULL);
- 
-     ColorSpace  =  cmsGetColorSpace(hProfile);
-     nChannels   = _cmsChannelsOf(ColorSpace);
-     OutputFormat = CHANNELS_SH(nChannels) | BYTES_SH(2);
- 
-+    // For absolute colorimetric, the LUT is encoded as relative 
-+    // in order to preserve precission.
-+
-+    RelativeEncodingIntent = Intent;
-+    if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC)
-+        RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC;
-+
-+
-     // Is a devicelink profile?
-     if (cmsGetDeviceClass(hProfile) == icSigLinkClass) {
- 
-@@ -1479,13 +1500,14 @@
- 
-         if (ColorSpace == icSigLabData) {
- 
--              // adjust input to Lab to out v4
-+              // adjust input to Lab to our v4
- 
-             Profiles[0] = hLab;
-             Profiles[1] = hProfile;
- 
-             xform = cmsCreateMultiprofileTransform(Profiles, 2, TYPE_Lab_DBL,
--                                                        OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION);
-+                                                        OutputFormat, RelativeEncodingIntent, 
-+                                                        dwFlags|cmsFLAGS_NOWHITEONWHITEFIXUP|cmsFLAGS_NOPRELINEARIZATION);
- 
-         }
-         else {
-@@ -1499,7 +1521,7 @@
- 
-         // This is a normal profile
-         xform = cmsCreateTransform(hLab, TYPE_Lab_DBL, hProfile,
--                            OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION);
-+                            OutputFormat, RelativeEncodingIntent, dwFlags|cmsFLAGS_NOWHITEONWHITEFIXUP|cmsFLAGS_NOPRELINEARIZATION);
-     }
- 
-     if (xform == NULL) {
-@@ -1515,7 +1537,7 @@
- 
-     if (!DeviceLink) {
- 
--        DeviceLink = _cmsPrecalculateDeviceLink(xform, 0);
-+        DeviceLink = _cmsPrecalculateDeviceLink(xform, cmsFLAGS_NOPRELINEARIZATION);
-         lFreeDeviceLink = TRUE;
-     }
- 
-@@ -1527,7 +1549,7 @@
- 
-     // Emit headers, etc.
-     EmitWhiteBlackD50(m, &BlackPointAdaptedToD50);
--    EmitPQRStage(m, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);
-+    EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);
-     EmitXYZ2Lab(m);
- 
-     if (DeviceLink ->wFlags & LUT_HASTL1) {
-@@ -1544,10 +1566,13 @@
-     // zero. This would sacrifice a bit of highlights, but failure to do so would cause
-     // scum dot. Ouch.
- 
-+    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
-+            lFixWhite = FALSE;
-+
-     Writef(m, "/RenderTable ");
- 
-     WriteCLUT(m, DeviceLink, 8, "<", ">\n", "", "", FALSE,
--                (Intent != INTENT_ABSOLUTE_COLORIMETRIC), ColorSpace);
-+                lFixWhite, ColorSpace);
- 
-     Writef(m, " %d {} bind ", nChannels);
- 
-@@ -1582,6 +1607,9 @@
-     int j;
- 
-     Colorant[0] = 0;
-+    if (nColorant > MAXCHANNELS)
-+        nColorant = MAXCHANNELS;
-+
-     for (j=0; j < nColorant; j++) {
- 
-                 sprintf(Buff, "%.3f", Out[j] / 65535.0);
-@@ -1677,7 +1705,7 @@
- 
-         if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) {
- 
--                    free((void*) mem);
-+                    _cmsFree((void*) mem);
-                     return 0;
-         }
-     }
-@@ -1687,7 +1715,7 @@
- 
- 
-     if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) {
--        free((void*) mem);
-+        _cmsFree((void*) mem);
-         return 0;
-     }
-     }
-@@ -1702,7 +1730,7 @@
-     dwBytesUsed = mem ->dwUsed;
- 
-     // Get rid of memory stream
--    free((void*) mem);
-+    _cmsFree((void*) mem);
- 
-     // Finally, return used byte count
-     return dwBytesUsed;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -120,7 +120,7 @@
- // This routine does a sweep on whole input space, and calls its callback
- // function on knots. returns TRUE if all ok, FALSE otherwise.
- 
--BOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags)
-+LCMSBOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags)
- {
-    int i, t, nTotalPoints, Colorant, index;
-    WORD In[MAXCHANNELS], Out[MAXCHANNELS];
-@@ -145,12 +145,16 @@
-                                                 &Lut -> In16params);
-         }
- 
-+        for (t=0; t < (int) Lut -> OutputChan; t++)
-+                     Out[t] = Lut->T[index + t];
- 
--        // if (dwFlags & SAMPLER_INSPECT) {
-+        if (dwFlags & SAMPLER_HASTL2) {
- 
-              for (t=0; t < (int) Lut -> OutputChan; t++)
--                        Out[t] = Lut->T[index + t];
--        // }
-+                     Out[t] = cmsLinearInterpLUT16(Out[t],
-+                                                   Lut -> L2[t],
-+                                                   &Lut -> Out16params);               
-+        }   
- 
- 
-         if (!Sampler(In, Out, Cargo))
-@@ -255,6 +259,7 @@
-        LPLUT Grid;
-        int nGridPoints;
-        DWORD dwFormatIn, dwFormatOut;
-+       DWORD SaveFormatIn, SaveFormatOut;
-        int ChannelsIn, ChannelsOut;
-        LPLUT SaveGamutLUT;
- 
-@@ -276,6 +281,11 @@
-        dwFormatIn   = (CHANNELS_SH(ChannelsIn)|BYTES_SH(2));
-        dwFormatOut  = (CHANNELS_SH(ChannelsOut)|BYTES_SH(2));
- 
-+       SaveFormatIn  = p ->InputFormat;
-+       SaveFormatOut = p ->OutputFormat;
-+
-+       p -> InputFormat  = dwFormatIn;
-+       p -> OutputFormat = dwFormatOut;
-        p -> FromInput = _cmsIdentifyInputFormat(p, dwFormatIn);
-        p -> ToOutput  = _cmsIdentifyOutputFormat(p, dwFormatOut);
- 
-@@ -297,11 +307,13 @@
-        if (!cmsSample3DGrid(Grid, XFormSampler, (LPVOID) p, Grid -> wFlags)) {
- 
-                 cmsFreeLUT(Grid);
--                return NULL;
-+                Grid = NULL;
-        }
- 
--
-        p ->Gamut = SaveGamutLUT;
-+       p ->InputFormat  = SaveFormatIn; 
-+       p ->OutputFormat = SaveFormatOut;
-+
-        return Grid;
- }
- 
-@@ -348,7 +360,7 @@
- 
- 
- 
--// That is our K-preserving callback.
-+// Preserve all K plane.
- static
- int BlackPreservingSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
- {
-@@ -469,6 +481,7 @@
-     return OldVal;
- }
- 
-+#pragma warning(disable: 4550)
- 
- // Get a pointer to callback on depending of strategy
- static
-@@ -508,7 +521,7 @@
-        // Fill in cargo struct
-        Cargo.cmyk2cmyk = hCMYK2CMYK;
- 
--       // Compute tone curve
-+       // Compute tone curve.       
-        Cargo.KTone  =  _cmsBuildKToneCurve(hCMYK2CMYK, 256);
-        if (Cargo.KTone == NULL) return NULL;
-        cmsCalcL16Params(Cargo.KTone ->nEntries, &Cargo.KToneParams);
-@@ -654,7 +667,7 @@
- 
- 
- 
--BOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p)
-+LCMSBOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p)
- {
- 
-        WORD *WhitePointIn, *WhitePointOut, *BlackPointIn, *BlackPointOut;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -320,7 +320,7 @@
-     cmsHPROFILE hICC;
-     _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) hTransform;
-     LPLUT Lut;
--    BOOL MustFreeLUT;
-+    LCMSBOOL MustFreeLUT;
-     LPcmsNAMEDCOLORLIST InputColorant = NULL;
-     LPcmsNAMEDCOLORLIST OutputColorant = NULL;
- 
-@@ -446,6 +446,7 @@
- 
-        // Creates a LUT with prelinearization step only
-        Lut = cmsAllocLUT();
-+       if (Lut == NULL) return NULL;
- 
-        // Set up channels
-        Lut ->InputChan = Lut ->OutputChan = _cmsChannelsOf(ColorSpace);
-@@ -548,6 +549,10 @@
- 
-        // Creates a LUT with 3D grid only
-        Lut = cmsAllocLUT();
-+       if (Lut == NULL) {
-+           cmsCloseProfile(hICC);
-+           return NULL;
-+           }
- 
- 
-        cmsAlloc3DGrid(Lut, 17, _cmsChannelsOf(ColorSpace),
-@@ -584,8 +589,9 @@
- LPLUT Create3x3EmptyLUT(void)
- {
-         LPLUT AToB0 = cmsAllocLUT();
--        AToB0 -> InputChan = AToB0 -> OutputChan = 3;
-+        if (AToB0 == NULL) return NULL;
- 
-+        AToB0 -> InputChan = AToB0 -> OutputChan = 3;
-         return AToB0;
- }
- 
-@@ -597,8 +603,8 @@
-         cmsHPROFILE hProfile;
-         LPLUT Lut;
- 
--
-         hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
-+        if (hProfile == NULL) return NULL;
- 
-         cmsSetDeviceClass(hProfile, icSigAbstractClass);
-         cmsSetColorSpace(hProfile,  icSigLabData);
-@@ -611,7 +617,10 @@
- 
-        // An empty LUTs is all we need
-        Lut = Create3x3EmptyLUT();
--       if (Lut == NULL) return NULL;
-+       if (Lut == NULL) {
-+           cmsCloseProfile(hProfile);
-+           return NULL;
-+           }
- 
-        cmsAddTag(hProfile, icSigAToB0Tag,    (LPVOID) Lut);
-        cmsAddTag(hProfile, icSigBToA0Tag,    (LPVOID) Lut);
-@@ -628,8 +637,8 @@
-         cmsHPROFILE hProfile;
-         LPLUT Lut;
- 
--
-         hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
-+        if (hProfile == NULL) return NULL;
- 
-         cmsSetProfileICCversion(hProfile, 0x4000000);
- 
-@@ -644,7 +653,10 @@
- 
-        // An empty LUTs is all we need
-        Lut = Create3x3EmptyLUT();
--       if (Lut == NULL) return NULL;
-+       if (Lut == NULL) {
-+           cmsCloseProfile(hProfile);
-+           return NULL;
-+           }
- 
-        Lut -> wFlags |= LUT_V4_INPUT_EMULATE_V2;
-        cmsAddTag(hProfile, icSigAToB0Tag,    (LPVOID) Lut);
-@@ -666,6 +678,7 @@
-         LPLUT Lut;
- 
-         hProfile = cmsCreateRGBProfile(cmsD50_xyY(), NULL, NULL);
-+        if (hProfile == NULL) return NULL;
- 
-         cmsSetDeviceClass(hProfile, icSigAbstractClass);
-         cmsSetColorSpace(hProfile, icSigXYZData);
-@@ -677,7 +690,10 @@
- 
-        // An empty LUTs is all we need
-        Lut = Create3x3EmptyLUT();
--       if (Lut == NULL) return NULL;
-+       if (Lut == NULL) {
-+           cmsCloseProfile(hProfile);
-+           return NULL;
-+           }
- 
-        cmsAddTag(hProfile, icSigAToB0Tag,    (LPVOID) Lut);
-        cmsAddTag(hProfile, icSigBToA0Tag,    (LPVOID) Lut);
-@@ -723,6 +739,7 @@
-     return cmsBuildParametricGamma(1024, 4, Parameters);
- }
- 
-+// Create the ICC virtual profile for sRGB space 
- cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void)
- {
-        cmsCIExyY       D65;
-@@ -739,6 +756,7 @@
- 
-        hsRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma22);
-        cmsFreeGamma(Gamma22[0]);
-+       if (hsRGB == NULL) return NULL;
- 
- 
-        cmsAddTag(hsRGB, icSigDeviceMfgDescTag,      (LPVOID) "(lcms internal)");
-@@ -839,7 +857,10 @@
- 
-        // Creates a LUT with 3D grid only
-        Lut = cmsAllocLUT();
--
-+       if (Lut == NULL) {
-+           cmsCloseProfile(hICC);
-+           return NULL;
-+           }
- 
-        cmsAlloc3DGrid(Lut, nLUTPoints, 3, 3);
- 
-@@ -890,7 +911,10 @@
- 
-        // An empty LUTs is all we need
-        Lut = cmsAllocLUT();
--       if (Lut == NULL) return NULL;
-+       if (Lut == NULL) {
-+           cmsCloseProfile(hProfile);
-+           return NULL;
-+           }
- 
-        Lut -> InputChan = 3;
-        Lut -> OutputChan = 1;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -51,10 +51,6 @@
- 
- #include "lcms.h"
- 
--// 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
- 
- // Conversions
- 
-@@ -79,10 +75,9 @@
- }
- 
- 
--
- // Obtains WhitePoint from Temperature
- 
--BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint)
-+LCMSBOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint)
- {
-        double x, y;
-        double T, T2, T3;
-@@ -147,7 +142,7 @@
- //            - Then, I apply these coeficients to the original matrix
- 
- 
--BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt,
-+LCMSBOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt,
-                                             LPcmsCIExyYTRIPLE Primrs)
- {
-         VEC3 WhitePoint, Coef;
-@@ -246,7 +241,7 @@
- // Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll
- // The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed
- 
--BOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll)
-+LCMSBOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll)
- {
-      MAT3 LamRigg   = {{ // Bradford matrix
-                       {{  0.8951,  0.2664, -0.1614 }},
-@@ -265,7 +260,7 @@
- 
- // Same as anterior, but assuming D50 destination. White point is given in xyY
- 
--BOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt)
-+LCMSBOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt)
- {
-         cmsCIEXYZ Dn;
-         MAT3 Bradford;
-@@ -284,7 +279,7 @@
- 
- // Same as anterior, but assuming D50 source. White point is given in xyY
- 
--BOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt)
-+LCMSBOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt)
- {
-         cmsCIEXYZ Dn;
-         MAT3 Bradford;
-@@ -304,7 +299,7 @@
- // Adapts a color to a given illuminant. Original color is expected to have
- // a SourceWhitePt white point.
- 
--BOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
-+LCMSBOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result, 
-                                      LPcmsCIEXYZ SourceWhitePt,
-                                      LPcmsCIEXYZ Illuminant,
-                                      LPcmsCIEXYZ Value)
-@@ -423,7 +418,7 @@
- 
- 
- static
--BOOL InRange(LPcmsCIExyY a, LPcmsCIExyY b, double tolerance)
-+LCMSBOOL InRange(LPcmsCIExyY a, LPcmsCIExyY b, double tolerance)
- {
-        double dist_x, dist_y;
- 
-@@ -458,6 +453,7 @@
- }
- 
- 
-+// To be removed in future versions
- void _cmsIdentifyWhitePoint(char *Buffer, LPcmsCIEXYZ WhitePt)
- {
-        int i, n;
-@@ -576,7 +572,7 @@
- 
- 
- // Get a black point of output CMYK profile, discounting any ink-limiting embedded
--// in the profile. Fou doing that, use perceptual intent in input direction:
-+// in the profile. For doing that, use perceptual intent in input direction:
- // Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
- 
- static
-@@ -651,6 +647,8 @@
-             D50BlackPoint.X = PERCEPTUAL_BLACK_X;
-             D50BlackPoint.Y = PERCEPTUAL_BLACK_Y;
-             D50BlackPoint.Z = PERCEPTUAL_BLACK_Z;
-+
-+            // Obtain the absolute XYZ. Adapt perceptual black back from D50 to whatever media white
-             cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &D50BlackPoint);
-         }
- 
-@@ -662,16 +660,15 @@
- // This function shouldn't exist at all -- there is such quantity of broken
- // profiles on black point tag, that we must somehow fix chromaticity to
- // avoid huge tint when doing Black point compensation. This function does
--// just that. If BP is specified, then forces it to neutral and uses only L
--// component. If does not exist, computes it by taking 400% of ink or RGB=0 This
--// works well on relative intent and is undefined on perceptual & saturation.
--// However, I will support all intents for tricking & trapping.
--
-+// just that. There is a special flag for using black point tag, but turned 
-+// off by default because it is bogus on most profiles. The detection algorithm 
-+// involves to turn BP to neutral and to use only L component.  
- 
- int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent, DWORD dwFlags)
- {
- 
--    // v4 + perceptual & saturation intents does have its own black point
-+    // v4 + perceptual & saturation intents does have its own black point, and it is 
-+    // well specified enough to use it.
- 
-     if ((cmsGetProfileICCversion(hProfile) >= 0x4000000) &&
-         (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
-@@ -681,7 +678,7 @@
-        if (_cmsIsMatrixShaper(hProfile))
-            return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, cmsFLAGS_NOTPRECALC);
- 
--       // Get fixed value
-+       // CLUT based - Get perceptual black point (fixed value)
-        return GetV4PerceptualBlack(BlackPoint, hProfile, dwFlags);
-     }
- 
-@@ -724,8 +721,9 @@
- 
- #endif
- 
--    // If output profile, discount ink-limiting
-+    // That is about v2 profiles. 
- 
-+    // If output profile, discount ink-limiting and that's all
-     if (Intent == INTENT_RELATIVE_COLORIMETRIC &&
-             (cmsGetDeviceClass(hProfile) == icSigOutputClass) &&
-             (cmsGetColorSpace(hProfile) == icSigCmykData))
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c	2009-04-03 13:42:46.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -52,7 +52,6 @@
- 
- #include "lcms.h"
- 
--// #define DEBUG 1
- 
- // Transformations stuff
- // -----------------------------------------------------------------------
-@@ -85,7 +84,7 @@
- 
- void         LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b);
- void         LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b);
--BOOL         LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
-+LCMSBOOL     LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
-                                                 int Intent, int UsedDirection);
- 
- // -------------------------------------------------------------------------
-@@ -635,6 +634,8 @@
-        MAT3 Scale;
- 
-        GrayTRC = cmsReadICCGamma(hProfile, icSigGrayTRCTag);        // Y
-+       if (GrayTRC == NULL) return NULL;
-+
-        cmsTakeIluminant(&Illuminant, hProfile);
- 
-        if (cmsGetPCS(hProfile) == icSigLabData) {
-@@ -688,6 +689,9 @@
+diff -BbruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c
+--- oldopenjdk6/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c	2009-04-24 03:34:31.000000000 -0400
++++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c	2009-05-01 10:15:13.000000000 -0400
+@@ -689,6 +689,9 @@
                  GrayTRC = cmsReadICCGamma(hProfile, icSigGrayTRCTag);
                  FromLstarToXYZ(GrayTRC, Shapes1);
  
-+		if (GrayTRC == NULL)
-+		  return NULL;		
++                if (GrayTRC == NULL)
++                  return NULL;
 +
                  // Reversing must be done after curve translation
  
                  Shapes[0] = cmsReverseGamma(Shapes1[0]->nEntries, Shapes1[0]);
-@@ -703,6 +707,9 @@
+@@ -704,6 +707,9 @@
  
                  GrayTRC = cmsReadICCGammaReversed(hProfile, icSigGrayTRCTag);   // Y
  
@@ -5511,65 +21,7 @@
                  Shapes[0] = cmsDupGamma(GrayTRC);
                  Shapes[1] = cmsDupGamma(GrayTRC);
                  Shapes[2] = cmsDupGamma(GrayTRC);
-@@ -801,7 +808,7 @@
- // This function builds a transform matrix chaining parameters
- 
- static
--BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p)
-+LCMSBOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p)
- {
-        MAT3 From, To, ToInv, Transfer;
-        LPGAMMATABLE In[3], InverseOut[3];
-@@ -838,6 +845,11 @@
-         InverseOut[1] = cmsReadICCGammaReversed(p -> OutputProfile, icSigGreenTRCTag);
-         InverseOut[2] = cmsReadICCGammaReversed(p -> OutputProfile, icSigBlueTRCTag);
- 
-+        if (!InverseOut[0] || !InverseOut[1] || !InverseOut[2]) {
-+                     cmsFreeGammaTriple(In); 
-+                     return FALSE;
-+        }
-+
-         p -> SmeltMatShaper = cmsAllocMatShaper2(&Transfer, In, InverseOut, MATSHAPER_ALLSMELTED);
- 
-         cmsFreeGammaTriple(In);
-@@ -1029,7 +1041,7 @@
- // Check colorspace
- 
- static
--BOOL IsProperColorSpace(cmsHPROFILE hProfile, DWORD dwFormat, BOOL lUsePCS)
-+LCMSBOOL IsProperColorSpace(cmsHPROFILE hProfile, DWORD dwFormat, LCMSBOOL lUsePCS)
- {
-        int Space = T_COLORSPACE(dwFormat);
- 
-@@ -1049,10 +1061,10 @@
- {
-     // Allocate needed memory
- 
--    _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) malloc(sizeof(_cmsTRANSFORM));
-+    _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) _cmsMalloc(sizeof(_cmsTRANSFORM));
-     if (!p) {
- 
--          cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: malloc() failed");
-+          cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: _cmsMalloc() failed");
-           return NULL;
-     }
- 
-@@ -1269,10 +1281,10 @@
-         else {
-                 // Can we optimize matrix-shaper only transform?
- 
--                   if (*FromTagPtr == 0 &&
--                       *ToTagPtr == 0 &&
--                       !p->PreviewProfile  &&
--                       p -> Intent != INTENT_ABSOLUTE_COLORIMETRIC &&
-+                   if ((*FromTagPtr == 0) && 
-+                       (*ToTagPtr == 0) && 
-+                       (!p->PreviewProfile) && 
-+                       (p -> Intent != INTENT_ABSOLUTE_COLORIMETRIC) && 
-                        (p -> EntryColorSpace == icSigRgbData) &&
-                        (p -> ExitColorSpace == icSigRgbData) &&
-                        !(p -> dwOriginalFlags & cmsFLAGS_BLACKPOINTCOMPENSATION)) {
-@@ -1335,7 +1347,7 @@
+@@ -1343,7 +1349,7 @@
                       p -> ToDevice = PCStoShaperMatrix;
                       p -> OutMatShaper = cmsBuildOutputMatrixShaper(p->OutputProfile);
  
@@ -5578,910 +30,24 @@
                              cmsSignalError(LCMS_ERRC_ABORTED, "profile is unsuitable for output");
                              return NULL;
                              }
-@@ -1553,7 +1565,8 @@
-                     DeviceLink = _cmsPrecalculateDeviceLink((cmsHTRANSFORM) p, dwFlags);
-                }
- 
--               if (p -> dwOriginalFlags & cmsFLAGS_GAMUTCHECK) {
-+               // Allow to specify cmsFLAGS_GAMUTCHECK, even if no proofing profile is given               
-+               if ((p ->PreviewProfile != NULL) && (p -> dwOriginalFlags & cmsFLAGS_GAMUTCHECK)) {
- 
-                    GamutCheck = _cmsPrecalculateGamutCheck((cmsHTRANSFORM) p);
-                }
-@@ -1668,7 +1681,7 @@
- 
-            LCMS_FREE_LOCK(&p->rwlock);
- 
--       free((void *) p);
-+       _cmsFree((void *) p);
- }
- 
- 
-@@ -1704,7 +1717,7 @@
- 
- // Returns TRUE if the profile is implemented as matrix-shaper
- 
--BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile)
-+LCMSBOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile)
- {
-     switch (cmsGetColorSpace(hProfile)) {
- 
-@@ -1728,7 +1741,7 @@
- }
- 
- 
--BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
-+LCMSBOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
-                                                 int Intent, int UsedDirection)
- {
- 
-@@ -1774,6 +1787,16 @@
- }
- 
- 
-+static
-+int IsAllowedInSingleXform(icProfileClassSignature aClass)
-+{
-+    return (aClass == icSigInputClass) ||
-+           (aClass == icSigDisplayClass) ||
-+           (aClass == icSigOutputClass) ||
-+           (aClass == icSigColorSpaceClass);
-+}
-+
-+
- // A multiprofile transform does chain several profiles into a single
- // devicelink. It couls also be used to merge named color profiles into
- // a single database.
-@@ -1805,10 +1828,16 @@
-     // There is a simple case with just two profiles, try to catch it in order of getting
-     // black preservation to work on this function, at least with two profiles.
- 
-+    
-     if (nProfiles == 2) {
- 
--        if ((cmsGetDeviceClass(hProfiles[0]) != icSigLinkClass) &&
--            (cmsGetDeviceClass(hProfiles[1]) != icSigLinkClass))
-+        icProfileClassSignature Class1 = cmsGetDeviceClass(hProfiles[0]);
-+        icProfileClassSignature Class2 = cmsGetDeviceClass(hProfiles[1]);
-+
-+        // Only input, output and display are allowed
-+
-+        if (IsAllowedInSingleXform(Class1) && 
-+            IsAllowedInSingleXform(Class2)) 
-                    return cmsCreateTransform(hProfiles[0], dwInput, hProfiles[1], dwOutput, Intent, dwFlags);
-     }
- 
-@@ -1897,6 +1926,7 @@
+@@ -1920,6 +1926,8 @@
  
          ColorSpace = ColorSpaceIn;
  
 +	Transforms[i] = NULL;
++
  
          if (ColorSpace == CurrentColorSpace) {
  
-@@ -1946,7 +1976,12 @@
+@@ -1969,6 +1977,11 @@
                  goto ErrorCleanup;
          }
  
--        CurrentColorSpace = ColorSpaceOut;
 +	if (Transforms[i] == NULL) {
-+                cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateMultiprofileTransform: Invalid profile");
-+                goto ErrorCleanup;
-+        }
++          cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateMultiprofileTransform: Invalid profile");
++          goto ErrorCleanup;
++	} 
 +
-+	CurrentColorSpace = ColorSpaceOut;
+         CurrentColorSpace = ColorSpaceOut;
  
      }
- 
-@@ -1984,6 +2019,14 @@
-     if (hLab) cmsCloseProfile(hLab);
-     if (hXYZ) cmsCloseProfile(hXYZ);
- 
-+    
-+    if (p ->EntryColorSpace == icSigRgbData ||
-+        p ->EntryColorSpace == icSigCmyData) {
-+                   
-+                    p->DeviceLink -> CLut16params.Interp3D = cmsTetrahedralInterp16;
-+    }
-+    
-+
-     if ((Intent != INTENT_ABSOLUTE_COLORIMETRIC) &&
-         !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP))
-                             _cmsFixWhiteMisalignment(p);
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/icc34.h	2009-04-03 13:42:46.000000000 -0400
-@@ -1,5 +1,8 @@
-+/* Header file guard bands */
-+#ifndef ICC_H
-+#define ICC_H
-+
- /*
-- * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
-  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-  *
-  * This code is free software; you can redistribute it and/or modify it
-@@ -23,9 +26,37 @@
-  * have any questions.
-  */
- 
--/* 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
-@@ -206,6 +237,11 @@
- 
- #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;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c	2008-11-25 04:06:03.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c	2009-04-03 13:44:42.000000000 -0400
-@@ -356,6 +356,12 @@
-       fprintf(stderr, "setTagData on icSigHead not permitted");
-       return;
-     }
-+    
-+    if (data == NULL)
-+    {
-+      JNU_ThrowByName(env, "java/lang/NullPointerException", "");
-+      return;
-+    }
- 
-     sProf.j = id;
-     profile = (cmsHPROFILE) sProf.pf;
-diff -ruN openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h
---- openjdkold/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h	2008-11-25 04:06:04.000000000 -0500
-+++ openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h	2009-04-03 13:43:04.000000000 -0400
-@@ -29,7 +29,7 @@
- //
- //
- //  Little cms
--//  Copyright (C) 1998-2006 Marti Maria
-+//  Copyright (C) 1998-2007 Marti Maria
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -49,8 +49,8 @@
- // 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
--#undef DEBUG
-+// Version 1.18
-+
- #ifndef __cms_H
- 
- // ********** Configuration toggles ****************************************
-@@ -62,13 +62,8 @@
- // virtually any machine.
- 
- //#define USE_FLOAT        1
--#ifdef _WIN64
--#define USE_C            1
--#undef USE_ASSEMBLER
--#else
--#undef USE_C
-+// #define USE_C            1
- #define USE_ASSEMBLER    1
--#endif
- 
- // Define this if you are using this package as a DLL (windows only)
- 
-@@ -77,15 +72,11 @@
- 
- // Uncomment if you are trying the engine in a non-windows environment
- // like linux, SGI, VAX, FreeBSD, BeOS, etc.
--#if !defined(_WIN32) || !defined(_WIN64)
- #define NON_WINDOWS  1
--#endif
- 
- // Uncomment this one if you are using big endian machines (only meaningful
- // when NON_WINDOWS is used)
--#ifndef _LITTLE_ENDIAN
--#define USE_BIG_ENDIAN   1
--#endif
-+// #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)
-@@ -104,9 +95,14 @@
- // 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
-+#define LCMS_VERSION        117
- 
- // Microsoft VisualC++
- 
-@@ -115,8 +111,10 @@
- #ifdef _MSC_VER
- #    undef NON_WINDOWS
- #    if (_MSC_VER >= 1400)
-+#      ifndef _CRT_SECURE_NO_DEPRECATE
- #        define _CRT_SECURE_NO_DEPRECATE 1
- #    endif
-+#    endif
- #endif
- 
- // Borland C
-@@ -139,6 +137,7 @@
- #   define unlink remove
- #   if WIN32
- #       define USE_CUSTOM_SWAB 1
-+#       undef  NON_WINDOWS
- #   else
- #       define NON_WINDOWS   1
- #   endif
-@@ -176,11 +175,17 @@
- #   define USE_BIG_ENDIAN      1
- #endif
- 
--#ifdef TARGET_CPU_PPC
-+#if TARGET_CPU_PPC
- #   define USE_BIG_ENDIAN   1
- #endif
- 
--#ifdef macintosh
-+#if macintosh
-+# ifndef __LITTLE_ENDIAN__
-+#   define USE_BIG_ENDIAN      1
-+# endif
-+#endif
-+
-+#if __BIG_ENDIAN__
- #   define USE_BIG_ENDIAN      1
- #endif
- 
-@@ -217,11 +222,8 @@
- 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))
-@@ -263,8 +265,12 @@
- 
- #include <windows.h>
- 
--typedef HANDLE LCMSHANDLE;
--
-+#ifdef _WIN64
-+# ifdef USE_ASSEMBLER
-+#    undef  USE_ASSEMBLER
-+#    define USE_C           1
-+# endif
-+#endif
- 
- #ifdef  USE_INT64
- #  ifndef LCMSULONGLONG
-@@ -296,6 +302,10 @@
- #   define LCMS_UNLOCK(x)
- #endif
- 
-+// Base types
-+
-+typedef int   LCMSBOOL;
-+typedef void* LCMSHANDLE;
- 
- #include "icc34.h"          // ICC header file
- 
-@@ -322,16 +332,10 @@
- #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)
-@@ -340,7 +344,6 @@
- #define icSiglutAtoBType                ((icTagTypeSignature) 0x6d414220L)  // mAB
- #define icSiglutBtoAType                ((icTagTypeSignature) 0x6d424120L)  // mBA
- #define icSigColorantTableType          ((icTagTypeSignature) 0x636c7274L)  // clrt
--#define icSigHPGamutDescType            ((icTagTypeSignature) 0x676D7441L)  // gmtA H. Zeng
- 
- 
- typedef struct {
-@@ -438,9 +441,6 @@
- #ifndef itoa
- #       define itoa   _itoa
- #endif
--#ifndef filelength
--#       define filelength _filelength
--#endif
- #ifndef fileno
- #       define fileno   _fileno
- #endif
-@@ -450,6 +450,14 @@
- #ifndef hypot
- #       define hypot    _hypot
- #endif
-+#ifndef snprintf
-+#       define snprintf  _snprintf
-+#endif
-+#ifndef vsnprintf
-+#       define vsnprintf  _vsnprintf
-+#endif
-+
-+
- #endif
- 
- 
-@@ -470,8 +478,9 @@
- 
- // Format of pixel is defined by one DWORD, using bit fields as follows
- //
--//            TTTTT U Y F P X S EEE CCCC BBB
-+//            D TTTTT U Y F P X S EEE CCCC BBB
- //
-+//            D: Use dither (8 bits only)
- //            T: Pixeltype
- //            F: Flavor  0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
- //            P: Planar? 0=Chunky, 1=Planar
-@@ -483,6 +492,7 @@
- //            Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
- 
- 
-+#define DITHER_SH(s)           ((s) << 22)
- #define COLORSPACE_SH(s)       ((s) << 16)
- #define SWAPFIRST_SH(s)        ((s) << 14)
- #define FLAVOR_SH(s)           ((s) << 13)
-@@ -858,7 +868,7 @@
- 
- LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
- LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize);
--LCMSAPI BOOL          LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
- 
- // Predefined run-time profiles
- 
-@@ -915,14 +925,14 @@
- 
- LCMSAPI void          LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin);
- 
--LCMSAPI BOOL          LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
- 
--LCMSAPI BOOL          LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
-                                                         LPcmsCIEXYZ SourceWhitePt,
-                                                         LPcmsCIEXYZ Illuminant,
-                                                         LPcmsCIEXYZ Value);
- 
--LCMSAPI BOOL          LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
-                                                         LPcmsCIExyY WhitePoint,
-                                                         LPcmsCIExyYTRIPLE Primaries);
- 
-@@ -976,7 +986,7 @@
- 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 LCMSBOOL      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);
-@@ -984,14 +994,14 @@
- 
- // 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 LCMSBOOL      LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
-+LCMSAPI LCMSBOOL      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 void          LCMSEXPORT cmsSetLanguage(const char LanguageCode[4], const char CountryCode[4]);
- LCMSAPI const char*   LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile);
- LCMSAPI const char*   LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile);
- LCMSAPI const char*   LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile);
-@@ -1000,13 +1010,13 @@
- 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 LCMSBOOL      LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
- 
--LCMSAPI BOOL          LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
-+LCMSAPI LCMSBOOL      LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
- LCMSAPI int           LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile);
- 
--LCMSAPI BOOL          LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len);
-+LCMSAPI LCMSBOOL      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);
-@@ -1038,50 +1048,18 @@
- 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);
-+LCMSAPI LCMSBOOL              LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile);
- 
-+// How profiles may be used
- #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 LCMSBOOL                LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection);
- 
- LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
- LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
-@@ -1141,7 +1119,7 @@
- 
- // CRD special
- 
--#define cmsFLAGS_NODEFAULTRESOURCEDEF     0x00010000
-+#define cmsFLAGS_NODEFAULTRESOURCEDEF     0x01000000
- 
- // Gridpoints
- 
-@@ -1221,7 +1199,7 @@
- // Named color support
- 
- LCMSAPI int  LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform);
--LCMSAPI BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix);
-+LCMSAPI LCMSBOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix);
- LCMSAPI int  LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name);
- 
- // Colorant tables
-@@ -1230,7 +1208,7 @@
- 
- // Profile creation
- 
--LCMSAPI BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* data);
-+LCMSAPI LCMSBOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* data);
- 
- // Converts a transform to a devicelink profile
- LCMSAPI cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags);
-@@ -1240,12 +1218,14 @@
- 
- 
- // Save profile
--LCMSAPI BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName);
--LCMSAPI BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr,
-+LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName);
-+LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, 
-                                                                 size_t* BytesNeeded);
- 
-+
-+
- // Modify data for a tag in a profile
--LCMSAPI BOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig, void *data, size_t size);
-+LCMSAPI LCMSBOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig, void *data, size_t size);
- 
- // PostScript ColorRenderingDictionary and ColorSpaceArray
- 
-@@ -1326,35 +1306,37 @@
- // Persistence
- LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
- LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded);
- 
- // Properties
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
--
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char* cSubProp, const char *Val);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
- 
- 
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
- LCMSAPI double          LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
--LCMSAPI int             LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames);
-+LCMSAPI const char*     LCMSEXPORT cmsIT8GetPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char *cSubProp);
-+LCMSAPI int             LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, const char ***PropertyNames);
-+LCMSAPI int             LCMSEXPORT cmsIT8EnumPropertyMulti(LCMSHANDLE hIT8, const char* cProp, const char*** SubpropertyNames);
- 
- // Datasets
- 
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);
- LCMSAPI double          LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int row, int col);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, 
-                                                 const char* Val);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, 
-                                                 double Val);
- 
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
-@@ -1362,25 +1344,28 @@
- 
- LCMSAPI double          LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
-                                                 const char* cSample,
-                                                 const char *Val);
- 
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
-                                                 const char* cSample,
-                                                 double Val);
- 
- LCMSAPI int             LCMSEXPORT cmsIT8GetDataFormat(LCMSHANDLE hIT8, const char* cSample);
--LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
- LCMSAPI int             LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
- 
- 
- LCMSAPI const char*     LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
-+LCMSAPI int             LCMSEXPORT cmsIT8GetPatchByName(LCMSHANDLE hIT8, const char *cSample);
- 
- // The LABEL extension
- 
- LCMSAPI int             LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
- 
-+LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetIndexColumn(LCMSHANDLE hIT8, const char* cSample);
-+
- // Formatter for double
- LCMSAPI void            LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
- 
-@@ -1406,15 +1391,16 @@
- 
- // Profiling Extensions --- Would be removed from API in future revisions
- 
--LCMSAPI BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile,  icTagSignature sig, const char* Text);
--LCMSAPI BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile,   icTagSignature sig, const cmsCIEXYZ* XYZ);
--LCMSAPI BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile,   icTagSignature sig, const void* lut);
--LCMSAPI BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction);
--LCMSAPI BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm);
--LCMSAPI BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq);
--LCMSAPI BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
--LCMSAPI BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime);
--LCMSAPI BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile,  icTagSignature sig, const char* Text);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile,   icTagSignature sig, const cmsCIEXYZ* XYZ);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile,   icTagSignature sig, const void* lut);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
-+LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddChromaticAdaptationTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* mat);
- 
- // --------------------------------------------------------------------------------------------------- Inline functions
- 
-@@ -1456,6 +1442,34 @@
-        return (WORD) in;
- }
- 
-+#ifndef LCMS_USER_ALLOC
-+
-+// Low-level alloc hook
-+
-+LCMS_INLINE void* _cmsMalloc(size_t size)
-+{
-+    if (size > ((size_t) 1024*1024*500)) return NULL;  // Never allow over 500Mb
-+    if (size < 0) return NULL;              // Prevent signed size_t exploits
-+
-+    return (void*) malloc(size);
-+}
-+
-+LCMS_INLINE void* _cmsCalloc(size_t nmemb, size_t size)
-+{
-+    size_t alloc = nmemb * size;
-+    if (alloc < nmemb || alloc < size) {
-+        return NULL;
-+    }
-+    return _cmsMalloc(alloc);
-+}
-+
-+LCMS_INLINE void _cmsFree(void *Ptr)
-+{
-+    if (Ptr) free(Ptr);    
-+}
-+
-+#endif
-+
- // ------------------------------------------------------------------------------------------- end of inline functions
- 
- // Signal error from inside lcms code
-@@ -1542,8 +1556,8 @@
- void   cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d);
- void   cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b);
- void   cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b);
--BOOL   cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance);
--BOOL   cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance);
-+LCMSBOOL  cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance);
-+LCMSBOOL  cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance);
- void   cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d);
- void   cdecl VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v);
- void   cdecl VEC3saturate(LPVEC3 v);
-@@ -1554,13 +1568,13 @@
- void   cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
- void   cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d);
- int    cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
--BOOL   cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
-+LCMSBOOL  cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
- double cdecl MAT3det(LPMAT3 m);
- void   cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
- void   cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
- void   cdecl MAT3fromFix(LPMAT3 r, LPWMAT3 v);
- void   cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v);
--BOOL   cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance);
-+LCMSBOOL  cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance);
- void   cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d);
- 
- // Is a table linear?
-@@ -1609,7 +1623,7 @@
- void    cdecl cmsCalcL16Params(int nSamples, LPL16PARAMS p);
- void    cdecl cmsCalcCLUT16Params(int nSamples, int InputChan, int OutputChan, LPL16PARAMS p);
- void    cdecl cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan,
--                                            BOOL lUseTetrahedral, LPL16PARAMS p);
-+                                            LCMSBOOL lUseTetrahedral, LPL16PARAMS p);
- 
- WORD    cdecl cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
- Fixed32 cdecl cmsLinearInterpFixed(WORD Value1, WORD LutTable[], LPL16PARAMS p);
-@@ -1693,7 +1707,7 @@
- 
-                // Gray axes fixup. Only on v2 8-bit Lab LUT
- 
--               BOOL FixGrayAxes;
-+               LCMSBOOL FixGrayAxes;
- 
- 
-                            // Parameters used for curve creation
-@@ -1704,7 +1718,7 @@
-                }; // LUT, FAR* LPLUT;
- 
- 
--BOOL         cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries);
-+LCMSBOOL         cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries);
- 
- 
- // CRC of gamma tables
-@@ -1722,7 +1736,7 @@
- 
- void           cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
- void           cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
--BOOL           cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
-+LCMSBOOL       cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
- void           cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
- 
- LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
-@@ -1756,7 +1770,7 @@
- void        cdecl cmsFreeMatShaper(LPMATSHAPER MatShaper);
- void        cdecl cmsEvalMatShaper(LPMATSHAPER MatShaper, WORD In[], WORD Out[]);
- 
--BOOL         cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);
-+LCMSBOOL    cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);
- 
- LPMATSHAPER  cdecl cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile);
- LPMATSHAPER  cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile);
-@@ -1764,11 +1778,11 @@
- 
- 
- // White Point & Primary chromas handling
--BOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll);
--BOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt);
--BOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt);
-+LCMSBOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll);
-+LCMSBOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt);
-+LCMSBOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt);
- 
--BOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile);
-+LCMSBOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile);
- 
- // Inter-PCS conversion routines. They assume D50 as white point.
- void cdecl cmsXYZ2LabEncoded(WORD XYZ[3], WORD Lab[3]);
-@@ -1783,7 +1797,7 @@
- LPcmsNAMEDCOLORLIST  cdecl cmsAllocNamedColorList(int n);
- int                  cdecl cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSignature sig);
- void                 cdecl cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST List);
--BOOL                 cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]);
-+LCMSBOOL             cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]);
- 
- 
- // I/O
-@@ -1827,8 +1841,8 @@
- 
-                char                    PhysicalFile[MAX_PATH];
- 
--               BOOL                    IsWrite;
--               BOOL                    SaveAs8Bits;
-+               LCMSBOOL                IsWrite;
-+               LCMSBOOL                SaveAs8Bits;
- 
-                struct tm               Created;
- 
-@@ -1836,14 +1850,13 @@
- 
-                size_t (* Read)(void *buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc);
- 
--               BOOL   (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset);
--               BOOL   (* Close)(struct _lcms_iccprofile_struct* Icc);
-+               LCMSBOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset);
-+               LCMSBOOL (* Close)(struct _lcms_iccprofile_struct* Icc);
-                size_t (* Tell)(struct _lcms_iccprofile_struct* Icc);
--               BOOL   (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount);
--
-+               LCMSBOOL   (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount);
-                // Writting
- 
--               BOOL   (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr);
-+               LCMSBOOL (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr);
- 
-                size_t UsedSpace;
- 
-@@ -1855,7 +1868,7 @@
- cmsHPROFILE cdecl _cmsCreateProfilePlaceholder(void);
- 
- // Search into tag dictionary
--icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError);
-+icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, LCMSBOOL lSignalError);
- 
- // Search for a particular tag, replace if found or add new one else
- LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const void* Init);
-@@ -1871,6 +1884,7 @@
- 
- // These macros unpack format specifiers into integers
- 
-+#define T_DITHER(s)           (((s)>>22)&1)
- #define T_COLORSPACE(s)       (((s)>>16)&31)
- #define T_SWAPFIRST(s)        (((s)>>14)&1)
- #define T_FLAVOR(s)           (((s)>>13)&1)
-@@ -1967,7 +1981,7 @@
- 
-                     // Flag for transform involving v4 profiles
- 
--                    BOOL lInputV4Lab, lOutputV4Lab;
-+                    LCMSBOOL lInputV4Lab, lOutputV4Lab;
- 
- 
-                     // 1-pixel cache
-@@ -2014,7 +2028,7 @@
- 
- // Clamping & Gamut handling
- 
--BOOL cdecl   _cmsEndPointsBySpace(icColorSpaceSignature Space,
-+LCMSBOOL cdecl   _cmsEndPointsBySpace(icColorSpaceSignature Space,
-                             WORD **White, WORD **Black, int *nOutputs);
- 
- WORD * cdecl _cmsWhiteBySpace(icColorSpaceSignature Space);
-@@ -2043,7 +2057,7 @@
- LPLUT cdecl _cmsPrecalculateGamutCheck(cmsHTRANSFORM h);
- 
- // Hot fixes bad profiles
--BOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p);
-+LCMSBOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p);
- 
- // Marks LUT as 8 bit on input
- LPLUT cdecl _cmsBlessLUT8(LPLUT Lut);
-@@ -2061,6 +2075,10 @@
- // Build a tone curve for K->K' if possible (only works on CMYK)
- LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints);
- 
-+// Validates a LUT
-+LCMSBOOL cdecl _cmsValidateLUT(LPLUT NewLUT);
-+
-+
- // These are two VITAL macros, from converting between 8 and 16 bit
- // representation.
-