提交 06bdbf91 编写于 作者: P prr

8183032: Upgrade to LittleCMS 2.9

Reviewed-by: serb, psadhukhan, mschoene, rhalade
上级 6774b980
...@@ -391,12 +391,12 @@ JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative ...@@ -391,12 +391,12 @@ JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
{ {
lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id); lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
TagSignature_t sig; TagSignature_t sig;
cmsInt32Number tagSize; cmsUInt32Number tagSize;
jbyte* dataArray = NULL; jbyte* dataArray = NULL;
jbyteArray data = NULL; jbyteArray data = NULL;
jint bufSize; cmsUInt32Number bufSize;
sig.j = tagSig; sig.j = tagSig;
...@@ -839,7 +839,7 @@ static cmsHPROFILE _writeCookedTag(const cmsHPROFILE pfTarget, ...@@ -839,7 +839,7 @@ static cmsHPROFILE _writeCookedTag(const cmsHPROFILE pfTarget,
for (i = 0; i < tagCount; i++) { for (i = 0; i < tagCount; i++) {
cmsBool isTagReady = FALSE; cmsBool isTagReady = FALSE;
const cmsTagSignature s = cmsGetTagSignature(pfTarget, i); const cmsTagSignature s = cmsGetTagSignature(pfTarget, i);
const cmsInt32Number tagSize = cmsReadRawTag(pfTarget, s, NULL, 0); const cmsUInt32Number tagSize = cmsReadRawTag(pfTarget, s, NULL, 0);
if (s == sig) { if (s == sig) {
// skip the user supplied tag // skip the user supplied tag
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -55,7 +55,6 @@ ...@@ -55,7 +55,6 @@
#include "lcms2_internal.h" #include "lcms2_internal.h"
// Alpha copy ------------------------------------------------------------------------------------------------------------------ // Alpha copy ------------------------------------------------------------------------------------------------------------------
// Floor to byte, taking care of saturation // Floor to byte, taking care of saturation
...@@ -71,16 +70,16 @@ cmsINLINE cmsUInt8Number _cmsQuickSaturateByte(cmsFloat64Number d) ...@@ -71,16 +70,16 @@ cmsINLINE cmsUInt8Number _cmsQuickSaturateByte(cmsFloat64Number d)
// Return the size in bytes of a given formatter // Return the size in bytes of a given formatter
static static
int trueBytesSize(cmsUInt32Number Format) cmsUInt32Number trueBytesSize(cmsUInt32Number Format)
{ {
int fmt_bytes = T_BYTES(Format); cmsUInt32Number fmt_bytes = T_BYTES(Format);
// For double, the T_BYTES field returns zero // For double, the T_BYTES field returns zero
if (fmt_bytes == 0) if (fmt_bytes == 0)
return sizeof(double); return sizeof(double);
// Otherwise, it is already correct for all formats // Otherwise, it is already correct for all formats
return fmt_bytes; return fmt_bytes;
} }
...@@ -119,8 +118,13 @@ void from8toDBL(void* dst, const void* src) ...@@ -119,8 +118,13 @@ void from8toDBL(void* dst, const void* src)
static static
void from8toHLF(void* dst, const void* src) void from8toHLF(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
cmsFloat32Number n = (*(cmsUInt8Number*)src) / 255.0f; cmsFloat32Number n = (*(cmsUInt8Number*)src) / 255.0f;
*(cmsUInt16Number*)dst = _cmsFloat2Half(n); *(cmsUInt16Number*)dst = _cmsFloat2Half(n);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
// From 16 // From 16
...@@ -151,8 +155,13 @@ void from16toDBL(void* dst, const void* src) ...@@ -151,8 +155,13 @@ void from16toDBL(void* dst, const void* src)
static static
void from16toHLF(void* dst, const void* src) void from16toHLF(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
cmsFloat32Number n = (*(cmsUInt16Number*)src) / 65535.0f; cmsFloat32Number n = (*(cmsUInt16Number*)src) / 65535.0f;
*(cmsUInt16Number*)dst = _cmsFloat2Half(n); *(cmsUInt16Number*)dst = _cmsFloat2Half(n);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
// From Float // From Float
...@@ -187,8 +196,13 @@ void fromFLTtoDBL(void* dst, const void* src) ...@@ -187,8 +196,13 @@ void fromFLTtoDBL(void* dst, const void* src)
static static
void fromFLTtoHLF(void* dst, const void* src) void fromFLTtoHLF(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
cmsFloat32Number n = *(cmsFloat32Number*)src; cmsFloat32Number n = *(cmsFloat32Number*)src;
*(cmsUInt16Number*)dst = _cmsFloat2Half(n); *(cmsUInt16Number*)dst = _cmsFloat2Half(n);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
...@@ -197,27 +211,48 @@ void fromFLTtoHLF(void* dst, const void* src) ...@@ -197,27 +211,48 @@ void fromFLTtoHLF(void* dst, const void* src)
static static
void fromHLFto8(void* dst, const void* src) void fromHLFto8(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src);
*(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0f); *(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0f);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
static static
void fromHLFto16(void* dst, const void* src) void fromHLFto16(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src);
*(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0f); *(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0f);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
static static
void fromHLFtoFLT(void* dst, const void* src) void fromHLFtoFLT(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
*(cmsFloat32Number*)dst = _cmsHalf2Float(*(cmsUInt16Number*)src); *(cmsFloat32Number*)dst = _cmsHalf2Float(*(cmsUInt16Number*)src);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
static static
void fromHLFtoDBL(void* dst, const void* src) void fromHLFtoDBL(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
*(cmsFloat64Number*)dst = (cmsFloat64Number)_cmsHalf2Float(*(cmsUInt16Number*)src); *(cmsFloat64Number*)dst = (cmsFloat64Number)_cmsHalf2Float(*(cmsUInt16Number*)src);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
// From double // From double
...@@ -245,8 +280,13 @@ void fromDBLtoFLT(void* dst, const void* src) ...@@ -245,8 +280,13 @@ void fromDBLtoFLT(void* dst, const void* src)
static static
void fromDBLtoHLF(void* dst, const void* src) void fromDBLtoHLF(void* dst, const void* src)
{ {
#ifndef CMS_NO_HALF_SUPPORT
cmsFloat32Number n = (cmsFloat32Number) *(cmsFloat64Number*)src; cmsFloat32Number n = (cmsFloat32Number) *(cmsFloat64Number*)src;
*(cmsUInt16Number*)dst = _cmsFloat2Half(n); *(cmsUInt16Number*)dst = _cmsFloat2Half(n);
#else
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
} }
static static
...@@ -260,21 +300,22 @@ void copy64(void* dst, const void* src) ...@@ -260,21 +300,22 @@ void copy64(void* dst, const void* src)
static static
int FormatterPos(cmsUInt32Number frm) int FormatterPos(cmsUInt32Number frm)
{ {
int b = T_BYTES(frm); cmsUInt32Number b = T_BYTES(frm);
if (b == 0 && T_FLOAT(frm))
return 4; // DBL
if (b == 2 && T_FLOAT(frm))
return 2; // HLF
if (b == 4 && T_FLOAT(frm))
return 3; // FLT
if (b == 2 && !T_FLOAT(frm))
return 1; // 16
if (b == 1 && !T_FLOAT(frm))
return 0; // 8
return -1; // not recognized if (b == 0 && T_FLOAT(frm))
return 4; // DBL
#ifndef CMS_NO_HALF_SUPPORT
if (b == 2 && T_FLOAT(frm))
return 2; // HLF
#endif
if (b == 4 && T_FLOAT(frm))
return 3; // FLT
if (b == 2 && !T_FLOAT(frm))
return 1; // 16
if (b == 1 && !T_FLOAT(frm))
return 0; // 8
return -1; // not recognized
} }
// Obtains a alpha-to-alpha funmction formatter // Obtains a alpha-to-alpha funmction formatter
...@@ -310,12 +351,12 @@ void ComputeIncrementsForChunky(cmsUInt32Number Format, ...@@ -310,12 +351,12 @@ void ComputeIncrementsForChunky(cmsUInt32Number Format,
cmsUInt32Number ComponentPointerIncrements[]) cmsUInt32Number ComponentPointerIncrements[])
{ {
cmsUInt32Number channels[cmsMAXCHANNELS]; cmsUInt32Number channels[cmsMAXCHANNELS];
int extra = T_EXTRA(Format); cmsUInt32Number extra = T_EXTRA(Format);
int nchannels = T_CHANNELS(Format); cmsUInt32Number nchannels = T_CHANNELS(Format);
int total_chans = nchannels + extra; cmsUInt32Number total_chans = nchannels + extra;
int i; cmsUInt32Number i;
int channelSize = trueBytesSize(Format); cmsUInt32Number channelSize = trueBytesSize(Format);
int pixelSize = channelSize * total_chans; cmsUInt32Number pixelSize = channelSize * total_chans;
// Sanity check // Sanity check
if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS) if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS)
...@@ -368,11 +409,11 @@ void ComputeIncrementsForPlanar(cmsUInt32Number Format, ...@@ -368,11 +409,11 @@ void ComputeIncrementsForPlanar(cmsUInt32Number Format,
cmsUInt32Number ComponentPointerIncrements[]) cmsUInt32Number ComponentPointerIncrements[])
{ {
cmsUInt32Number channels[cmsMAXCHANNELS]; cmsUInt32Number channels[cmsMAXCHANNELS];
int extra = T_EXTRA(Format); cmsUInt32Number extra = T_EXTRA(Format);
int nchannels = T_CHANNELS(Format); cmsUInt32Number nchannels = T_CHANNELS(Format);
int total_chans = nchannels + extra; cmsUInt32Number total_chans = nchannels + extra;
int i; cmsUInt32Number i;
int channelSize = trueBytesSize(Format); cmsUInt32Number channelSize = trueBytesSize(Format);
// Sanity check // Sanity check
if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS) if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS)
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -392,11 +392,12 @@ cmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off) ...@@ -392,11 +392,12 @@ cmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off)
// Compute the conversion layer // Compute the conversion layer
static static
cmsBool ComputeConversion(int i, cmsHPROFILE hProfiles[], cmsBool ComputeConversion(cmsUInt32Number i,
cmsUInt32Number Intent, cmsHPROFILE hProfiles[],
cmsBool BPC, cmsUInt32Number Intent,
cmsFloat64Number AdaptationState, cmsBool BPC,
cmsMAT3* m, cmsVEC3* off) cmsFloat64Number AdaptationState,
cmsMAT3* m, cmsVEC3* off)
{ {
int k; int k;
...@@ -708,7 +709,7 @@ cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID, ...@@ -708,7 +709,7 @@ cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID,
// Translate black-preserving intents to ICC ones // Translate black-preserving intents to ICC ones
static static
int TranslateNonICCIntents(int Intent) cmsUInt32Number TranslateNonICCIntents(cmsUInt32Number Intent)
{ {
switch (Intent) { switch (Intent) {
case INTENT_PRESERVE_K_ONLY_PERCEPTUAL: case INTENT_PRESERVE_K_ONLY_PERCEPTUAL:
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -83,9 +83,11 @@ long int CMSEXPORT cmsfilelength(FILE* f) ...@@ -83,9 +83,11 @@ long int CMSEXPORT cmsfilelength(FILE* f)
long int p , n; long int p , n;
p = ftell(f); // register current file position p = ftell(f); // register current file position
if (p == -1L)
return -1L;
if (fseek(f, 0, SEEK_END) != 0) { if (fseek(f, 0, SEEK_END) != 0) {
return -1; return -1L;
} }
n = ftell(f); n = ftell(f);
...@@ -115,7 +117,7 @@ cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plug ...@@ -115,7 +117,7 @@ cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plug
// ********************************************************************************* // *********************************************************************************
// This is the default memory allocation function. It does a very coarse // This is the default memory allocation function. It does a very coarse
// check of amout of memory, just to prevent exploits // check of amount of memory, just to prevent exploits
static static
void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size) void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size)
{ {
...@@ -222,7 +224,7 @@ void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsCo ...@@ -222,7 +224,7 @@ void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsCo
} }
else { else {
// To reset it, we use the default allocators, which cannot be overriden // To reset it, we use the default allocators, which cannot be overridden
ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager; ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;
} }
} }
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -326,7 +326,7 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, ...@@ -326,7 +326,7 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
cmsStage* CLUT; cmsStage* CLUT;
cmsUInt32Number dwFormat; cmsUInt32Number dwFormat;
GAMUTCHAIN Chain; GAMUTCHAIN Chain;
int nChannels, nGridpoints; cmsUInt32Number nChannels, nGridpoints;
cmsColorSpaceSignature ColorSpace; cmsColorSpaceSignature ColorSpace;
cmsUInt32Number i; cmsUInt32Number i;
cmsHPROFILE ProfileList[256]; cmsHPROFILE ProfileList[256];
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -532,7 +532,7 @@ static cmsUInt8Number Shift[512] = { ...@@ -532,7 +532,7 @@ static cmsUInt8Number Shift[512] = {
0x18, 0x18, 0x18, 0x18, 0x0d 0x18, 0x18, 0x18, 0x18, 0x0d
}; };
cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h) cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h)
{ {
union { union {
cmsFloat32Number flt; cmsFloat32Number flt;
...@@ -545,7 +545,7 @@ cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h) ...@@ -545,7 +545,7 @@ cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h)
return out.flt; return out.flt;
} }
cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt) cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt)
{ {
union { union {
cmsFloat32Number flt; cmsFloat32Number flt;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -58,6 +58,13 @@ ...@@ -58,6 +58,13 @@
// This module incorporates several interpolation routines, for 1 to 8 channels on input and // This module incorporates several interpolation routines, for 1 to 8 channels on input and
// up to 65535 channels on output. The user may change those by using the interpolation plug-in // up to 65535 channels on output. The user may change those by using the interpolation plug-in
// Some people may want to compile as C++ with all warnings on, in this case make compiler silent
#ifdef _MSC_VER
# if (_MSC_VER >= 1400)
# pragma warning( disable : 4365 )
# endif
#endif
// Interpolation routines by default // Interpolation routines by default
static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags);
...@@ -131,12 +138,12 @@ cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p) ...@@ -131,12 +138,12 @@ cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p)
// This function precalculates as many parameters as possible to speed up the interpolation. // This function precalculates as many parameters as possible to speed up the interpolation.
cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID,
const cmsUInt32Number nSamples[], const cmsUInt32Number nSamples[],
int InputChan, int OutputChan, cmsUInt32Number InputChan, cmsUInt32Number OutputChan,
const void *Table, const void *Table,
cmsUInt32Number dwFlags) cmsUInt32Number dwFlags)
{ {
cmsInterpParams* p; cmsInterpParams* p;
int i; cmsUInt32Number i;
// Check for maximum inputs // Check for maximum inputs
if (InputChan > MAX_INPUT_DIMENSIONS) { if (InputChan > MAX_INPUT_DIMENSIONS) {
...@@ -180,7 +187,8 @@ cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, ...@@ -180,7 +187,8 @@ cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID,
// This one is a wrapper on the anterior, but assuming all directions have same number of nodes // This one is a wrapper on the anterior, but assuming all directions have same number of nodes
cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags) cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples,
cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags)
{ {
int i; int i;
cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS]; cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS];
...@@ -195,7 +203,7 @@ cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int ...@@ -195,7 +203,7 @@ cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int
// Free all associated memory // Free all associated memory
void _cmsFreeInterpParams(cmsInterpParams* p) void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p)
{ {
if (p != NULL) _cmsFree(p ->ContextID, p); if (p != NULL) _cmsFree(p ->ContextID, p);
} }
...@@ -244,7 +252,7 @@ void LinLerp1D(register const cmsUInt16Number Value[], ...@@ -244,7 +252,7 @@ void LinLerp1D(register const cmsUInt16Number Value[],
// To prevent out of bounds indexing // To prevent out of bounds indexing
cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v)
{ {
return v < 0.0f || v != v ? 0.0f : (v > 1.0f ? 1.0f : v); return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 1.0f ? 1.0f : v);
} }
// Floating-point version of 1D interpolation // Floating-point version of 1D interpolation
...@@ -381,10 +389,10 @@ void BilinearInterpFloat(const cmsFloat32Number Input[], ...@@ -381,10 +389,10 @@ void BilinearInterpFloat(const cmsFloat32Number Input[],
y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
X0 = p -> opta[1] * x0; X0 = p -> opta[1] * x0;
X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[1]); X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[1]);
Y0 = p -> opta[0] * y0; Y0 = p -> opta[0] * y0;
Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[0]); Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[0]);
for (OutChan = 0; OutChan < TotalOut; OutChan++) { for (OutChan = 0; OutChan < TotalOut; OutChan++) {
...@@ -493,18 +501,18 @@ void TrilinearInterpFloat(const cmsFloat32Number Input[], ...@@ -493,18 +501,18 @@ void TrilinearInterpFloat(const cmsFloat32Number Input[],
py = fclamp(Input[1]) * p->Domain[1]; py = fclamp(Input[1]) * p->Domain[1];
pz = fclamp(Input[2]) * p->Domain[2]; pz = fclamp(Input[2]) * p->Domain[2];
x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0; x0 = (int) floor(px); fx = px - (cmsFloat32Number) x0; // We need full floor funcionality here
y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; y0 = (int) floor(py); fy = py - (cmsFloat32Number) y0;
z0 = (int) _cmsQuickFloor(pz); fz = pz - (cmsFloat32Number) z0; z0 = (int) floor(pz); fz = pz - (cmsFloat32Number) z0;
X0 = p -> opta[2] * x0; X0 = p -> opta[2] * x0;
X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]); X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[2]);
Y0 = p -> opta[1] * y0; Y0 = p -> opta[1] * y0;
Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]); Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[1]);
Z0 = p -> opta[0] * z0; Z0 = p -> opta[0] * z0;
Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]); Z1 = Z0 + (fclamp(Input[2]) >= 1.0 ? 0 : p->opta[0]);
for (OutChan = 0; OutChan < TotalOut; OutChan++) { for (OutChan = 0; OutChan < TotalOut; OutChan++) {
...@@ -637,19 +645,19 @@ void TetrahedralInterpFloat(const cmsFloat32Number Input[], ...@@ -637,19 +645,19 @@ void TetrahedralInterpFloat(const cmsFloat32Number Input[],
py = fclamp(Input[1]) * p->Domain[1]; py = fclamp(Input[1]) * p->Domain[1];
pz = fclamp(Input[2]) * p->Domain[2]; pz = fclamp(Input[2]) * p->Domain[2];
x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0); x0 = (int) floor(px); rx = (px - (cmsFloat32Number) x0); // We need full floor functionality here
y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0); y0 = (int) floor(py); ry = (py - (cmsFloat32Number) y0);
z0 = (int) _cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number) z0); z0 = (int) floor(pz); rz = (pz - (cmsFloat32Number) z0);
X0 = p -> opta[2] * x0; X0 = p -> opta[2] * x0;
X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]); X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[2]);
Y0 = p -> opta[1] * y0; Y0 = p -> opta[1] * y0;
Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]); Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[1]);
Z0 = p -> opta[0] * z0; Z0 = p -> opta[0] * z0;
Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]); Z1 = Z0 + (fclamp(Input[2]) >= 1.0 ? 0 : p->opta[0]);
for (OutChan=0; OutChan < TotalOut; OutChan++) { for (OutChan=0; OutChan < TotalOut; OutChan++) {
...@@ -952,13 +960,13 @@ void Eval4Inputs(register const cmsUInt16Number Input[], ...@@ -952,13 +960,13 @@ void Eval4Inputs(register const cmsUInt16Number Input[],
c3 = DENS(X0, Y0, Z1) - c0; c3 = DENS(X0, Y0, Z1) - c0;
} }
else { else {
c1 = c2 = c3 = 0; c1 = c2 = c3 = 0;
} }
Rest = c1 * rx + c2 * ry + c3 * rz; Rest = c1 * rx + c2 * ry + c3 * rz;
Tmp1[OutChan] = (cmsUInt16Number) ( c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))); Tmp1[OutChan] = (cmsUInt16Number)(c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)));
} }
...@@ -1057,7 +1065,7 @@ void Eval4InputsFloat(const cmsFloat32Number Input[], ...@@ -1057,7 +1065,7 @@ void Eval4InputsFloat(const cmsFloat32Number Input[],
rest = pk - (cmsFloat32Number) k0; rest = pk - (cmsFloat32Number) k0;
K0 = p -> opta[3] * k0; K0 = p -> opta[3] * k0;
K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[3]); K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[3]);
p1 = *p; p1 = *p;
memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number)); memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number));
...@@ -1144,7 +1152,7 @@ void Eval5InputsFloat(const cmsFloat32Number Input[], ...@@ -1144,7 +1152,7 @@ void Eval5InputsFloat(const cmsFloat32Number Input[],
rest = pk - (cmsFloat32Number) k0; rest = pk - (cmsFloat32Number) k0;
K0 = p -> opta[4] * k0; K0 = p -> opta[4] * k0;
K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[4]); K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[4]);
p1 = *p; p1 = *p;
memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number)); memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number));
...@@ -1231,7 +1239,7 @@ void Eval6InputsFloat(const cmsFloat32Number Input[], ...@@ -1231,7 +1239,7 @@ void Eval6InputsFloat(const cmsFloat32Number Input[],
rest = pk - (cmsFloat32Number) k0; rest = pk - (cmsFloat32Number) k0;
K0 = p -> opta[5] * k0; K0 = p -> opta[5] * k0;
K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[5]); K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[5]);
p1 = *p; p1 = *p;
memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number)); memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number));
...@@ -1316,7 +1324,7 @@ void Eval7InputsFloat(const cmsFloat32Number Input[], ...@@ -1316,7 +1324,7 @@ void Eval7InputsFloat(const cmsFloat32Number Input[],
rest = pk - (cmsFloat32Number) k0; rest = pk - (cmsFloat32Number) k0;
K0 = p -> opta[6] * k0; K0 = p -> opta[6] * k0;
K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[6]); K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[6]);
p1 = *p; p1 = *p;
memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number)); memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number));
...@@ -1401,7 +1409,7 @@ void Eval8InputsFloat(const cmsFloat32Number Input[], ...@@ -1401,7 +1409,7 @@ void Eval8InputsFloat(const cmsFloat32Number Input[],
rest = pk - (cmsFloat32Number) k0; rest = pk - (cmsFloat32Number) k0;
K0 = p -> opta[7] * k0; K0 = p -> opta[7] * k0;
K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[7]); K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[7]);
p1 = *p; p1 = *p;
memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number)); memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number));
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -366,21 +366,27 @@ cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset) ...@@ -366,21 +366,27 @@ cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
return TRUE; return TRUE;
} }
// Returns file pointer position // Returns file pointer position or 0 on error, which is also a valid position.
static static
cmsUInt32Number FileTell(cmsIOHANDLER* iohandler) cmsUInt32Number FileTell(cmsIOHANDLER* iohandler)
{ {
return (cmsUInt32Number) ftell((FILE*)iohandler ->stream); long t = ftell((FILE*)iohandler ->stream);
if (t == -1L) {
cmsSignalError(iohandler->ContextID, cmsERROR_FILE, "Tell error; probably corrupted file");
return 0;
}
return (cmsUInt32Number)t;
} }
// Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error // Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error
static static
cmsBool FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer) cmsBool FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer)
{ {
if (size == 0) return TRUE; // We allow to write 0 bytes, but nothing is written if (size == 0) return TRUE; // We allow to write 0 bytes, but nothing is written
iohandler->UsedSpace += size; iohandler->UsedSpace += size;
return (fwrite(Buffer, size, 1, (FILE*) iohandler->stream) == 1); return (fwrite(Buffer, size, 1, (FILE*)iohandler->stream) == 1);
} }
// Closes the file // Closes the file
...@@ -548,7 +554,7 @@ cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile) ...@@ -548,7 +554,7 @@ cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile)
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
if (Icc == NULL) return -1; if (Icc == NULL) return -1;
return Icc->TagCount; return (cmsInt32Number) Icc->TagCount;
} }
// Return the tag signature of a given tag number // Return the tag signature of a given tag number
...@@ -566,9 +572,9 @@ cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Numb ...@@ -566,9 +572,9 @@ cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Numb
static static
int SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig) int SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig)
{ {
cmsUInt32Number i; int i;
for (i=0; i < Profile -> TagCount; i++) { for (i=0; i < (int) Profile -> TagCount; i++) {
if (sig == Profile -> TagNames[i]) if (sig == Profile -> TagNames[i])
return i; return i;
...@@ -662,7 +668,7 @@ cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos) ...@@ -662,7 +668,7 @@ cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos)
return FALSE; return FALSE;
} }
*NewPos = Icc ->TagCount; *NewPos = (int) Icc ->TagCount;
Icc -> TagCount++; Icc -> TagCount++;
} }
...@@ -693,10 +699,10 @@ cmsUInt32Number _validatedVersion(cmsUInt32Number DWord) ...@@ -693,10 +699,10 @@ cmsUInt32Number _validatedVersion(cmsUInt32Number DWord)
cmsUInt8Number temp2; cmsUInt8Number temp2;
if (*pByte > 0x09) *pByte = (cmsUInt8Number) 0x09; if (*pByte > 0x09) *pByte = (cmsUInt8Number) 0x09;
temp1 = *(pByte+1) & 0xf0; temp1 = (cmsUInt8Number) (*(pByte+1) & 0xf0);
temp2 = *(pByte+1) & 0x0f; temp2 = (cmsUInt8Number) (*(pByte+1) & 0x0f);
if (temp1 > 0x90) temp1 = 0x90; if (temp1 > 0x90U) temp1 = 0x90U;
if (temp2 > 0x09) temp2 = 0x09; if (temp2 > 0x09U) temp2 = 0x09U;
*(pByte+1) = (cmsUInt8Number)(temp1 | temp2); *(pByte+1) = (cmsUInt8Number)(temp1 | temp2);
*(pByte+2) = (cmsUInt8Number)0; *(pByte+2) = (cmsUInt8Number)0;
*(pByte+3) = (cmsUInt8Number)0; *(pByte+3) = (cmsUInt8Number)0;
...@@ -804,7 +810,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) ...@@ -804,7 +810,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
cmsICCHeader Header; cmsICCHeader Header;
cmsUInt32Number i; cmsUInt32Number i;
cmsTagEntry Tag; cmsTagEntry Tag;
cmsInt32Number Count = 0; cmsUInt32Number Count;
Header.size = _cmsAdjustEndianess32(UsedSpace); Header.size = _cmsAdjustEndianess32(UsedSpace);
Header.cmmId = _cmsAdjustEndianess32(lcmsSignature); Header.cmmId = _cmsAdjustEndianess32(lcmsSignature);
...@@ -835,9 +841,9 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) ...@@ -835,9 +841,9 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent); Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent);
// Illuminant is always D50 // Illuminant is always D50
Header.illuminant.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->X)); Header.illuminant.X = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->X));
Header.illuminant.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y)); Header.illuminant.Y = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y));
Header.illuminant.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z)); Header.illuminant.Z = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z));
// Created by LittleCMS (that's me!) // Created by LittleCMS (that's me!)
Header.creator = _cmsAdjustEndianess32(lcmsSignature); Header.creator = _cmsAdjustEndianess32(lcmsSignature);
...@@ -853,6 +859,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) ...@@ -853,6 +859,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
// Saves Tag directory // Saves Tag directory
// Get true count // Get true count
Count = 0;
for (i=0; i < Icc -> TagCount; i++) { for (i=0; i < Icc -> TagCount; i++) {
if (Icc ->TagNames[i] != (cmsTagSignature) 0) if (Icc ->TagNames[i] != (cmsTagSignature) 0)
Count++; Count++;
...@@ -865,9 +872,9 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) ...@@ -865,9 +872,9 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
if (Icc ->TagNames[i] == (cmsTagSignature) 0) continue; // It is just a placeholder if (Icc ->TagNames[i] == (cmsTagSignature) 0) continue; // It is just a placeholder
Tag.sig = (cmsTagSignature) _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagNames[i]); Tag.sig = (cmsTagSignature) _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagNames[i]);
Tag.offset = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagOffsets[i]); Tag.offset = _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagOffsets[i]);
Tag.size = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagSizes[i]); Tag.size = _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagSizes[i]);
if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE; if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE;
} }
...@@ -1176,7 +1183,7 @@ cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void* ...@@ -1176,7 +1183,7 @@ cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void*
NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc = (_cmsICCPROFILE*) hEmpty;
// Ok, in this case const void* is casted to void* just because open IO handler // Ok, in this case const void* is casted to void* just because open IO handler
// shares read and writting modes. Don't abuse this feature! // shares read and writing modes. Don't abuse this feature!
NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, "r"); NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, "r");
if (NewIcc ->IOhandler == NULL) goto Error; if (NewIcc ->IOhandler == NULL) goto Error;
...@@ -1466,7 +1473,7 @@ cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) ...@@ -1466,7 +1473,7 @@ cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)
// Was open in write mode? // Was open in write mode?
if (Icc ->IsWrite) { if (Icc ->IsWrite) {
Icc ->IsWrite = FALSE; // Assure no further writting Icc ->IsWrite = FALSE; // Assure no further writing
rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile); rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile);
} }
...@@ -1543,11 +1550,15 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) ...@@ -1543,11 +1550,15 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
// If the element is already in memory, return the pointer // If the element is already in memory, return the pointer
if (Icc -> TagPtrs[n]) { if (Icc -> TagPtrs[n]) {
if (Icc -> TagTypeHandlers[n] == NULL) goto Error; if (Icc->TagTypeHandlers[n] == NULL) goto Error;
BaseType = Icc -> TagTypeHandlers[n]->Signature;
// Sanity check
BaseType = Icc->TagTypeHandlers[n]->Signature;
if (BaseType == 0) goto Error; if (BaseType == 0) goto Error;
TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);
TagDescriptor = _cmsGetTagDescriptor(Icc->ContextID, sig);
if (TagDescriptor == NULL) goto Error; if (TagDescriptor == NULL) goto Error;
if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error; if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error;
if (Icc ->TagSaveAsRaw[n]) goto Error; // We don't support read raw tags as cooked if (Icc ->TagSaveAsRaw[n]) goto Error; // We don't support read raw tags as cooked
...@@ -1560,6 +1571,8 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) ...@@ -1560,6 +1571,8 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
Offset = Icc -> TagOffsets[n]; Offset = Icc -> TagOffsets[n];
TagSize = Icc -> TagSizes[n]; TagSize = Icc -> TagSizes[n];
if (TagSize < 8) goto Error;
// Seek to its location // Seek to its location
if (!io -> Seek(io, Offset)) if (!io -> Seek(io, Offset))
goto Error; goto Error;
...@@ -1583,7 +1596,7 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) ...@@ -1583,7 +1596,7 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error; if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error;
TagSize -= 8; // Alredy read by the type base logic TagSize -= 8; // Alredy read by the type base logic
// Get type handler // Get type handler
TypeHandler = _cmsGetTagTypeHandler(Icc ->ContextID, BaseType); TypeHandler = _cmsGetTagTypeHandler(Icc ->ContextID, BaseType);
...@@ -1772,7 +1785,7 @@ Error: ...@@ -1772,7 +1785,7 @@ Error:
// raw data written does not exactly correspond with the raw data proposed to cmsWriteRaw data, but this approach allows // raw data written does not exactly correspond with the raw data proposed to cmsWriteRaw data, but this approach allows
// to write a tag as raw data and the read it as handled. // to write a tag as raw data and the read it as handled.
cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize) cmsUInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize)
{ {
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
void *Object; void *Object;
...@@ -1890,7 +1903,7 @@ Error: ...@@ -1890,7 +1903,7 @@ Error:
} }
// Similar to the anterior. This function allows to write directly to the ICC profile any data, without // Similar to the anterior. This function allows to write directly to the ICC profile any data, without
// checking anything. As a rule, mixing Raw with cooked doesn't work, so writting a tag as raw and then reading // checking anything. As a rule, mixing Raw with cooked doesn't work, so writing a tag as raw and then reading
// it as cooked without serializing does result into an error. If that is what you want, you will need to dump // it as cooked without serializing does result into an error. If that is what you want, you will need to dump
// the profile to memry or disk and then reopen it. // the profile to memry or disk and then reopen it.
cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size) cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size)
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -335,8 +335,8 @@ Error: ...@@ -335,8 +335,8 @@ Error:
// Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc // Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc
// is adjusted here in order to create a LUT that takes care of all those details. // is adjusted here in order to create a LUT that takes care of all those details.
// We add intent = -1 as a way to read matrix shaper always, no matter of other LUT // We add intent = 0xffffffff as a way to read matrix shaper always, no matter of other LUT
cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent) cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
{ {
cmsTagTypeSignature OriginalType; cmsTagTypeSignature OriginalType;
cmsTagSignature tag16; cmsTagSignature tag16;
...@@ -366,8 +366,8 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent) ...@@ -366,8 +366,8 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
} }
// This is an attempt to reuse this function to retrieve the matrix-shaper as pipeline no // This is an attempt to reuse this function to retrieve the matrix-shaper as pipeline no
// matter other LUT are present and have precedence. Intent = -1 means just this. // matter other LUT are present and have precedence. Intent = 0xffffffff can be used for that.
if (Intent >= INTENT_PERCEPTUAL && Intent <= INTENT_ABSOLUTE_COLORIMETRIC) { if (Intent <= INTENT_ABSOLUTE_COLORIMETRIC) {
tag16 = Device2PCS16[Intent]; tag16 = Device2PCS16[Intent];
tagFloat = Device2PCSFloat[Intent]; tagFloat = Device2PCSFloat[Intent];
...@@ -611,7 +611,7 @@ Error: ...@@ -611,7 +611,7 @@ Error:
} }
// Create an output MPE LUT from agiven profile. Version mismatches are handled here // Create an output MPE LUT from agiven profile. Version mismatches are handled here
cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
{ {
cmsTagTypeSignature OriginalType; cmsTagTypeSignature OriginalType;
cmsTagSignature tag16; cmsTagSignature tag16;
...@@ -619,7 +619,7 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) ...@@ -619,7 +619,7 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsContext ContextID = cmsGetProfileContextID(hProfile);
if (Intent >= INTENT_PERCEPTUAL && Intent <= INTENT_ABSOLUTE_COLORIMETRIC) { if (Intent <= INTENT_ABSOLUTE_COLORIMETRIC) {
tag16 = PCS2Device16[Intent]; tag16 = PCS2Device16[Intent];
tagFloat = PCS2DeviceFloat[Intent]; tagFloat = PCS2DeviceFloat[Intent];
...@@ -695,8 +695,8 @@ Error: ...@@ -695,8 +695,8 @@ Error:
static static
cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
{ {
cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsContext ContextID = cmsGetProfileContextID(hProfile);
cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*)cmsReadTag(hProfile, tagFloat));
cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
...@@ -714,17 +714,17 @@ cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature ta ...@@ -714,17 +714,17 @@ cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature ta
goto Error; goto Error;
} }
if (PCS == cmsSigLabData) if (PCS == cmsSigLabData)
{
if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
goto Error;
}
else
if (PCS == cmsSigXYZData)
{ {
if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
goto Error; goto Error;
} }
else
if (PCS == cmsSigXYZData)
{
if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
goto Error;
}
return Lut; return Lut;
Error: Error:
...@@ -734,7 +734,7 @@ Error: ...@@ -734,7 +734,7 @@ Error:
// This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
// tag name here may default to AToB0 // tag name here may default to AToB0
cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent) cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
{ {
cmsPipeline* Lut; cmsPipeline* Lut;
cmsTagTypeSignature OriginalType; cmsTagTypeSignature OriginalType;
...@@ -743,7 +743,7 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent) ...@@ -743,7 +743,7 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsContext ContextID = cmsGetProfileContextID(hProfile);
if (Intent < INTENT_PERCEPTUAL || Intent > INTENT_ABSOLUTE_COLORIMETRIC) if (Intent > INTENT_ABSOLUTE_COLORIMETRIC)
return NULL; return NULL;
tag16 = Device2PCS16[Intent]; tag16 = Device2PCS16[Intent];
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -153,8 +153,8 @@ cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cms ...@@ -153,8 +153,8 @@ cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cms
mpe = Lut ->Elements; mpe = Lut ->Elements;
for (i=0; i < n; i++) { for (i=0; i < n; i++) {
// Get asked type // Get asked type. cmsStageSignature is promoted to int by compiler
Type = (cmsStageSignature)va_arg(args, cmsStageSignature); Type = (cmsStageSignature)va_arg(args, int);
if (mpe ->Type != Type) { if (mpe ->Type != Type) {
va_end(args); // Mismatch. We are done. va_end(args); // Mismatch. We are done.
...@@ -321,7 +321,7 @@ cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Numbe ...@@ -321,7 +321,7 @@ cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Numbe
// Create a bunch of identity curves // Create a bunch of identity curves
cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels) cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels)
{ {
cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL); cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL);
...@@ -443,13 +443,13 @@ cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number R ...@@ -443,13 +443,13 @@ cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number R
if (Offset != NULL) { if (Offset != NULL) {
NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Cols, sizeof(cmsFloat64Number)); NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Rows, sizeof(cmsFloat64Number));
if (NewElem->Offset == NULL) { if (NewElem->Offset == NULL) {
MatrixElemTypeFree(NewMPE); MatrixElemTypeFree(NewMPE);
return NULL; return NULL;
} }
for (i=0; i < Cols; i++) { for (i=0; i < Rows; i++) {
NewElem ->Offset[i] = Offset[i]; NewElem ->Offset[i] = Offset[i];
} }
...@@ -741,7 +741,7 @@ int IdentitySampler(register const cmsUInt16Number In[], register cmsUInt16Numbe ...@@ -741,7 +741,7 @@ int IdentitySampler(register const cmsUInt16Number In[], register cmsUInt16Numbe
} }
// Creates an MPE that just copies input to output // Creates an MPE that just copies input to output
cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan) cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan)
{ {
cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
cmsStage* mpe ; cmsStage* mpe ;
...@@ -765,7 +765,7 @@ cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan) ...@@ -765,7 +765,7 @@ cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan)
// Quantize a value 0 <= i < MaxSamples to 0..0xffff // Quantize a value 0 <= i < MaxSamples to 0..0xffff
cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples) cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples)
{ {
cmsFloat64Number x; cmsFloat64Number x;
...@@ -778,8 +778,9 @@ cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples) ...@@ -778,8 +778,9 @@ cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples)
// function on knots. returns TRUE if all ok, FALSE otherwise. // function on knots. returns TRUE if all ok, FALSE otherwise.
cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags) cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags)
{ {
int i, t, nTotalPoints, index, rest; int i, t, index, rest;
int nInputs, nOutputs; cmsUInt32Number nTotalPoints;
cmsUInt32Number nInputs, nOutputs;
cmsUInt32Number* nSamples; cmsUInt32Number* nSamples;
cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
_cmsStageCLutData* clut; _cmsStageCLutData* clut;
...@@ -799,14 +800,17 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v ...@@ -799,14 +800,17 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v
if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE; if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
memset(In, 0, sizeof(In));
memset(Out, 0, sizeof(Out));
nTotalPoints = CubeSize(nSamples, nInputs); nTotalPoints = CubeSize(nSamples, nInputs);
if (nTotalPoints == 0) return FALSE; if (nTotalPoints == 0) return FALSE;
index = 0; index = 0;
for (i = 0; i < nTotalPoints; i++) { for (i = 0; i < (int) nTotalPoints; i++) {
rest = i; rest = i;
for (t = nInputs-1; t >=0; --t) { for (t = (int)nInputs - 1; t >= 0; --t) {
cmsUInt32Number Colorant = rest % nSamples[t]; cmsUInt32Number Colorant = rest % nSamples[t];
...@@ -816,7 +820,7 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v ...@@ -816,7 +820,7 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v
} }
if (clut ->Tab.T != NULL) { if (clut ->Tab.T != NULL) {
for (t=0; t < nOutputs; t++) for (t = 0; t < (int)nOutputs; t++)
Out[t] = clut->Tab.T[index + t]; Out[t] = clut->Tab.T[index + t];
} }
...@@ -826,7 +830,7 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v ...@@ -826,7 +830,7 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v
if (!(dwFlags & SAMPLER_INSPECT)) { if (!(dwFlags & SAMPLER_INSPECT)) {
if (clut ->Tab.T != NULL) { if (clut ->Tab.T != NULL) {
for (t=0; t < nOutputs; t++) for (t=0; t < (int) nOutputs; t++)
clut->Tab.T[index + t] = Out[t]; clut->Tab.T[index + t] = Out[t];
} }
} }
...@@ -837,11 +841,12 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v ...@@ -837,11 +841,12 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v
return TRUE; return TRUE;
} }
// Same as anterior, but for floting point // Same as anterior, but for floating point
cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags) cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags)
{ {
int i, t, nTotalPoints, index, rest; int i, t, index, rest;
int nInputs, nOutputs; cmsUInt32Number nTotalPoints;
cmsUInt32Number nInputs, nOutputs;
cmsUInt32Number* nSamples; cmsUInt32Number* nSamples;
cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
_cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data; _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data;
...@@ -859,10 +864,10 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler ...@@ -859,10 +864,10 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler
if (nTotalPoints == 0) return FALSE; if (nTotalPoints == 0) return FALSE;
index = 0; index = 0;
for (i = 0; i < nTotalPoints; i++) { for (i = 0; i < (int)nTotalPoints; i++) {
rest = i; rest = i;
for (t = nInputs-1; t >=0; --t) { for (t = (int) nInputs-1; t >=0; --t) {
cmsUInt32Number Colorant = rest % nSamples[t]; cmsUInt32Number Colorant = rest % nSamples[t];
...@@ -872,7 +877,7 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler ...@@ -872,7 +877,7 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler
} }
if (clut ->Tab.TFloat != NULL) { if (clut ->Tab.TFloat != NULL) {
for (t=0; t < nOutputs; t++) for (t=0; t < (int) nOutputs; t++)
Out[t] = clut->Tab.TFloat[index + t]; Out[t] = clut->Tab.TFloat[index + t];
} }
...@@ -882,7 +887,7 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler ...@@ -882,7 +887,7 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler
if (!(dwFlags & SAMPLER_INSPECT)) { if (!(dwFlags & SAMPLER_INSPECT)) {
if (clut ->Tab.TFloat != NULL) { if (clut ->Tab.TFloat != NULL) {
for (t=0; t < nOutputs; t++) for (t=0; t < (int) nOutputs; t++)
clut->Tab.TFloat[index + t] = Out[t]; clut->Tab.TFloat[index + t] = Out[t];
} }
} }
...@@ -900,7 +905,8 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler ...@@ -900,7 +905,8 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler
cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
cmsSAMPLER16 Sampler, void * Cargo) cmsSAMPLER16 Sampler, void * Cargo)
{ {
int i, t, nTotalPoints, rest; int i, t, rest;
cmsUInt32Number nTotalPoints;
cmsUInt16Number In[cmsMAXCHANNELS]; cmsUInt16Number In[cmsMAXCHANNELS];
if (nInputs >= cmsMAXCHANNELS) return FALSE; if (nInputs >= cmsMAXCHANNELS) return FALSE;
...@@ -908,10 +914,10 @@ cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number ...@@ -908,10 +914,10 @@ cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number
nTotalPoints = CubeSize(clutPoints, nInputs); nTotalPoints = CubeSize(clutPoints, nInputs);
if (nTotalPoints == 0) return FALSE; if (nTotalPoints == 0) return FALSE;
for (i = 0; i < nTotalPoints; i++) { for (i = 0; i < (int) nTotalPoints; i++) {
rest = i; rest = i;
for (t = nInputs-1; t >=0; --t) { for (t = (int) nInputs-1; t >=0; --t) {
cmsUInt32Number Colorant = rest % clutPoints[t]; cmsUInt32Number Colorant = rest % clutPoints[t];
...@@ -930,7 +936,8 @@ cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number ...@@ -930,7 +936,8 @@ cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number
cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
cmsSAMPLERFLOAT Sampler, void * Cargo) cmsSAMPLERFLOAT Sampler, void * Cargo)
{ {
int i, t, nTotalPoints, rest; int i, t, rest;
cmsUInt32Number nTotalPoints;
cmsFloat32Number In[cmsMAXCHANNELS]; cmsFloat32Number In[cmsMAXCHANNELS];
if (nInputs >= cmsMAXCHANNELS) return FALSE; if (nInputs >= cmsMAXCHANNELS) return FALSE;
...@@ -938,10 +945,10 @@ cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUI ...@@ -938,10 +945,10 @@ cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUI
nTotalPoints = CubeSize(clutPoints, nInputs); nTotalPoints = CubeSize(clutPoints, nInputs);
if (nTotalPoints == 0) return FALSE; if (nTotalPoints == 0) return FALSE;
for (i = 0; i < nTotalPoints; i++) { for (i = 0; i < (int) nTotalPoints; i++) {
rest = i; rest = i;
for (t = nInputs-1; t >=0; --t) { for (t = (int) nInputs-1; t >=0; --t) {
cmsUInt32Number Colorant = rest % clutPoints[t]; cmsUInt32Number Colorant = rest % clutPoints[t];
...@@ -991,7 +998,7 @@ void EvaluateLab2XYZ(const cmsFloat32Number In[], ...@@ -991,7 +998,7 @@ void EvaluateLab2XYZ(const cmsFloat32Number In[],
// No dup or free routines needed, as the structure has no pointers in it. // No dup or free routines needed, as the structure has no pointers in it.
cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID) cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID)
{ {
return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL); return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL);
} }
...@@ -1021,7 +1028,7 @@ cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID) ...@@ -1021,7 +1028,7 @@ cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID)
return NULL; return NULL;
} }
// We need to map * (0xffff / 0xff00), thats same as (257 / 256) // We need to map * (0xffff / 0xff00), that's same as (257 / 256)
// So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256); // So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256);
for (i=0; i < 257; i++) { for (i=0; i < 257; i++) {
...@@ -1042,7 +1049,7 @@ cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID) ...@@ -1042,7 +1049,7 @@ cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID)
// ******************************************************************************** // ********************************************************************************
// Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles // Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles
cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID) cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID)
{ {
static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0, static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0,
0, 65535.0/65280.0, 0, 0, 65535.0/65280.0, 0,
...@@ -1058,7 +1065,7 @@ cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID) ...@@ -1058,7 +1065,7 @@ cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID)
// Reverse direction // Reverse direction
cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID) cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID)
{ {
static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0, static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0,
0, 65280.0/65535.0, 0, 0, 65280.0/65535.0, 0,
...@@ -1166,7 +1173,7 @@ void Clipper(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage ...@@ -1166,7 +1173,7 @@ void Clipper(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage
} }
} }
cmsStage* _cmsStageClipNegatives(cmsContext ContextID, int nChannels) cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels)
{ {
return _cmsStageAllocPlaceholder(ContextID, cmsSigClipNegativesElemType, return _cmsStageAllocPlaceholder(ContextID, cmsSigClipNegativesElemType,
nChannels, nChannels, Clipper, NULL, NULL, NULL); nChannels, nChannels, Clipper, NULL, NULL, NULL);
...@@ -1201,7 +1208,7 @@ void EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const ...@@ -1201,7 +1208,7 @@ void EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const
cmsUNUSED_PARAMETER(mpe); cmsUNUSED_PARAMETER(mpe);
} }
cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID) cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID)
{ {
return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL); return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL);
...@@ -1300,23 +1307,42 @@ cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe) ...@@ -1300,23 +1307,42 @@ cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe)
// *********************************************************************************************************** // ***********************************************************************************************************
// This function sets up the channel count // This function sets up the channel count
static static
void BlessLUT(cmsPipeline* lut) cmsBool BlessLUT(cmsPipeline* lut)
{ {
// We can set the input/ouput channels only if we have elements. // We can set the input/output channels only if we have elements.
if (lut ->Elements != NULL) { if (lut ->Elements != NULL) {
cmsStage *First, *Last; cmsStage* prev;
cmsStage* next;
cmsStage* First;
cmsStage* Last;
First = cmsPipelineGetPtrToFirstStage(lut); First = cmsPipelineGetPtrToFirstStage(lut);
Last = cmsPipelineGetPtrToLastStage(lut); Last = cmsPipelineGetPtrToLastStage(lut);
if (First != NULL)lut ->InputChannels = First ->InputChannels; if (First == NULL || Last == NULL) return FALSE;
if (Last != NULL) lut ->OutputChannels = Last ->OutputChannels;
lut->InputChannels = First->InputChannels;
lut->OutputChannels = Last->OutputChannels;
// Check chain consistency
prev = First;
next = prev->Next;
while (next != NULL)
{
if (next->InputChannels != prev->OutputChannels)
return FALSE;
next = next->Next;
prev = prev->Next;
} }
} }
return TRUE;
}
// Default to evaluate the LUT on 16 bit-basis. Precision is retained. // Default to evaluate the LUT on 16 bit-basis. Precision is retained.
static static
...@@ -1368,21 +1394,18 @@ void _LUTevalFloat(register const cmsFloat32Number In[], register cmsFloat32Numb ...@@ -1368,21 +1394,18 @@ void _LUTevalFloat(register const cmsFloat32Number In[], register cmsFloat32Numb
} }
// LUT Creation & Destruction // LUT Creation & Destruction
cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels) cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels)
{ {
cmsPipeline* NewLUT; cmsPipeline* NewLUT;
// A value of zero in channels is allowed as placeholder
if (InputChannels >= cmsMAXCHANNELS || if (InputChannels >= cmsMAXCHANNELS ||
OutputChannels >= cmsMAXCHANNELS) return NULL; OutputChannels >= cmsMAXCHANNELS) return NULL;
NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline)); NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline));
if (NewLUT == NULL) return NULL; if (NewLUT == NULL) return NULL;
NewLUT -> InputChannels = InputChannels; NewLUT -> InputChannels = InputChannels;
NewLUT -> OutputChannels = OutputChannels; NewLUT -> OutputChannels = OutputChannels;
...@@ -1393,7 +1416,11 @@ cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number In ...@@ -1393,7 +1416,11 @@ cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number In
NewLUT ->Data = NewLUT; NewLUT ->Data = NewLUT;
NewLUT ->ContextID = ContextID; NewLUT ->ContextID = ContextID;
BlessLUT(NewLUT); if (!BlessLUT(NewLUT))
{
_cmsFree(ContextID, NewLUT);
return NULL;
}
return NewLUT; return NewLUT;
} }
...@@ -1500,7 +1527,12 @@ cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut) ...@@ -1500,7 +1527,12 @@ cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut)
NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits; NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits;
BlessLUT(NewLUT); if (!BlessLUT(NewLUT))
{
_cmsFree(lut->ContextID, NewLUT);
return NULL;
}
return NewLUT; return NewLUT;
} }
...@@ -1537,8 +1569,7 @@ int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage ...@@ -1537,8 +1569,7 @@ int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage
return FALSE; return FALSE;
} }
BlessLUT(lut); return BlessLUT(lut);
return TRUE;
} }
// Unlink an element and return the pointer to it // Unlink an element and return the pointer to it
...@@ -1593,6 +1624,7 @@ void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStag ...@@ -1593,6 +1624,7 @@ void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStag
else else
cmsStageFree(Unlinked); cmsStageFree(Unlinked);
// May fail, but we ignore it
BlessLUT(lut); BlessLUT(lut);
} }
...@@ -1619,8 +1651,7 @@ cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2) ...@@ -1619,8 +1651,7 @@ cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2)
return FALSE; return FALSE;
} }
BlessLUT(l1); return BlessLUT(l1);
return TRUE;
} }
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -156,7 +156,7 @@ int SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number Co ...@@ -156,7 +156,7 @@ int SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number Co
for (i=0; i < mlu ->UsedEntries; i++) { for (i=0; i < mlu ->UsedEntries; i++) {
if (mlu ->Entries[i].Country == CountryCode && if (mlu ->Entries[i].Country == CountryCode &&
mlu ->Entries[i].Language == LanguageCode) return i; mlu ->Entries[i].Language == LanguageCode) return (int) i;
} }
// Not found // Not found
...@@ -207,31 +207,24 @@ cmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block, ...@@ -207,31 +207,24 @@ cmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block,
return TRUE; return TRUE;
} }
// Convert from a 3-char code to a cmsUInt16Number. It is done inthis way because some // Convert from a 3-char code to a cmsUInt16Number. It is done in this way because some
// compilers don't properly align beginning of strings // compilers don't properly align beginning of strings
static static
cmsUInt16Number strTo16(const char str[3]) cmsUInt16Number strTo16(const char str[3])
{ {
cmsUInt16Number n = ((cmsUInt16Number) str[0] << 8) | str[1]; const cmsUInt8Number* ptr8 = (const cmsUInt8Number*)str;
cmsUInt16Number n = (cmsUInt16Number)(((cmsUInt16Number)ptr8[0] << 8) | ptr8[1]);
return n; // Always big endian in this case return n;
} }
static static
void strFrom16(char str[3], cmsUInt16Number n) void strFrom16(char str[3], cmsUInt16Number n)
{ {
// Assiming this would be aligned str[0] = (char)(n >> 8);
union { str[1] = (char)n;
str[2] = (char)0;
cmsUInt16Number n;
char str[2];
} c;
c.n = n; // Always big endian in this case
str[0] = c.str[0]; str[1] = c.str[1]; str[2] = 0;
} }
...@@ -354,7 +347,7 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu, ...@@ -354,7 +347,7 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu,
cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode) cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode)
{ {
cmsUInt32Number i; cmsUInt32Number i;
cmsInt32Number Best = -1; int Best = -1;
_cmsMLUentry* v; _cmsMLUentry* v;
if (mlu == NULL) return NULL; if (mlu == NULL) return NULL;
...@@ -367,7 +360,7 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu, ...@@ -367,7 +360,7 @@ const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu,
if (v -> Language == LanguageCode) { if (v -> Language == LanguageCode) {
if (Best == -1) Best = i; if (Best == -1) Best = (int) i;
if (v -> Country == CountryCode) { if (v -> Country == CountryCode) {
...@@ -633,10 +626,10 @@ cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList, ...@@ -633,10 +626,10 @@ cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList,
} }
for (i=0; i < NamedColorList ->ColorantCount; i++) for (i=0; i < NamedColorList ->ColorantCount; i++)
NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL? 0 : Colorant[i]; NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL ? (cmsUInt16Number)0 : Colorant[i];
for (i=0; i < 3; i++) for (i=0; i < 3; i++)
NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? 0 : PCS[i]; NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? (cmsUInt16Number) 0 : PCS[i];
if (Name != NULL) { if (Name != NULL) {
...@@ -671,6 +664,7 @@ cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cm ...@@ -671,6 +664,7 @@ cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cm
if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE; if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE;
// strcpy instead of strncpy because many apps are using small buffers
if (Name) strcpy(Name, NamedColorList->List[nColor].Name); if (Name) strcpy(Name, NamedColorList->List[nColor].Name);
if (Prefix) strcpy(Prefix, NamedColorList->Prefix); if (Prefix) strcpy(Prefix, NamedColorList->Prefix);
if (Suffix) strcpy(Suffix, NamedColorList->Suffix); if (Suffix) strcpy(Suffix, NamedColorList->Suffix);
...@@ -688,13 +682,14 @@ cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cm ...@@ -688,13 +682,14 @@ cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cm
// Search for a given color name (no prefix or suffix) // Search for a given color name (no prefix or suffix)
cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name) cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name)
{ {
int i, n; cmsUInt32Number i;
cmsUInt32Number n;
if (NamedColorList == NULL) return -1; if (NamedColorList == NULL) return -1;
n = cmsNamedColorCount(NamedColorList); n = cmsNamedColorCount(NamedColorList);
for (i=0; i < n; i++) { for (i=0; i < n; i++) {
if (cmsstrcasecmp(Name, NamedColorList->List[i].Name) == 0) if (cmsstrcasecmp(Name, NamedColorList->List[i].Name) == 0)
return i; return (cmsInt32Number) i;
} }
return -1; return -1;
...@@ -723,7 +718,8 @@ void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], cons ...@@ -723,7 +718,8 @@ void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], cons
cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0);
if (index >= NamedColorList-> nColors) { if (index >= NamedColorList-> nColors) {
cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index); cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range", index);
Out[0] = Out[1] = Out[2] = 0.0f;
} }
else { else {
...@@ -742,7 +738,10 @@ void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const c ...@@ -742,7 +738,10 @@ void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const c
cmsUInt32Number j; cmsUInt32Number j;
if (index >= NamedColorList-> nColors) { if (index >= NamedColorList-> nColors) {
cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index); cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range", index);
for (j = 0; j < NamedColorList->ColorantCount; j++)
Out[j] = 0.0f;
} }
else { else {
for (j=0; j < NamedColorList ->ColorantCount; j++) for (j=0; j < NamedColorList ->ColorantCount; j++)
...@@ -752,7 +751,7 @@ void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const c ...@@ -752,7 +751,7 @@ void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const c
// Named color lookup element // Named color lookup element
cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS) cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS)
{ {
return _cmsStageAllocPlaceholder(NamedColorList ->ContextID, return _cmsStageAllocPlaceholder(NamedColorList ->ContextID,
cmsSigNamedColorElemType, cmsSigNamedColorElemType,
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -78,8 +78,8 @@ typedef struct { ...@@ -78,8 +78,8 @@ typedef struct {
cmsContext ContextID; cmsContext ContextID;
// Number of channels // Number of channels
int nInputs; cmsUInt32Number nInputs;
int nOutputs; cmsUInt32Number nOutputs;
_cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance
cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS]; cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS];
...@@ -123,8 +123,8 @@ typedef struct { ...@@ -123,8 +123,8 @@ typedef struct {
cmsContext ContextID; cmsContext ContextID;
int nCurves; // Number of curves cmsUInt32Number nCurves; // Number of curves
int nElements; // Elements in curves cmsUInt32Number nElements; // Elements in curves
cmsUInt16Number** Curves; // Points to a dynamically allocated array cmsUInt16Number** Curves; // Points to a dynamically allocated array
} Curves16Data; } Curves16Data;
...@@ -245,7 +245,7 @@ cmsBool _MultiplyMatrix(cmsPipeline* Lut) ...@@ -245,7 +245,7 @@ cmsBool _MultiplyMatrix(cmsPipeline* Lut)
// Multiply both matrices to get the result // Multiply both matrices to get the result
_cmsMAT3per(&res, (cmsMAT3*)m2->Double, (cmsMAT3*)m1->Double); _cmsMAT3per(&res, (cmsMAT3*)m2->Double, (cmsMAT3*)m1->Double);
// Get the next in chain afer the matrices // Get the next in chain after the matrices
chain = (*pt2)->Next; chain = (*pt2)->Next;
// Remove both matrices // Remove both matrices
...@@ -334,7 +334,7 @@ void PrelinEval16(register const cmsUInt16Number Input[], ...@@ -334,7 +334,7 @@ void PrelinEval16(register const cmsUInt16Number Input[],
Prelin16Data* p16 = (Prelin16Data*) D; Prelin16Data* p16 = (Prelin16Data*) D;
cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS]; cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS];
cmsUInt16Number StageDEF[cmsMAXCHANNELS]; cmsUInt16Number StageDEF[cmsMAXCHANNELS];
int i; cmsUInt32Number i;
for (i=0; i < p16 ->nInputs; i++) { for (i=0; i < p16 ->nInputs; i++) {
...@@ -379,15 +379,15 @@ void* Prelin16dup(cmsContext ContextID, const void* ptr) ...@@ -379,15 +379,15 @@ void* Prelin16dup(cmsContext ContextID, const void* ptr)
static static
Prelin16Data* PrelinOpt16alloc(cmsContext ContextID, Prelin16Data* PrelinOpt16alloc(cmsContext ContextID,
const cmsInterpParams* ColorMap, const cmsInterpParams* ColorMap,
int nInputs, cmsToneCurve** In, cmsUInt32Number nInputs, cmsToneCurve** In,
int nOutputs, cmsToneCurve** Out ) cmsUInt32Number nOutputs, cmsToneCurve** Out )
{ {
int i; cmsUInt32Number i;
Prelin16Data* p16 = (Prelin16Data*)_cmsMallocZero(ContextID, sizeof(Prelin16Data)); Prelin16Data* p16 = (Prelin16Data*)_cmsMallocZero(ContextID, sizeof(Prelin16Data));
if (p16 == NULL) return NULL; if (p16 == NULL) return NULL;
p16 ->nInputs = nInputs; p16 ->nInputs = nInputs;
p16 -> nOutputs = nOutputs; p16 ->nOutputs = nOutputs;
for (i=0; i < nInputs; i++) { for (i=0; i < nInputs; i++) {
...@@ -435,7 +435,7 @@ Prelin16Data* PrelinOpt16alloc(cmsContext ContextID, ...@@ -435,7 +435,7 @@ Prelin16Data* PrelinOpt16alloc(cmsContext ContextID,
// Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for // Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for
// almost any transform. We use floating point precision and then convert from floating point to 16 bits. // almost any transform. We use floating point precision and then convert from floating point to 16 bits.
static static
int XFormSampler16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) cmsInt32Number XFormSampler16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
{ {
cmsPipeline* Lut = (cmsPipeline*) Cargo; cmsPipeline* Lut = (cmsPipeline*) Cargo;
cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS];
...@@ -482,7 +482,7 @@ cmsBool AllCurvesAreLinear(cmsStage* mpe) ...@@ -482,7 +482,7 @@ cmsBool AllCurvesAreLinear(cmsStage* mpe)
// is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels // is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels
static static
cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
int nChannelsOut, int nChannelsIn) cmsUInt32Number nChannelsOut, cmsUInt32Number nChannelsIn)
{ {
_cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data; _cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data;
cmsInterpParams* p16 = Grid ->Params; cmsInterpParams* p16 = Grid ->Params;
...@@ -512,10 +512,10 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], ...@@ -512,10 +512,10 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
((pz - z0) != 0) || ((pz - z0) != 0) ||
((pw - w0) != 0)) return FALSE; // Not on exact node ((pw - w0) != 0)) return FALSE; // Not on exact node
index = p16 -> opta[3] * x0 + index = (int) p16 -> opta[3] * x0 +
p16 -> opta[2] * y0 + (int) p16 -> opta[2] * y0 +
p16 -> opta[1] * z0 + (int) p16 -> opta[1] * z0 +
p16 -> opta[0] * w0; (int) p16 -> opta[0] * w0;
} }
else else
if (nChannelsIn == 3) { if (nChannelsIn == 3) {
...@@ -532,9 +532,9 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], ...@@ -532,9 +532,9 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
((py - y0) != 0) || ((py - y0) != 0) ||
((pz - z0) != 0)) return FALSE; // Not on exact node ((pz - z0) != 0)) return FALSE; // Not on exact node
index = p16 -> opta[2] * x0 + index = (int) p16 -> opta[2] * x0 +
p16 -> opta[1] * y0 + (int) p16 -> opta[1] * y0 +
p16 -> opta[0] * z0; (int) p16 -> opta[0] * z0;
} }
else else
if (nChannelsIn == 1) { if (nChannelsIn == 1) {
...@@ -545,24 +545,24 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], ...@@ -545,24 +545,24 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
if (((px - x0) != 0)) return FALSE; // Not on exact node if (((px - x0) != 0)) return FALSE; // Not on exact node
index = p16 -> opta[0] * x0; index = (int) p16 -> opta[0] * x0;
} }
else { else {
cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn); cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn);
return FALSE; return FALSE;
} }
for (i=0; i < nChannelsOut; i++) for (i = 0; i < (int) nChannelsOut; i++)
Grid -> Tab.T[index + i] = Value[i]; Grid->Tab.T[index + i] = Value[i];
return TRUE; return TRUE;
} }
// Auxiliary, to see if two values are equal or very different // Auxiliary, to see if two values are equal or very different
static static
cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] ) cmsBool WhitesAreEqual(cmsUInt32Number n, cmsUInt16Number White1[], cmsUInt16Number White2[] )
{ {
int i; cmsUInt32Number i;
for (i=0; i < n; i++) { for (i=0; i < n; i++) {
...@@ -664,7 +664,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3 ...@@ -664,7 +664,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3
cmsStage* mpe; cmsStage* mpe;
cmsStage* CLUT; cmsStage* CLUT;
cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL; cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL;
int nGridPoints; cmsUInt32Number nGridPoints;
cmsColorSpaceSignature ColorSpace, OutputColorSpace; cmsColorSpaceSignature ColorSpace, OutputColorSpace;
cmsStage *NewPreLin = NULL; cmsStage *NewPreLin = NULL;
cmsStage *NewPostLin = NULL; cmsStage *NewPostLin = NULL;
...@@ -676,8 +676,13 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3 ...@@ -676,8 +676,13 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3
// This is a loosy optimization! does not apply in floating-point cases // This is a loosy optimization! does not apply in floating-point cases
if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
ColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat)); ColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*InputFormat));
OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat)); OutputColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*OutputFormat));
// Color space must be specified
if (ColorSpace == (cmsColorSpaceSignature)0 ||
OutputColorSpace == (cmsColorSpaceSignature)0) return FALSE;
nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);
// For empty LUTs, 2 points are enough // For empty LUTs, 2 points are enough
...@@ -715,7 +720,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3 ...@@ -715,7 +720,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3
goto Error; goto Error;
// Remove prelinearization. Since we have duplicated the curve // Remove prelinearization. Since we have duplicated the curve
// in destination LUT, the sampling shoud be applied after this stage. // in destination LUT, the sampling should be applied after this stage.
cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin); cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin);
} }
} }
...@@ -723,7 +728,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3 ...@@ -723,7 +728,7 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3
// Allocate the CLUT // Allocate the CLUT
CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL); CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL);
if (CLUT == NULL) return FALSE; if (CLUT == NULL) goto Error;
// Add the CLUT to the destination LUT // Add the CLUT to the destination LUT
if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) { if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) {
...@@ -747,14 +752,14 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3 ...@@ -747,14 +752,14 @@ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt3
if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin)) if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin))
goto Error; goto Error;
// In destination LUT, the sampling shoud be applied after this stage. // In destination LUT, the sampling should be applied after this stage.
cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin); cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin);
} }
} }
} }
// Now its time to do the sampling. We have to ignore pre/post linearization // Now its time to do the sampling. We have to ignore pre/post linearization
// The source LUT whithout pre/post curves is passed as parameter. // The source LUT without pre/post curves is passed as parameter.
if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) { if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) {
Error: Error:
// Ops, something went wrong, Restore stages // Ops, something went wrong, Restore stages
...@@ -834,7 +839,7 @@ void SlopeLimiting(cmsToneCurve* g) ...@@ -834,7 +839,7 @@ void SlopeLimiting(cmsToneCurve* g)
{ {
int BeginVal, EndVal; int BeginVal, EndVal;
int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5); // Cutoff at 2% int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5); // Cutoff at 2%
int AtEnd = g ->nEntries - AtBegin - 1; // And 98% int AtEnd = (int) g ->nEntries - AtBegin - 1; // And 98%
cmsFloat64Number Val, Slope, beta; cmsFloat64Number Val, Slope, beta;
int i; int i;
...@@ -895,9 +900,9 @@ Prelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cms ...@@ -895,9 +900,9 @@ Prelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cms
// Move to 0..1.0 in fixed domain // Move to 0..1.0 in fixed domain
v1 = _cmsToFixedDomain(Input[0] * p -> Domain[0]); v1 = _cmsToFixedDomain((int) (Input[0] * p -> Domain[0]));
v2 = _cmsToFixedDomain(Input[1] * p -> Domain[1]); v2 = _cmsToFixedDomain((int) (Input[1] * p -> Domain[1]));
v3 = _cmsToFixedDomain(Input[2] * p -> Domain[2]); v3 = _cmsToFixedDomain((int) (Input[2] * p -> Domain[2]));
// Store the precalculated table of nodes // Store the precalculated table of nodes
p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1)); p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1));
...@@ -942,27 +947,27 @@ void PrelinEval8(register const cmsUInt16Number Input[], ...@@ -942,27 +947,27 @@ void PrelinEval8(register const cmsUInt16Number Input[],
cmsS15Fixed16Number rx, ry, rz; cmsS15Fixed16Number rx, ry, rz;
cmsS15Fixed16Number c0, c1, c2, c3, Rest; cmsS15Fixed16Number c0, c1, c2, c3, Rest;
int OutChan; int OutChan;
register cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; register cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1;
Prelin8Data* p8 = (Prelin8Data*) D; Prelin8Data* p8 = (Prelin8Data*) D;
register const cmsInterpParams* p = p8 ->p; register const cmsInterpParams* p = p8 ->p;
int TotalOut = p -> nOutputs; int TotalOut = (int) p -> nOutputs;
const cmsUInt16Number* LutTable = (const cmsUInt16Number*) p->Table; const cmsUInt16Number* LutTable = (const cmsUInt16Number*) p->Table;
r = Input[0] >> 8; r = (cmsUInt8Number) (Input[0] >> 8);
g = Input[1] >> 8; g = (cmsUInt8Number) (Input[1] >> 8);
b = Input[2] >> 8; b = (cmsUInt8Number) (Input[2] >> 8);
X0 = X1 = p8->X0[r]; X0 = X1 = (cmsS15Fixed16Number) p8->X0[r];
Y0 = Y1 = p8->Y0[g]; Y0 = Y1 = (cmsS15Fixed16Number) p8->Y0[g];
Z0 = Z1 = p8->Z0[b]; Z0 = Z1 = (cmsS15Fixed16Number) p8->Z0[b];
rx = p8 ->rx[r]; rx = p8 ->rx[r];
ry = p8 ->ry[g]; ry = p8 ->ry[g];
rz = p8 ->rz[b]; rz = p8 ->rz[b];
X1 = X0 + ((rx == 0) ? 0 : p ->opta[2]); X1 = X0 + (cmsS15Fixed16Number)((rx == 0) ? 0 : p ->opta[2]);
Y1 = Y0 + ((ry == 0) ? 0 : p ->opta[1]); Y1 = Y0 + (cmsS15Fixed16Number)((ry == 0) ? 0 : p ->opta[1]);
Z1 = Z0 + ((rz == 0) ? 0 : p ->opta[0]); Z1 = Z0 + (cmsS15Fixed16Number)((rz == 0) ? 0 : p ->opta[0]);
// These are the 6 Tetrahedral // These are the 6 Tetrahedral
...@@ -1015,9 +1020,8 @@ void PrelinEval8(register const cmsUInt16Number Input[], ...@@ -1015,9 +1020,8 @@ void PrelinEval8(register const cmsUInt16Number Input[],
c1 = c2 = c3 = 0; c1 = c2 = c3 = 0;
} }
Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
Output[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest>>16))>>16); Output[OutChan] = (cmsUInt16Number) (c0 + ((Rest + (Rest >> 16)) >> 16));
} }
} }
...@@ -1029,8 +1033,8 @@ void PrelinEval8(register const cmsUInt16Number Input[], ...@@ -1029,8 +1033,8 @@ void PrelinEval8(register const cmsUInt16Number Input[],
static static
cmsBool IsDegenerated(const cmsToneCurve* g) cmsBool IsDegenerated(const cmsToneCurve* g)
{ {
int i, Zeros = 0, Poles = 0; cmsUInt32Number i, Zeros = 0, Poles = 0;
int nEntries = g ->nEntries; cmsUInt32Number nEntries = g ->nEntries;
for (i=0; i < nEntries; i++) { for (i=0; i < nEntries; i++) {
...@@ -1052,7 +1056,7 @@ static ...@@ -1052,7 +1056,7 @@ static
cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
{ {
cmsPipeline* OriginalLut; cmsPipeline* OriginalLut;
int nGridPoints; cmsUInt32Number nGridPoints;
cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS]; cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS];
cmsUInt32Number t, i; cmsUInt32Number t, i;
cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS];
...@@ -1090,8 +1094,13 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte ...@@ -1090,8 +1094,13 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte
if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE; if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
} }
ColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat)); ColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*InputFormat));
OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat)); OutputColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*OutputFormat));
// Color space must be specified
if (ColorSpace == (cmsColorSpaceSignature)0 ||
OutputColorSpace == (cmsColorSpaceSignature)0) return FALSE;
nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);
// Empty gamma containers // Empty gamma containers
...@@ -1212,7 +1221,10 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte ...@@ -1212,7 +1221,10 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte
Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID, Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID,
OptimizedPrelinCLUT ->Params, OptimizedPrelinCLUT ->Params,
OptimizedPrelinCurves); OptimizedPrelinCurves);
if (p8 == NULL) return FALSE; if (p8 == NULL) {
cmsPipelineFree(OptimizedLUT);
return FALSE;
}
_cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup); _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup);
...@@ -1222,7 +1234,10 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte ...@@ -1222,7 +1234,10 @@ cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Inte
Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID, Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID,
OptimizedPrelinCLUT ->Params, OptimizedPrelinCLUT ->Params,
3, OptimizedPrelinCurves, 3, NULL); 3, OptimizedPrelinCurves, 3, NULL);
if (p16 == NULL) return FALSE; if (p16 == NULL) {
cmsPipelineFree(OptimizedLUT);
return FALSE;
}
_cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
...@@ -1260,6 +1275,7 @@ Error: ...@@ -1260,6 +1275,7 @@ Error:
return FALSE; return FALSE;
cmsUNUSED_PARAMETER(Intent); cmsUNUSED_PARAMETER(Intent);
cmsUNUSED_PARAMETER(lIsLinear);
} }
...@@ -1269,7 +1285,7 @@ static ...@@ -1269,7 +1285,7 @@ static
void CurvesFree(cmsContext ContextID, void* ptr) void CurvesFree(cmsContext ContextID, void* ptr)
{ {
Curves16Data* Data = (Curves16Data*) ptr; Curves16Data* Data = (Curves16Data*) ptr;
int i; cmsUInt32Number i;
for (i=0; i < Data -> nCurves; i++) { for (i=0; i < Data -> nCurves; i++) {
...@@ -1284,7 +1300,7 @@ static ...@@ -1284,7 +1300,7 @@ static
void* CurvesDup(cmsContext ContextID, const void* ptr) void* CurvesDup(cmsContext ContextID, const void* ptr)
{ {
Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data)); Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data));
int i; cmsUInt32Number i;
if (Data == NULL) return NULL; if (Data == NULL) return NULL;
...@@ -1299,9 +1315,9 @@ void* CurvesDup(cmsContext ContextID, const void* ptr) ...@@ -1299,9 +1315,9 @@ void* CurvesDup(cmsContext ContextID, const void* ptr)
// Precomputes tables for 8-bit on input devicelink. // Precomputes tables for 8-bit on input devicelink.
static static
Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsToneCurve** G) Curves16Data* CurvesAlloc(cmsContext ContextID, cmsUInt32Number nCurves, cmsUInt32Number nElements, cmsToneCurve** G)
{ {
int i, j; cmsUInt32Number i, j;
Curves16Data* c16; Curves16Data* c16;
c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data)); c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data));
...@@ -1311,7 +1327,10 @@ Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsT ...@@ -1311,7 +1327,10 @@ Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsT
c16 ->nElements = nElements; c16 ->nElements = nElements;
c16->Curves = (cmsUInt16Number**) _cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*)); c16->Curves = (cmsUInt16Number**) _cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*));
if (c16 ->Curves == NULL) return NULL; if (c16->Curves == NULL) {
_cmsFree(ContextID, c16);
return NULL;
}
for (i=0; i < nCurves; i++) { for (i=0; i < nCurves; i++) {
...@@ -1327,7 +1346,7 @@ Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsT ...@@ -1327,7 +1346,7 @@ Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsT
return NULL; return NULL;
} }
if (nElements == 256) { if (nElements == 256U) {
for (j=0; j < nElements; j++) { for (j=0; j < nElements; j++) {
...@@ -1351,8 +1370,8 @@ void FastEvaluateCurves8(register const cmsUInt16Number In[], ...@@ -1351,8 +1370,8 @@ void FastEvaluateCurves8(register const cmsUInt16Number In[],
register const void* D) register const void* D)
{ {
Curves16Data* Data = (Curves16Data*) D; Curves16Data* Data = (Curves16Data*) D;
cmsUInt8Number x; int x;
int i; cmsUInt32Number i;
for (i=0; i < Data ->nCurves; i++) { for (i=0; i < Data ->nCurves; i++) {
...@@ -1368,7 +1387,7 @@ void FastEvaluateCurves16(register const cmsUInt16Number In[], ...@@ -1368,7 +1387,7 @@ void FastEvaluateCurves16(register const cmsUInt16Number In[],
register const void* D) register const void* D)
{ {
Curves16Data* Data = (Curves16Data*) D; Curves16Data* Data = (Curves16Data*) D;
int i; cmsUInt32Number i;
for (i=0; i < Data ->nCurves; i++) { for (i=0; i < Data ->nCurves; i++) {
Out[i] = Data -> Curves[i][In[i]]; Out[i] = Data -> Curves[i][In[i]];
...@@ -1548,9 +1567,9 @@ void MatShaperEval16(register const cmsUInt16Number In[], ...@@ -1548,9 +1567,9 @@ void MatShaperEval16(register const cmsUInt16Number In[],
// In this case (and only in this case!) we can use this simplification since // In this case (and only in this case!) we can use this simplification since
// In[] is assured to come from a 8 bit number. (a << 8 | a) // In[] is assured to come from a 8 bit number. (a << 8 | a)
ri = In[0] & 0xFF; ri = In[0] & 0xFFU;
gi = In[1] & 0xFF; gi = In[1] & 0xFFU;
bi = In[2] & 0xFF; bi = In[2] & 0xFFU;
// Across first shaper, which also converts to 1.14 fixed point // Across first shaper, which also converts to 1.14 fixed point
r = p->Shaper1R[ri]; r = p->Shaper1R[ri];
...@@ -1563,9 +1582,9 @@ void MatShaperEval16(register const cmsUInt16Number In[], ...@@ -1563,9 +1582,9 @@ void MatShaperEval16(register const cmsUInt16Number In[],
l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14; l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14;
// Now we have to clip to 0..1.0 range // Now we have to clip to 0..1.0 range
ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384 : l1); ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384U : (cmsUInt32Number) l1);
gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384 : l2); gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384U : (cmsUInt32Number) l2);
bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384 : l3); bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384U : (cmsUInt32Number) l3);
// And across second shaper, // And across second shaper,
Out[0] = p->Shaper2R[ri]; Out[0] = p->Shaper2R[ri];
...@@ -1586,7 +1605,10 @@ void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve) ...@@ -1586,7 +1605,10 @@ void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve)
R = (cmsFloat32Number) (i / 255.0); R = (cmsFloat32Number) (i / 255.0);
y = cmsEvalToneCurveFloat(Curve, R); y = cmsEvalToneCurveFloat(Curve, R);
Table[i] = DOUBLE_TO_1FIXED14(y); if (y < 131072.0)
Table[i] = DOUBLE_TO_1FIXED14(y);
else
Table[i] = 0x7fffffff;
} }
} }
...@@ -1602,6 +1624,12 @@ void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8Bi ...@@ -1602,6 +1624,12 @@ void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8Bi
R = (cmsFloat32Number) (i / 16384.0); R = (cmsFloat32Number) (i / 16384.0);
Val = cmsEvalToneCurveFloat(Curve, R); // Val comes 0..1.0 Val = cmsEvalToneCurveFloat(Curve, R); // Val comes 0..1.0
if (Val < 0)
Val = 0;
if (Val > 1.0)
Val = 1.0;
if (Is8BitsOutput) { if (Is8BitsOutput) {
// If 8 bits output, we can optimize further by computing the / 257 part. // If 8 bits output, we can optimize further by computing the / 257 part.
...@@ -1640,7 +1668,7 @@ cmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, c ...@@ -1640,7 +1668,7 @@ cmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, c
FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits); FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits);
FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits); FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits);
// Convert matrix to nFixed14. Note that those values may take more than 16 bits as // Convert matrix to nFixed14. Note that those values may take more than 16 bits
for (i=0; i < 3; i++) { for (i=0; i < 3; i++) {
for (j=0; j < 3; j++) { for (j=0; j < 3; j++) {
p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]); p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]);
...@@ -1902,7 +1930,7 @@ cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Dat ...@@ -1902,7 +1930,7 @@ cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Dat
// The entry point for LUT optimization // The entry point for LUT optimization
cmsBool _cmsOptimizePipeline(cmsContext ContextID, cmsBool _cmsOptimizePipeline(cmsContext ContextID,
cmsPipeline** PtrLut, cmsPipeline** PtrLut,
int Intent, cmsUInt32Number Intent,
cmsUInt32Number* InputFormat, cmsUInt32Number* InputFormat,
cmsUInt32Number* OutputFormat, cmsUInt32Number* OutputFormat,
cmsUInt32Number* dwFlags) cmsUInt32Number* dwFlags)
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -685,9 +685,9 @@ cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIEL ...@@ -685,9 +685,9 @@ cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIEL
// This function returns a number of gridpoints to be used as LUT table. It assumes same number // This function returns a number of gridpoints to be used as LUT table. It assumes same number
// of gripdpoints in all dimensions. Flags may override the choice. // of gripdpoints in all dimensions. Flags may override the choice.
int _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags) cmsUInt32Number _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags)
{ {
int nChannels; cmsUInt32Number nChannels;
// Already specified? // Already specified?
if (dwFlags & 0x00FF0000) { if (dwFlags & 0x00FF0000) {
...@@ -831,7 +831,7 @@ cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation) ...@@ -831,7 +831,7 @@ cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation)
case PT_MCH14: return cmsSigMCHEData; case PT_MCH14: return cmsSigMCHEData;
case PT_MCH15: return cmsSigMCHFData; case PT_MCH15: return cmsSigMCHFData;
default: return (cmsColorSpaceSignature) (-1); default: return (cmsColorSpaceSignature) 0;
} }
} }
...@@ -898,7 +898,7 @@ int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace) ...@@ -898,7 +898,7 @@ int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace)
case cmsSigMCHFData: case cmsSigMCHFData:
case cmsSig15colorData:return PT_MCH15; case cmsSig15colorData:return PT_MCH15;
default: return (cmsColorSpaceSignature) (-1); default: return (cmsColorSpaceSignature) 0;
} }
} }
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -201,14 +201,28 @@ cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n) ...@@ -201,14 +201,28 @@ cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n)
_cmsAssert(io != NULL); _cmsAssert(io != NULL);
if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) if (io->Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)
return FALSE; return FALSE;
if (n != NULL) { if (n != NULL) {
tmp = _cmsAdjustEndianess32(tmp); tmp = _cmsAdjustEndianess32(tmp);
*n = *(cmsFloat32Number*) (void*) &tmp; *n = *(cmsFloat32Number*)(void*)&tmp;
// Safeguard which covers against absurd values
if (*n > 1E+20 || *n < -1E+20) return FALSE;
#if defined(_MSC_VER) && _MSC_VER < 1800
return TRUE;
#elif defined (__BORLANDC__)
return TRUE;
#else
// fpclassify() required by C99 (only provided by MSVC >= 1800, VS2013 onwards)
return ((fpclassify(*n) == FP_ZERO) || (fpclassify(*n) == FP_NORMAL));
#endif
} }
return TRUE; return TRUE;
} }
...@@ -222,7 +236,11 @@ cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) ...@@ -222,7 +236,11 @@ cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)
if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1) if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1)
return FALSE; return FALSE;
if (n != NULL) _cmsAdjustEndianess64(n, &tmp); if (n != NULL) {
_cmsAdjustEndianess64(n, &tmp);
}
return TRUE; return TRUE;
} }
...@@ -237,7 +255,7 @@ cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n ...@@ -237,7 +255,7 @@ cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n
return FALSE; return FALSE;
if (n != NULL) { if (n != NULL) {
*n = _cms15Fixed16toDouble(_cmsAdjustEndianess32(tmp)); *n = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32(tmp));
} }
return TRUE; return TRUE;
...@@ -254,9 +272,9 @@ cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ) ...@@ -254,9 +272,9 @@ cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ)
if (XYZ != NULL) { if (XYZ != NULL) {
XYZ->X = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.X)); XYZ->X = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.X));
XYZ->Y = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Y)); XYZ->Y = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.Y));
XYZ->Z = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Z)); XYZ->Z = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.Z));
} }
return TRUE; return TRUE;
} }
...@@ -345,7 +363,7 @@ cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n ...@@ -345,7 +363,7 @@ cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n
_cmsAssert(io != NULL); _cmsAssert(io != NULL);
tmp = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(n)); tmp = _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(n));
if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
return FALSE; return FALSE;
...@@ -359,9 +377,9 @@ cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ) ...@@ -359,9 +377,9 @@ cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ)
_cmsAssert(io != NULL); _cmsAssert(io != NULL);
_cmsAssert(XYZ != NULL); _cmsAssert(XYZ != NULL);
xyz.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->X)); xyz.X = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->X));
xyz.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Y)); xyz.Y = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->Y));
xyz.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Z)); xyz.Z = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->Z));
return io -> Write(io, sizeof(cmsEncodedXYZNumber), &xyz); return io -> Write(io, sizeof(cmsEncodedXYZNumber), &xyz);
} }
...@@ -519,7 +537,7 @@ cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...) ...@@ -519,7 +537,7 @@ cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...)
return FALSE; // Truncated, which is a fatal error for us return FALSE; // Truncated, which is a fatal error for us
} }
rc = io ->Write(io, len, Buffer); rc = io ->Write(io, (cmsUInt32Number) len, Buffer);
va_end(args); va_end(args);
...@@ -779,6 +797,30 @@ cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData) ...@@ -779,6 +797,30 @@ cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData)
struct _cmsContext_struct* ctx; struct _cmsContext_struct* ctx;
struct _cmsContext_struct fakeContext; struct _cmsContext_struct fakeContext;
// See the comments regarding locking in lcms2_internal.h
// for an explanation of why we need the following code.
#ifdef CMS_IS_WINDOWS_
#ifndef CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT
{
static HANDLE _cmsWindowsInitMutex = NULL;
static volatile HANDLE* mutex = &_cmsWindowsInitMutex;
if (*mutex == NULL)
{
HANDLE p = CreateMutex(NULL, FALSE, NULL);
if (p && InterlockedCompareExchangePointer((void **)mutex, (void*)p, NULL) != NULL)
CloseHandle(p);
}
if (*mutex == NULL || WaitForSingleObject(*mutex, INFINITE) == WAIT_FAILED)
return NULL;
if (((void **)&_cmsContextPoolHeadMutex)[0] == NULL)
InitializeCriticalSection(&_cmsContextPoolHeadMutex);
if (*mutex == NULL || !ReleaseMutex(*mutex))
return NULL;
}
#endif
#endif
_cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager); _cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager);
fakeContext.chunks[UserPtr] = UserData; fakeContext.chunks[UserPtr] = UserData;
...@@ -805,7 +847,7 @@ cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData) ...@@ -805,7 +847,7 @@ cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData)
ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager; ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager;
// Now we can allocate the pool by using default memory manager // Now we can allocate the pool by using default memory manager
ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); // default size about 32 pointers ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); // default size about 22 pointers
if (ctx ->MemPool == NULL) { if (ctx ->MemPool == NULL) {
cmsDeleteContext(ctx); cmsDeleteContext(ctx);
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -429,7 +429,7 @@ void EmitRangeCheck(cmsIOHANDLER* m) ...@@ -429,7 +429,7 @@ void EmitRangeCheck(cmsIOHANDLER* m)
// Does write the intent // Does write the intent
static static
void EmitIntent(cmsIOHANDLER* m, int RenderingIntent) void EmitIntent(cmsIOHANDLER* m, cmsUInt32Number RenderingIntent)
{ {
const char *intent; const char *intent;
...@@ -563,7 +563,7 @@ void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table) ...@@ -563,7 +563,7 @@ void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table)
// Compare gamma table // Compare gamma table
static static
cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, int nEntries) cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, cmsUInt32Number nEntries)
{ {
return memcmp(g1, g2, nEntries* sizeof(cmsUInt16Number)) == 0; return memcmp(g1, g2, nEntries* sizeof(cmsUInt16Number)) == 0;
} }
...@@ -572,9 +572,9 @@ cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, int nEntries) ...@@ -572,9 +572,9 @@ cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, int nEntries)
// Does write a set of gamma curves // Does write a set of gamma curves
static static
void EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[]) void EmitNGamma(cmsIOHANDLER* m, cmsUInt32Number n, cmsToneCurve* g[])
{ {
int i; cmsUInt32Number i;
for( i=0; i < n; i++ ) for( i=0; i < n; i++ )
{ {
...@@ -797,7 +797,7 @@ int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** Cu ...@@ -797,7 +797,7 @@ int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** Cu
static static
int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXYZ* BlackPoint) int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, cmsUInt32Number Intent, cmsCIEXYZ* BlackPoint)
{ {
const char* PreMaj; const char* PreMaj;
const char* PostMaj; const char* PostMaj;
...@@ -857,14 +857,14 @@ int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXY ...@@ -857,14 +857,14 @@ int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXY
// Generates a curve from a gray profile // Generates a curve from a gray profile
static static
cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, int Intent) cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent)
{ {
cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL);
cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHPROFILE hXYZ = cmsCreateXYZProfile();
cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE); cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE);
int i; int i;
if (Out != NULL) { if (Out != NULL && xform != NULL) {
for (i=0; i < 256; i++) { for (i=0; i < 256; i++) {
cmsUInt8Number Gray = (cmsUInt8Number) i; cmsUInt8Number Gray = (cmsUInt8Number) i;
...@@ -876,8 +876,8 @@ static ...@@ -876,8 +876,8 @@ static
} }
} }
cmsDeleteTransform(xform); if (xform) cmsDeleteTransform(xform);
cmsCloseProfile(hXYZ); if (hXYZ) cmsCloseProfile(hXYZ);
return Out; return Out;
} }
...@@ -887,7 +887,7 @@ static ...@@ -887,7 +887,7 @@ static
// a more perceptually uniform space... I do choose Lab. // a more perceptually uniform space... I do choose Lab.
static static
int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags) int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
{ {
cmsHPROFILE hLab; cmsHPROFILE hLab;
cmsHTRANSFORM xform; cmsHTRANSFORM xform;
...@@ -972,7 +972,6 @@ cmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe) ...@@ -972,7 +972,6 @@ cmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe)
// Does create CSA based on matrix-shaper. Allowed types are gray and RGB based // Does create CSA based on matrix-shaper. Allowed types are gray and RGB based
static static
int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper) int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper)
{ {
...@@ -998,17 +997,17 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr ...@@ -998,17 +997,17 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr
memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat)); memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat));
for (i=0; i < 3; i++) for (i = 0; i < 3; i++)
for (j=0; j < 3; j++) for (j = 0; j < 3; j++)
Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ; Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ;
rc = EmitCIEBasedABC(m, (cmsFloat64Number *) &Mat, rc = EmitCIEBasedABC(m, (cmsFloat64Number *)&Mat,
_cmsStageGetPtrToCurveSet(Shaper), _cmsStageGetPtrToCurveSet(Shaper),
&BlackPointAdaptedToD50); &BlackPointAdaptedToD50);
} }
else { else {
cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Profile is not suitable for CSA. Unsupported colorspace."); cmsSignalError(m->ContextID, cmsERROR_COLORSPACE_CHECK, "Profile is not suitable for CSA. Unsupported colorspace.");
return 0; return 0;
} }
...@@ -1021,12 +1020,12 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr ...@@ -1021,12 +1020,12 @@ int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matr
// This is a HP extension, and it works in Lab instead of XYZ // This is a HP extension, and it works in Lab instead of XYZ
static static
int WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent) int WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, cmsUInt32Number Intent)
{ {
cmsHTRANSFORM xform; cmsHTRANSFORM xform;
cmsHPROFILE hLab; cmsHPROFILE hLab;
int i, nColors; cmsUInt32Number i, nColors;
char ColorName[32]; char ColorName[cmsMAX_PATH];
cmsNAMEDCOLORLIST* NamedColorList; cmsNAMEDCOLORLIST* NamedColorList;
hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);
...@@ -1304,20 +1303,20 @@ void EmitXYZ2Lab(cmsIOHANDLER* m) ...@@ -1304,20 +1303,20 @@ void EmitXYZ2Lab(cmsIOHANDLER* m)
// 8 bits. // 8 bits.
static static
int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags) int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
{ {
cmsHPROFILE hLab; cmsHPROFILE hLab;
cmsHTRANSFORM xform; cmsHTRANSFORM xform;
int i, nChannels; cmsUInt32Number i, nChannels;
cmsUInt32Number OutputFormat; cmsUInt32Number OutputFormat;
_cmsTRANSFORM* v; _cmsTRANSFORM* v;
cmsPipeline* DeviceLink; cmsPipeline* DeviceLink;
cmsHPROFILE Profiles[3]; cmsHPROFILE Profiles[3];
cmsCIEXYZ BlackPointAdaptedToD50; cmsCIEXYZ BlackPointAdaptedToD50;
cmsBool lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION); cmsBool lDoBPC = (cmsBool) (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
cmsBool lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP); cmsBool lFixWhite = (cmsBool) !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP);
cmsUInt32Number InFrm = TYPE_Lab_16; cmsUInt32Number InFrm = TYPE_Lab_16;
int RelativeEncodingIntent; cmsUInt32Number RelativeEncodingIntent;
cmsColorSpaceSignature ColorSpace; cmsColorSpaceSignature ColorSpace;
...@@ -1413,10 +1412,10 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32N ...@@ -1413,10 +1412,10 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32N
// Builds a ASCII string containing colorant list in 0..1.0 range // Builds a ASCII string containing colorant list in 0..1.0 range
static static
void BuildColorantList(char *Colorant, int nColorant, cmsUInt16Number Out[]) void BuildColorantList(char *Colorant, cmsUInt32Number nColorant, cmsUInt16Number Out[])
{ {
char Buff[32]; char Buff[32];
int j; cmsUInt32Number j;
Colorant[0] = 0; Colorant[0] = 0;
if (nColorant > cmsMAXCHANNELS) if (nColorant > cmsMAXCHANNELS)
...@@ -1438,12 +1437,12 @@ void BuildColorantList(char *Colorant, int nColorant, cmsUInt16Number Out[]) ...@@ -1438,12 +1437,12 @@ void BuildColorantList(char *Colorant, int nColorant, cmsUInt16Number Out[])
// This is a HP extension. // This is a HP extension.
static static
int WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent, cmsUInt32Number dwFlags) int WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
{ {
cmsHTRANSFORM xform; cmsHTRANSFORM xform;
int i, nColors, nColorant; cmsUInt32Number i, nColors, nColorant;
cmsUInt32Number OutputFormat; cmsUInt32Number OutputFormat;
char ColorName[32]; char ColorName[cmsMAX_PATH];
char Colorant[128]; char Colorant[128];
cmsNAMEDCOLORLIST* NamedColorList; cmsNAMEDCOLORLIST* NamedColorList;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -105,7 +105,6 @@ cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number ...@@ -105,7 +105,6 @@ cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number
} }
// Obtain y(x) // Obtain y(x)
y = -3.000*(x*x) + 2.870*x - 0.275; y = -3.000*(x*x) + 2.870*x - 0.275;
// wave factors (not used, but here for futures extensions) // wave factors (not used, but here for futures extensions)
...@@ -131,7 +130,7 @@ typedef struct { ...@@ -131,7 +130,7 @@ typedef struct {
} ISOTEMPERATURE; } ISOTEMPERATURE;
static ISOTEMPERATURE isotempdata[] = { static const ISOTEMPERATURE isotempdata[] = {
// {Mirek, Ut, Vt, Tt } // {Mirek, Ut, Vt, Tt }
{0, 0.18006, 0.26352, -0.24341}, {0, 0.18006, 0.26352, -0.24341},
{10, 0.18066, 0.26589, -0.25479}, {10, 0.18066, 0.26589, -0.25479},
...@@ -295,7 +294,7 @@ cmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt) ...@@ -295,7 +294,7 @@ cmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt)
// Build a White point, primary chromas transfer matrix from RGB to CIE XYZ // Build a White point, primary chromas transfer matrix from RGB to CIE XYZ
// This is just an approximation, I am not handling all the non-linear // This is just an approximation, I am not handling all the non-linear
// aspects of the RGB to XYZ process, and assumming that the gamma correction // aspects of the RGB to XYZ process, and assumming that the gamma correction
// has transitive property in the tranformation chain. // has transitive property in the transformation chain.
// //
// the alghoritm: // the alghoritm:
// //
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
// //
// Little Color Management System // Little Color Management System
// Copyright (c) 1998-2016 Marti Maria Saguer // Copyright (c) 1998-2017 Marti Maria Saguer
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"), // a copy of this software and associated documentation files (the "Software"),
...@@ -347,7 +347,7 @@ typedef struct { ...@@ -347,7 +347,7 @@ typedef struct {
// Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10 // Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10
// Evaluator callback for user-suplied parametric curves. May implement more than one type // Evaluator callback for user-supplied parametric curves. May implement more than one type
typedef cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R); typedef cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R);
// Plug-in may implement an arbitrary number of parametric curves // Plug-in may implement an arbitrary number of parametric curves
...@@ -457,7 +457,7 @@ typedef struct { ...@@ -457,7 +457,7 @@ typedef struct {
cmsUInt32Number nSupportedTypes; // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum) cmsUInt32Number nSupportedTypes; // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum)
cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN]; cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN];
// For writting // For writing
cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data); cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data);
} cmsTagDescriptor; } cmsTagDescriptor;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册