diff --git a/src/java.desktop/share/legal/lcms.md b/src/java.desktop/share/legal/lcms.md index 02af4fff000..83c47d3acdb 100644 --- a/src/java.desktop/share/legal/lcms.md +++ b/src/java.desktop/share/legal/lcms.md @@ -1,11 +1,11 @@ -## Little Color Management System (LCMS) v2.16 +## Little Color Management System (LCMS) v2.17 ### LCMS License
MIT License -Copyright (C) 1998-2023 Marti Maria Saguer +Copyright (C) 1998-2025 Marti Maria Saguer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,10 +26,10 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------- -The below license applies to the following files: +The below applies to the following file(s): liblcms/cmssm.c -Copyright 2001, softSurfer (www.softsurfer.com) +Copyright (C) 2001, softSurfer (www.softsurfer.com) This code may be freely used and modified for any purpose providing that this copyright notice is included with it. @@ -99,5 +99,5 @@ Christian Albrecht Dimitrios Anastassakis Lemke Software Tim Zaman - -``` +Amir Montazery and Open Source Technology Improvement Fund (ostif.org), Google, for fuzzer fundings. +``` \ No newline at end of file diff --git a/src/java.desktop/share/native/liblcms/cmsalpha.c b/src/java.desktop/share/native/liblcms/cmsalpha.c index 78d3ca6b671..2e50b65be24 100644 --- a/src/java.desktop/share/native/liblcms/cmsalpha.c +++ b/src/java.desktop/share/native/liblcms/cmsalpha.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -612,8 +612,8 @@ void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in, cmsUInt8Number* SourcePtr; cmsUInt8Number* DestPtr; - cmsUInt32Number SourceStrideIncrement = 0; - cmsUInt32Number DestStrideIncrement = 0; + size_t SourceStrideIncrement = 0; + size_t DestStrideIncrement = 0; // The loop itself for (i = 0; i < LineCount; i++) { @@ -640,8 +640,8 @@ void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in, cmsUInt8Number* SourcePtr[cmsMAXCHANNELS]; cmsUInt8Number* DestPtr[cmsMAXCHANNELS]; - cmsUInt32Number SourceStrideIncrements[cmsMAXCHANNELS]; - cmsUInt32Number DestStrideIncrements[cmsMAXCHANNELS]; + size_t SourceStrideIncrements[cmsMAXCHANNELS]; + size_t DestStrideIncrements[cmsMAXCHANNELS]; memset(SourceStrideIncrements, 0, sizeof(SourceStrideIncrements)); memset(DestStrideIncrements, 0, sizeof(DestStrideIncrements)); diff --git a/src/java.desktop/share/native/liblcms/cmscam02.c b/src/java.desktop/share/native/liblcms/cmscam02.c index 71a48d43de4..45ef4eef970 100644 --- a/src/java.desktop/share/native/liblcms/cmscam02.c +++ b/src/java.desktop/share/native/liblcms/cmscam02.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -117,17 +117,16 @@ cmsFloat64Number computeFL(cmsCIECAM02* pMod) return FL; } -static -cmsFloat64Number computeD(cmsCIECAM02* pMod) +static cmsFloat64Number computeD(cmsCIECAM02* pMod) { - cmsFloat64Number D; + cmsFloat64Number D, temp; - D = pMod->F - (1.0/3.6)*(exp(((-pMod ->LA-42) / 92.0))); + temp = 1.0 - ((1.0 / 3.6) * exp((-pMod->LA - 42) / 92.0)); + D = pMod->F * temp; return D; } - static CAM02COLOR XYZtoCAT02(CAM02COLOR clr) { diff --git a/src/java.desktop/share/native/liblcms/cmscgats.c b/src/java.desktop/share/native/liblcms/cmscgats.c index 57725ae4731..3e62d064c3f 100644 --- a/src/java.desktop/share/native/liblcms/cmscgats.c +++ b/src/java.desktop/share/native/liblcms/cmscgats.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -444,10 +444,11 @@ static void StringClear(string* s) { s->len = 0; + s->begin[0] = 0; } static -void StringAppend(string* s, char c) +cmsBool StringAppend(string* s, char c) { if (s->len + 1 >= s->max) { @@ -455,6 +456,8 @@ void StringAppend(string* s, char c) s->max *= 10; new_ptr = (char*) AllocChunk(s->it8, s->max); + if (new_ptr == NULL) return FALSE; + if (new_ptr != NULL && s->begin != NULL) memcpy(new_ptr, s->begin, s->len); @@ -466,6 +469,8 @@ void StringAppend(string* s, char c) s->begin[s->len++] = c; s->begin[s->len] = 0; } + + return TRUE; } static @@ -475,13 +480,15 @@ char* StringPtr(string* s) } static -void StringCat(string* s, const char* c) +cmsBool StringCat(string* s, const char* c) { while (*c) { - StringAppend(s, *c); + if (!StringAppend(s, *c)) return FALSE; c++; } + + return TRUE; } @@ -830,7 +837,12 @@ void InStringSymbol(cmsIT8* it8) if (it8->ch == '\n' || it8->ch == '\r' || it8->ch == 0) break; else { - StringAppend(it8->str, (char)it8->ch); + if (!StringAppend(it8->str, (char)it8->ch)) { + + SynError(it8, "Out of memory"); + return; + } + NextCh(it8); } } @@ -860,7 +872,11 @@ void InSymbol(cmsIT8* it8) do { - StringAppend(it8->id, (char) it8->ch); + if (!StringAppend(it8->id, (char)it8->ch)) { + + SynError(it8, "Out of memory"); + return; + } NextCh(it8); @@ -904,7 +920,6 @@ void InSymbol(cmsIT8* it8) if ((cmsFloat64Number) it8->inum * 16.0 + (cmsFloat64Number) j > (cmsFloat64Number)+2147483647.0) { SynError(it8, "Invalid hexadecimal number"); - it8->sy = SEOF; return; } @@ -926,7 +941,6 @@ void InSymbol(cmsIT8* it8) if ((cmsFloat64Number) it8->inum * 2.0 + j > (cmsFloat64Number)+2147483647.0) { SynError(it8, "Invalid binary number"); - it8->sy = SEOF; return; } @@ -979,11 +993,19 @@ void InSymbol(cmsIT8* it8) } StringClear(it8->id); - StringCat(it8->id, buffer); + if (!StringCat(it8->id, buffer)) { + + SynError(it8, "Out of memory"); + return; + } do { - StringAppend(it8->id, (char) it8->ch); + if (!StringAppend(it8->id, (char)it8->ch)) { + + SynError(it8, "Out of memory"); + return; + } NextCh(it8); @@ -1038,7 +1060,6 @@ void InSymbol(cmsIT8* it8) default: SynError(it8, "Unrecognized character: 0x%x", it8 ->ch); - it8->sy = SEOF; return; } @@ -1053,24 +1074,21 @@ void InSymbol(cmsIT8* it8) if(it8 -> IncludeSP >= (MAXINCLUDE-1)) { SynError(it8, "Too many recursion levels"); - it8->sy = SEOF; return; } InStringSymbol(it8); if (!Check(it8, SSTRING, "Filename expected")) - { - it8->sy = SEOF; return; - } + FileNest = it8 -> FileStack[it8 -> IncludeSP + 1]; if(FileNest == NULL) { FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX)); if (FileNest == NULL) { + SynError(it8, "Out of memory"); - it8->sy = SEOF; return; } } @@ -1078,8 +1096,8 @@ void InSymbol(cmsIT8* it8) if (BuildAbsolutePath(StringPtr(it8->str), it8->FileStack[it8->IncludeSP]->FileName, FileNest->FileName, cmsMAX_PATH-1) == FALSE) { + SynError(it8, "File path too long"); - it8->sy = SEOF; return; } @@ -1087,7 +1105,6 @@ void InSymbol(cmsIT8* it8) if (FileNest->Stream == NULL) { SynError(it8, "File %s not found", FileNest->FileName); - it8->sy = SEOF; return; } it8->IncludeSP++; @@ -1102,10 +1119,10 @@ void InSymbol(cmsIT8* it8) static cmsBool CheckEOLN(cmsIT8* it8) { - if (!Check(it8, SEOLN, "Expected separator")) return FALSE; - while (it8 -> sy == SEOLN) - InSymbol(it8); - return TRUE; + if (!Check(it8, SEOLN, "Expected separator")) return FALSE; + while (it8->sy == SEOLN) + InSymbol(it8); + return TRUE; } @@ -1114,8 +1131,8 @@ cmsBool CheckEOLN(cmsIT8* it8) static void Skip(cmsIT8* it8, SYMBOL sy) { - if (it8->sy == sy && it8->sy != SEOF) - InSymbol(it8); + if (it8->sy == sy && it8->sy != SEOF && it8->sy != SSYNERROR) + InSymbol(it8); } @@ -1124,7 +1141,7 @@ static void SkipEOLN(cmsIT8* it8) { while (it8->sy == SEOLN) { - InSymbol(it8); + InSymbol(it8); } } @@ -1235,9 +1252,12 @@ void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) cmsUInt8Number* ptr; size = _cmsALIGNMEM(size); + if (size == 0) return NULL; if (size > Free) { + cmsUInt8Number* new_block; + if (it8 -> Allocator.BlockSize == 0) it8 -> Allocator.BlockSize = 20*1024; @@ -1248,7 +1268,11 @@ void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) it8 ->Allocator.BlockSize = size; it8 ->Allocator.Used = 0; - it8 ->Allocator.Block = (cmsUInt8Number*) AllocBigBlock(it8, it8 ->Allocator.BlockSize); + new_block = (cmsUInt8Number*)AllocBigBlock(it8, it8->Allocator.BlockSize); + if (new_block == NULL) + return NULL; + + it8->Allocator.Block = new_block; } if (it8->Allocator.Block == NULL) @@ -1258,7 +1282,6 @@ void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) it8 ->Allocator.Used += size; return (void*) ptr; - } @@ -1266,9 +1289,12 @@ void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) static char *AllocString(cmsIT8* it8, const char* str) { - cmsUInt32Number Size = (cmsUInt32Number) strlen(str)+1; + cmsUInt32Number Size; char *ptr; + if (str == NULL) return NULL; + + Size = (cmsUInt32Number)strlen(str) + 1; ptr = (char *) AllocChunk(it8, Size); if (ptr) memcpy(ptr, str, Size-1); @@ -1404,10 +1430,13 @@ KEYVALUE* AddAvailableSampleID(cmsIT8* it8, const char* Key) static -void AllocTable(cmsIT8* it8) +cmsBool AllocTable(cmsIT8* it8) { TABLE* t; + if (it8->TablesCount >= (MAXTABLES-1)) + return FALSE; + t = it8 ->Tab + it8 ->TablesCount; t->HeaderList = NULL; @@ -1415,6 +1444,7 @@ void AllocTable(cmsIT8* it8) t->Data = NULL; it8 ->TablesCount++; + return TRUE; } @@ -1426,7 +1456,10 @@ cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE IT8, cmsUInt32Number nTable) if (nTable == it8 ->TablesCount) { - AllocTable(it8); + if (!AllocTable(it8)) { + SynError(it8, "Too many tables"); + return -1; + } } else { SynError(it8, "Table %d is out of sequence", nTable); @@ -1610,8 +1643,8 @@ cmsInt32Number satoi(const char* b) if (b == NULL) return 0; n = atoi(b); - if (n > 0x7fffffffL) return 0x7fffffffL; - if (n < -0x7ffffffeL) return -0x7ffffffeL; + if (n > 0x7ffffff0L) return 0x7ffffff0L; + if (n < -0x7ffffff0L) return -0x7ffffff0L; return (cmsInt32Number)n; } @@ -1620,22 +1653,26 @@ cmsInt32Number satoi(const char* b) static cmsBool AllocateDataFormat(cmsIT8* it8) { + cmsUInt32Number size; + TABLE* t = GetTable(it8); - if (t -> DataFormat) return TRUE; // Already allocated + if (t->DataFormat) return TRUE; // Already allocated - t -> nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); + t->nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); - if (t -> nSamples <= 0) { + if (t->nSamples <= 0 || t->nSamples > 0x7ffe) { - SynError(it8, "AllocateDataFormat: Unknown NUMBER_OF_FIELDS"); + SynError(it8, "Wrong NUMBER_OF_FIELDS"); return FALSE; - } + } + + size = ((cmsUInt32Number)t->nSamples + 1) * sizeof(char*); - t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *)); + t->DataFormat = (char**)AllocChunk(it8, size); if (t->DataFormat == NULL) { - SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array"); + SynError(it8, "Unable to allocate dataFormat array"); return FALSE; } @@ -1664,7 +1701,7 @@ cmsBool SetDataFormat(cmsIT8* it8, int n, const char *label) return FALSE; } - if (n > t -> nSamples) { + if (n >= t -> nSamples) { SynError(it8, "More than NUMBER_OF_FIELDS fields."); return FALSE; } @@ -1713,13 +1750,14 @@ cmsBool AllocateDataSet(cmsIT8* it8) t-> nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); t-> nPatches = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS")); - if (t -> nSamples < 0 || t->nSamples > 0x7ffe || t->nPatches < 0 || t->nPatches > 0x7ffe) + if (t -> nSamples < 0 || t->nSamples > 0x7ffe || t->nPatches < 0 || t->nPatches > 0x7ffe || + (t->nPatches * t->nSamples) > 200000) { SynError(it8, "AllocateDataSet: too much data"); return FALSE; } else { - // Some dumb analizers warns of possible overflow here, just take a look couple of lines above. + // Some dumb analyzers warns of possible overflow here, just take a look couple of lines above. t->Data = (char**)AllocChunk(it8, ((cmsUInt32Number)t->nSamples + 1) * ((cmsUInt32Number)t->nPatches + 1) * sizeof(char*)); if (t->Data == NULL) { @@ -1748,8 +1786,11 @@ char* GetData(cmsIT8* it8, int nSet, int nField) static cmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val) { + char* ptr; + TABLE* t = GetTable(it8); + if (!t->Data) { if (!AllocateDataSet(it8)) return FALSE; } @@ -1766,7 +1807,11 @@ cmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val) } - t->Data [nSet * t -> nSamples + nField] = AllocString(it8, Val); + ptr = AllocString(it8, Val); + if (ptr == NULL) + return FALSE; + + t->Data [nSet * t -> nSamples + nField] = ptr; return TRUE; } @@ -2121,7 +2166,7 @@ cmsBool DataSection (cmsIT8* it8) if (!AllocateDataSet(it8)) return FALSE; } - while (it8->sy != SEND_DATA && it8->sy != SEOF) + while (it8->sy != SEND_DATA && it8->sy != SEOF && it8->sy != SSYNERROR) { if (iField >= t -> nSamples) { iField = 0; @@ -2129,7 +2174,7 @@ cmsBool DataSection (cmsIT8* it8) } - if (it8->sy != SEND_DATA && it8->sy != SEOF) { + if (it8->sy != SEND_DATA && it8->sy != SEOF && it8->sy != SSYNERROR) { switch (it8->sy) { @@ -2225,8 +2270,8 @@ cmsBool HeaderSection(cmsIT8* it8) if (!GetVal(it8, Buffer, MAXSTR - 1, "Property data expected")) return FALSE; if (Key->WriteAs != WRITE_PAIR) { - AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer, - (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED); + if (AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer, + (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED) == NULL) return FALSE; } else { const char *Subkey; @@ -2332,9 +2377,10 @@ cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) if (!DataSection(it8)) return FALSE; - if (it8 -> sy != SEOF) { + if (it8 -> sy != SEOF && it8->sy != SSYNERROR) { + + if (!AllocTable(it8)) return FALSE; - AllocTable(it8); it8 ->nTable = it8 ->TablesCount - 1; // Read sheet type if present. We only support identifier and string. @@ -3064,7 +3110,8 @@ cmsBool ParseCube(cmsIT8* cube, cmsStage** Shaper, cmsStage** CLUT, char title[] InSymbol(cube); - while (cube->sy != SEOF) { + while (cube->sy != SEOF && cube->sy != SSYNERROR) { + switch (cube->sy) { // Set profile description diff --git a/src/java.desktop/share/native/liblcms/cmscnvrt.c b/src/java.desktop/share/native/liblcms/cmscnvrt.c index d18865b15b9..9f8619cb9da 100644 --- a/src/java.desktop/share/native/liblcms/cmscnvrt.c +++ b/src/java.desktop/share/native/liblcms/cmscnvrt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -750,7 +750,6 @@ static cmsBool is_cmyk_devicelink(cmsHPROFILE hProfile) { return cmsGetDeviceClass(hProfile) == cmsSigLinkClass && - cmsGetColorSpace(hProfile) == cmsSigCmykData && cmsGetColorSpace(hProfile) == cmsSigCmykData; } diff --git a/src/java.desktop/share/native/liblcms/cmserr.c b/src/java.desktop/share/native/liblcms/cmserr.c index 9fb7db89c9a..d421c550d32 100644 --- a/src/java.desktop/share/native/liblcms/cmserr.c +++ b/src/java.desktop/share/native/liblcms/cmserr.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmsgamma.c b/src/java.desktop/share/native/liblcms/cmsgamma.c index 8e489a43c55..773858b0c1f 100644 --- a/src/java.desktop/share/native/liblcms/cmsgamma.c +++ b/src/java.desktop/share/native/liblcms/cmsgamma.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmsgmt.c b/src/java.desktop/share/native/liblcms/cmsgmt.c index e9ee73b52cd..03ac70202a5 100644 --- a/src/java.desktop/share/native/liblcms/cmsgmt.c +++ b/src/java.desktop/share/native/liblcms/cmsgmt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2021 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -327,8 +327,9 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, cmsUInt32Number dwFormat; GAMUTCHAIN Chain; cmsUInt32Number nGridpoints; - cmsInt32Number nChannels; + cmsInt32Number nChannels, nInputChannels; cmsColorSpaceSignature ColorSpace; + cmsColorSpaceSignature InputColorSpace; cmsUInt32Number i; cmsHPROFILE ProfileList[256]; cmsBool BPCList[256]; @@ -374,11 +375,13 @@ cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, AdaptationList[nGamutPCSposition] = 1.0; IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC; - ColorSpace = cmsGetColorSpace(hGamut); nChannels = cmsChannelsOfColorSpace(ColorSpace); nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC); - dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2)); + + InputColorSpace = cmsGetColorSpace(ProfileList[0]); + nInputChannels = cmsChannelsOfColorSpace(InputColorSpace); + dwFormat = (CHANNELS_SH(nInputChannels)|BYTES_SH(2)); // 16 bits to Lab double Chain.hInput = cmsCreateExtendedTransform(ContextID, diff --git a/src/java.desktop/share/native/liblcms/cmshalf.c b/src/java.desktop/share/native/liblcms/cmshalf.c index 5babb063eb0..7e5f7a3c7e0 100644 --- a/src/java.desktop/share/native/liblcms/cmshalf.c +++ b/src/java.desktop/share/native/liblcms/cmshalf.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmsintrp.c b/src/java.desktop/share/native/liblcms/cmsintrp.c index 9837454df0b..43c47429c3c 100644 --- a/src/java.desktop/share/native/liblcms/cmsintrp.c +++ b/src/java.desktop/share/native/liblcms/cmsintrp.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -524,7 +524,7 @@ void TrilinearInterpFloat(const cmsFloat32Number Input[], py = fclamp(Input[1]) * p->Domain[1]; pz = fclamp(Input[2]) * p->Domain[2]; - x0 = (int) floor(px); fx = px - (cmsFloat32Number) x0; // We need full floor funcionality here + x0 = (int) floor(px); fx = px - (cmsFloat32Number) x0; // We need full floor functionality here y0 = (int) floor(py); fy = py - (cmsFloat32Number) y0; z0 = (int) floor(pz); fz = pz - (cmsFloat32Number) z0; diff --git a/src/java.desktop/share/native/liblcms/cmsio0.c b/src/java.desktop/share/native/liblcms/cmsio0.c index 05baa9392e2..5258b7939d2 100644 --- a/src/java.desktop/share/native/liblcms/cmsio0.c +++ b/src/java.desktop/share/native/liblcms/cmsio0.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -306,6 +306,11 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buff fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM)); if (fm == NULL) goto Error; + if (Buffer == NULL) { + cmsSignalError(ContextID, cmsERROR_WRITE, "Couldn't write profile to NULL pointer"); + goto Error; + } + fm ->Block = (cmsUInt8Number*) Buffer; fm ->FreeBlockOnClose = FALSE; fm ->Size = size; diff --git a/src/java.desktop/share/native/liblcms/cmsio1.c b/src/java.desktop/share/native/liblcms/cmsio1.c index e42d4d38987..48772c7cbde 100644 --- a/src/java.desktop/share/native/liblcms/cmsio1.c +++ b/src/java.desktop/share/native/liblcms/cmsio1.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmslut.c b/src/java.desktop/share/native/liblcms/cmslut.c index b544c948625..3cf4e8cac5a 100644 --- a/src/java.desktop/share/native/liblcms/cmslut.c +++ b/src/java.desktop/share/native/liblcms/cmslut.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -1109,7 +1109,7 @@ cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID) return mpe; } -// Fom XYZ to floating point PCS +// From XYZ to floating point PCS cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID) { #define n (32768.0/65535.0) diff --git a/src/java.desktop/share/native/liblcms/cmsmd5.c b/src/java.desktop/share/native/liblcms/cmsmd5.c index 01aa44de85a..d9b9a4e5260 100644 --- a/src/java.desktop/share/native/liblcms/cmsmd5.c +++ b/src/java.desktop/share/native/liblcms/cmsmd5.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -280,8 +280,8 @@ void CMSEXPORT cmsMD5finish(cmsProfileID* ProfileID, cmsHANDLE Handle) // Assuming io points to an ICC profile, compute and store MD5 checksum -// In the header, rendering intentent, attributes and ID should be set to zero -// before computing MD5 checksum (per 6.1.13 in ICC spec) +// In the header, rendering intentent, flags and ID should be set to zero +// before computing MD5 checksum (per 7.2.18 of ICC spec 4.4) cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile) { @@ -299,8 +299,8 @@ cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile) // Save a copy of the profile header memmove(&Keep, Icc, sizeof(_cmsICCPROFILE)); - // Set RI, attributes and ID - memset(&Icc ->attributes, 0, sizeof(Icc ->attributes)); + // Set RI, flags and ID + Icc ->flags = 0; Icc ->RenderingIntent = 0; memset(&Icc ->ProfileID, 0, sizeof(Icc ->ProfileID)); diff --git a/src/java.desktop/share/native/liblcms/cmsmtrx.c b/src/java.desktop/share/native/liblcms/cmsmtrx.c index 599c290bd70..841da662a10 100644 --- a/src/java.desktop/share/native/liblcms/cmsmtrx.c +++ b/src/java.desktop/share/native/liblcms/cmsmtrx.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmsnamed.c b/src/java.desktop/share/native/liblcms/cmsnamed.c index d3cd97d4aea..451bfe9f34d 100644 --- a/src/java.desktop/share/native/liblcms/cmsnamed.c +++ b/src/java.desktop/share/native/liblcms/cmsnamed.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -598,7 +598,7 @@ cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, if (BufferSize < ASCIIlen + 1) ASCIIlen = BufferSize - 1; - // Precess each character + // Process each character for (i=0; i < ASCIIlen; i++) { wchar_t wc = Wide[i]; diff --git a/src/java.desktop/share/native/liblcms/cmsopt.c b/src/java.desktop/share/native/liblcms/cmsopt.c index 421a4f4a701..767008e68c5 100644 --- a/src/java.desktop/share/native/liblcms/cmsopt.c +++ b/src/java.desktop/share/native/liblcms/cmsopt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmspack.c b/src/java.desktop/share/native/liblcms/cmspack.c index fc875995a80..d430e73051d 100644 --- a/src/java.desktop/share/native/liblcms/cmspack.c +++ b/src/java.desktop/share/native/liblcms/cmspack.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -217,7 +217,7 @@ cmsUInt8Number* UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, else { if (Premul && Extra) - alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[(nChan) * Stride])); + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan * Stride])); } for (i=0; i < nChan; i++) { @@ -606,8 +606,8 @@ cmsUInt8Number* UnrollAnyWordsPremul(CMSREGISTER _cmsTRANSFORM* info, cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number i; - cmsUInt16Number alpha = (ExtraFirst ? accum[0] : accum[nChan - 1]); - cmsUInt32Number alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(alpha)); + cmsUInt16Number alpha = (ExtraFirst ? ((cmsUInt16Number*)accum)[0] : ((cmsUInt16Number*)accum)[nChan]); + cmsUInt32Number alpha_factor = _cmsToFixedDomain(alpha); if (ExtraFirst) { accum += sizeof(cmsUInt16Number); @@ -691,8 +691,8 @@ cmsUInt8Number* UnrollPlanarWordsPremul(CMSREGISTER _cmsTRANSFORM* info, cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt8Number* Init = accum; - cmsUInt16Number alpha = (ExtraFirst ? accum[0] : accum[(nChan - 1) * Stride]); - cmsUInt32Number alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(alpha)); + cmsUInt16Number alpha = (ExtraFirst ? ((cmsUInt16Number*)accum)[0] : ((cmsUInt16Number*)accum)[nChan * Stride / 2]); + cmsUInt32Number alpha_factor = _cmsToFixedDomain(alpha); if (ExtraFirst) { accum += Stride; @@ -1107,8 +1107,7 @@ cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type) } // Return the size in bytes of a given formatter -static -cmsUInt32Number PixelSize(cmsUInt32Number Format) +cmsINLINE cmsUInt32Number PixelSize(cmsUInt32Number Format) { cmsUInt32Number fmt_bytes = T_BYTES(Format); @@ -1454,7 +1453,7 @@ cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, if (Premul && Extra) { if (Planar) - alpha_factor = (ExtraFirst ? ptr[0] : ptr[(nChan) * Stride]) / maximum; + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan * Stride]) / maximum; else alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum; } @@ -3052,6 +3051,7 @@ cmsUInt8Number* PackWordsFromFloat(_cmsTRANSFORM* info, if (ExtraFirst) start = Extra; + Stride /= 2; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; @@ -3115,7 +3115,7 @@ cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info, v = maximum - v; if (Planar) - ((cmsFloat32Number*)output)[(i + start)* Stride] = (cmsFloat32Number)v; + ((cmsFloat32Number*)output)[(i + start) * Stride] = (cmsFloat32Number)v; else ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v; } @@ -3455,7 +3455,7 @@ cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info, cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; - Stride /= PixelSize(info->OutputFormat); + Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; @@ -4062,6 +4062,9 @@ cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfil // Unsupported color space? if (nOutputChans < 0) return 0; + // Fix float spaces + nBytes &= 7; + // Create a fake formatter for result return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); } @@ -4079,6 +4082,9 @@ cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsU // Unsupported color space? if (nOutputChans < 0) return 0; + // Fix float spaces + nBytes &= 7; + // Create a fake formatter for result return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); } diff --git a/src/java.desktop/share/native/liblcms/cmspcs.c b/src/java.desktop/share/native/liblcms/cmspcs.c index c4739840053..5f1b1f0d8e6 100644 --- a/src/java.desktop/share/native/liblcms/cmspcs.c +++ b/src/java.desktop/share/native/liblcms/cmspcs.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmsplugin.c b/src/java.desktop/share/native/liblcms/cmsplugin.c index f84e0172c81..aaad39f52b0 100644 --- a/src/java.desktop/share/native/liblcms/cmsplugin.c +++ b/src/java.desktop/share/native/liblcms/cmsplugin.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -935,7 +935,10 @@ cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData) if (!InitContextMutex()) return NULL; // Setup default memory allocators - memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); + if (ContextID == NULL) + _cmsInstallAllocFunctions(NULL, &ctx->DefaultMemoryManager); + else + memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); // Maintain the linked list _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); diff --git a/src/java.desktop/share/native/liblcms/cmsps2.c b/src/java.desktop/share/native/liblcms/cmsps2.c index 9a2ab464f31..476817e9c1a 100644 --- a/src/java.desktop/share/native/liblcms/cmsps2.c +++ b/src/java.desktop/share/native/liblcms/cmsps2.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -494,7 +494,7 @@ void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table) // Bounds check EmitRangeCheck(m); - // Emit intepolation code + // Emit interpolation code // PostScript code Stack // =============== ======================== @@ -618,7 +618,7 @@ int OutputValueSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUI } - // Hadle the parenthesis on rows + // Handle the parenthesis on rows if (In[0] != sc ->FirstComponent) { @@ -694,8 +694,10 @@ void WriteCLUT(cmsIOHANDLER* m, cmsStage* mpe, const char* PreMaj, _cmsIOPrintf(m, "["); - for (i = 0; i < sc.Pipeline->Params->nInputs; i++) - _cmsIOPrintf(m, " %d ", sc.Pipeline->Params->nSamples[i]); + for (i = 0; i < sc.Pipeline->Params->nInputs; i++) { + if (i < MAX_INPUT_DIMENSIONS) + _cmsIOPrintf(m, " %d ", sc.Pipeline->Params->nSamples[i]); + } _cmsIOPrintf(m, " [\n"); @@ -869,13 +871,13 @@ cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt3 // a more perceptually uniform space... I do choose Lab. static -int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +cmsBool WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hLab; cmsHTRANSFORM xform; cmsUInt32Number nChannels; cmsUInt32Number InputFormat; - int rc; + cmsHPROFILE Profiles[2]; cmsCIEXYZ BlackPointAdaptedToD50; @@ -900,7 +902,7 @@ int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, if (xform == NULL) { cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Profile -> Lab"); - return 0; + return FALSE; } // Only 1, 3 and 4 channels are allowed @@ -919,29 +921,35 @@ int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number OutFrm = TYPE_Lab_16; cmsPipeline* DeviceLink; _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; + cmsBool rc; DeviceLink = cmsPipelineDup(v ->Lut); - if (DeviceLink == NULL) return 0; + if (DeviceLink == NULL) { + cmsDeleteTransform(xform); + return FALSE; + } dwFlags |= cmsFLAGS_FORCE_CLUT; _cmsOptimizePipeline(m->ContextID, &DeviceLink, Intent, &InputFormat, &OutFrm, &dwFlags); rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50); cmsPipelineFree(DeviceLink); - if (rc == 0) return 0; + if (!rc) { + cmsDeleteTransform(xform); + return FALSE; + } } break; default: + cmsDeleteTransform(xform); cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Only 3, 4 channels are supported for CSA. This profile has %d channels.", nChannels); - return 0; + return FALSE; } - cmsDeleteTransform(xform); - - return 1; + return TRUE; } static @@ -1284,7 +1292,7 @@ void EmitXYZ2Lab(cmsIOHANDLER* m) // 8 bits. static -int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +cmsBool WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hLab; cmsHTRANSFORM xform; @@ -1302,7 +1310,7 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent cmsStage* first; hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); - if (hLab == NULL) return 0; + if (hLab == NULL) return FALSE; OutputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE); nChannels = T_CHANNELS(OutputFormat); @@ -1327,7 +1335,7 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent if (xform == NULL) { cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Lab -> Profile in CRD creation"); - return 0; + return FALSE; } // Get a copy of the internal devicelink @@ -1335,17 +1343,22 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent DeviceLink = cmsPipelineDup(v ->Lut); if (DeviceLink == NULL) { cmsDeleteTransform(xform); - return 0; + cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot access link for CRD"); + return FALSE; } // We need a CLUT dwFlags |= cmsFLAGS_FORCE_CLUT; - _cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags); + if (!_cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags)) { + cmsPipelineFree(DeviceLink); + cmsDeleteTransform(xform); + cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot create CLUT table for CRD"); + return FALSE; + } _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "/ColorRenderingType 1\n"); - cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0); // Emit headers, etc. @@ -1367,6 +1380,13 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent first = cmsPipelineGetPtrToFirstStage(DeviceLink); if (first != NULL) { + if (first->Type != cmsSigCLutElemType) { + cmsPipelineFree(DeviceLink); + cmsDeleteTransform(xform); + cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot create CLUT, revise your flags!"); + return FALSE; + } + WriteCLUT(m, first, "<", ">\n", "", "", lFixWhite, ColorSpace); } @@ -1389,7 +1409,7 @@ int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent cmsPipelineFree(DeviceLink); cmsDeleteTransform(xform); - return 1; + return TRUE; } diff --git a/src/java.desktop/share/native/liblcms/cmssamp.c b/src/java.desktop/share/native/liblcms/cmssamp.c index 74f5f4bff29..ca5c4a9d693 100644 --- a/src/java.desktop/share/native/liblcms/cmssamp.c +++ b/src/java.desktop/share/native/liblcms/cmssamp.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmssm.c b/src/java.desktop/share/native/liblcms/cmssm.c index 3e1486ae3ae..e2a810a2669 100644 --- a/src/java.desktop/share/native/liblcms/cmssm.c +++ b/src/java.desktop/share/native/liblcms/cmssm.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmstypes.c b/src/java.desktop/share/native/liblcms/cmstypes.c index 862f393497a..22514f88226 100644 --- a/src/java.desktop/share/native/liblcms/cmstypes.c +++ b/src/java.desktop/share/native/liblcms/cmstypes.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -599,6 +599,178 @@ void Type_ColorantOrderType_Free(struct _cms_typehandler_struct* self, void* Ptr _cmsFree(self ->ContextID, Ptr); } +// ******************************************************************************** +// Type cmsSigUInt8ArrayType +// ******************************************************************************** +// This type represents an array of generic 1-byte/8-bit quantity. + +static +void* Type_UInt8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt8Number* array; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt8Number); + array = (cmsUInt8Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt8Number)); + if (array == NULL) return NULL; + + for (i = 0; i < n; i++) { + + if (!_cmsReadUInt8Number(io, &array[i])) { + + _cmsFree(self->ContextID, array); + return NULL; + } + } + + *nItems = n; + return (void*)array; +} + +static +cmsBool Type_UInt8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt8Number* Value = (cmsUInt8Number*)Ptr; + cmsUInt32Number i; + + for (i = 0; i < nItems; i++) { + + if (!_cmsWriteUInt8Number(io, Value[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_UInt8_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt8Number)); +} + + +static +void Type_UInt8_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigUInt32ArrayType +// ******************************************************************************** +// This type represents an array of generic 4-byte/32-bit quantity. +static +void* Type_UInt32_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number* array; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt32Number); + array = (cmsUInt32Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt32Number)); + if (array == NULL) return NULL; + + for (i = 0; i < n; i++) { + + if (!_cmsReadUInt32Number(io, &array[i])) { + + _cmsFree(self->ContextID, array); + return NULL; + } + } + + *nItems = n; + return (void*)array; +} + +static +cmsBool Type_UInt32_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt32Number* Value = (cmsUInt32Number*)Ptr; + cmsUInt32Number i; + + for (i = 0; i < nItems; i++) { + + if (!_cmsWriteUInt32Number(io, Value[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_UInt32_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt32Number)); +} + + +static +void Type_UInt32_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigUInt64ArrayType +// ******************************************************************************** +// This type represents an array of generic 8-byte/64-bit quantity. +static +void* Type_UInt64_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt64Number* array; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt64Number); + array = (cmsUInt64Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt64Number)); + if (array == NULL) return NULL; + + for (i = 0; i < n; i++) { + + if (!_cmsReadUInt64Number(io, &array[i])) { + + _cmsFree(self->ContextID, array); + return NULL; + } + } + + *nItems = n; + return (void*)array; +} + +static +cmsBool Type_UInt64_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt64Number* Value = (cmsUInt64Number*)Ptr; + cmsUInt32Number i; + + for (i = 0; i < nItems; i++) { + + if (!_cmsWriteUInt64Number(io, &Value[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_UInt64_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt64Number)); +} + + +static +void Type_UInt64_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} + // ******************************************************************************** // Type cmsSigS15Fixed16ArrayType // ******************************************************************************** @@ -968,6 +1140,8 @@ void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHAND // Read len of ASCII if (!_cmsReadUInt32Number(io, &AsciiCount)) return NULL; + if (AsciiCount > 0x7ffff) return NULL; + SizeOfTag -= sizeof(cmsUInt32Number); // Check for size @@ -999,7 +1173,8 @@ void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHAND if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done; SizeOfTag -= 2* sizeof(cmsUInt32Number); - if (UnicodeCount == 0 || SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done; + if (UnicodeCount == 0 || UnicodeCount > 0x7ffff || + SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done; UnicodeString = (wchar_t*)_cmsMallocZero(self->ContextID, (UnicodeCount + 1) * sizeof(wchar_t)); if (UnicodeString == NULL) goto Done; @@ -1129,7 +1304,7 @@ cmsBool Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIO if (!io ->Write(io, 67, Filler)) goto Error; // possibly add pad at the end of tag - if(len_aligned - len_tag_requirement > 0) + if (len_aligned > len_tag_requirement) if (!io ->Write(io, len_aligned - len_tag_requirement, Filler)) goto Error; rc = TRUE; @@ -5191,7 +5366,7 @@ cmsBool ReadOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, wchar if (!io -> Seek(io, e -> Offsets[i])) return FALSE; nChars = e ->Sizes[i] / sizeof(cmsUInt16Number); - + if (nChars > 0x7ffff) return FALSE; *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t)); if (*wcstr == NULL) return FALSE; @@ -5772,7 +5947,10 @@ static const _cmsTagTypeLinkedList SupportedTagTypes[] = { {TYPE_HANDLER(cmsSigDictType, Dictionary), (_cmsTagTypeLinkedList*) &SupportedTagTypes[30] }, {TYPE_HANDLER(cmsSigcicpType, VideoSignal), (_cmsTagTypeLinkedList*) &SupportedTagTypes[31] }, {TYPE_HANDLER(cmsSigVcgtType, vcgt), (_cmsTagTypeLinkedList*) &SupportedTagTypes[32] }, -{TYPE_HANDLER(cmsSigMHC2Type, MHC2), NULL } +{TYPE_HANDLER(cmsSigMHC2Type, MHC2), (_cmsTagTypeLinkedList*) &SupportedTagTypes[33] }, +{TYPE_HANDLER(cmsSigUInt8ArrayType, UInt8), (_cmsTagTypeLinkedList*) &SupportedTagTypes[34] }, +{TYPE_HANDLER(cmsSigUInt32ArrayType, UInt32), (_cmsTagTypeLinkedList*) &SupportedTagTypes[35] }, +{TYPE_HANDLER(cmsSigUInt64ArrayType, UInt64), NULL } }; diff --git a/src/java.desktop/share/native/liblcms/cmsvirt.c b/src/java.desktop/share/native/liblcms/cmsvirt.c index e8d18d4ca9f..1ef86dae054 100644 --- a/src/java.desktop/share/native/liblcms/cmsvirt.c +++ b/src/java.desktop/share/native/liblcms/cmsvirt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -412,7 +412,7 @@ int InkLimitingSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUI Out[1] = _cmsQuickSaturateWord(In[1] * Ratio); // M Out[2] = _cmsQuickSaturateWord(In[2] * Ratio); // Y - Out[3] = In[3]; // K (untouched) + Out[3] = In[3]; // K (untouched) return TRUE; } @@ -433,7 +433,7 @@ cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, return NULL; } - if (Limit < 0.0 || Limit > 400) { + if (Limit < 1.0 || Limit > 400) { cmsSignalError(ContextID, cmsERROR_RANGE, "InkLimiting: Limit should be between 1..400"); if (Limit < 1) Limit = 1; @@ -705,7 +705,7 @@ cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void) * * This virtual profile cannot be saved as an ICC file */ -cmsHPROFILE cmsCreate_OkLabProfile(cmsContext ctx) +cmsHPROFILE CMSEXPORT cmsCreate_OkLabProfile(cmsContext ctx) { cmsStage* XYZPCS = _cmsStageNormalizeFromXyzFloat(ctx); cmsStage* PCSXYZ = _cmsStageNormalizeToXyzFloat(ctx); @@ -774,6 +774,8 @@ cmsHPROFILE cmsCreate_OkLabProfile(cmsContext ctx) cmsPipeline* BToA = cmsPipelineAlloc(ctx, 3, 3); cmsHPROFILE hProfile = cmsCreateProfilePlaceholder(ctx); + if (!hProfile) // can't allocate + goto error; cmsSetProfileVersion(hProfile, 4.4); diff --git a/src/java.desktop/share/native/liblcms/cmswtpnt.c b/src/java.desktop/share/native/liblcms/cmswtpnt.c index 27d71803531..ebba2cd6a97 100644 --- a/src/java.desktop/share/native/liblcms/cmswtpnt.c +++ b/src/java.desktop/share/native/liblcms/cmswtpnt.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), diff --git a/src/java.desktop/share/native/liblcms/cmsxform.c b/src/java.desktop/share/native/liblcms/cmsxform.c index 86afd7202fd..1eb3eecbf18 100644 --- a/src/java.desktop/share/native/liblcms/cmsxform.c +++ b/src/java.desktop/share/native/liblcms/cmsxform.c @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -295,7 +295,7 @@ void FloatXFORM(_cmsTRANSFORM* p, cmsUInt8Number* output; cmsFloat32Number fIn[cmsMAXCHANNELS], fOut[cmsMAXCHANNELS]; cmsFloat32Number OutOfGamut; - cmsUInt32Number i, j, c, strideIn, strideOut; + size_t i, j, c, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); @@ -322,9 +322,11 @@ void FloatXFORM(_cmsTRANSFORM* p, // Is current color out of gamut? if (OutOfGamut > 0.0) { + _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*)_cmsContextGetClientChunk(p->ContextID, AlarmCodesContext); + // Certainly, out of gamut for (c = 0; c < cmsMAXCHANNELS; c++) - fOut[c] = -1.0; + fOut[c] = ContextAlarmCodes->AlarmCodes[c] / 65535.0F; } else { @@ -361,7 +363,7 @@ void NullFloatXFORM(_cmsTRANSFORM* p, cmsUInt8Number* accum; cmsUInt8Number* output; cmsFloat32Number fIn[cmsMAXCHANNELS]; - cmsUInt32Number i, j, strideIn, strideOut; + size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); @@ -399,7 +401,7 @@ void NullXFORM(_cmsTRANSFORM* p, cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS]; - cmsUInt32Number i, j, strideIn, strideOut; + size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); @@ -409,17 +411,17 @@ void NullXFORM(_cmsTRANSFORM* p, for (i = 0; i < LineCount; i++) { - accum = (cmsUInt8Number*)in + strideIn; - output = (cmsUInt8Number*)out + strideOut; + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; - for (j = 0; j < PixelsPerLine; j++) { + for (j = 0; j < PixelsPerLine; j++) { - accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); - output = p->ToOutput(p, wIn, output, Stride->BytesPerPlaneOut); - } + accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); + output = p->ToOutput(p, wIn, output, Stride->BytesPerPlaneOut); + } - strideIn += Stride->BytesPerLineIn; - strideOut += Stride->BytesPerLineOut; + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; } } @@ -437,7 +439,7 @@ void PrecalculatedXFORM(_cmsTRANSFORM* p, CMSREGISTER cmsUInt8Number* accum; CMSREGISTER cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; - cmsUInt32Number i, j, strideIn, strideOut; + size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); @@ -500,7 +502,7 @@ void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; - cmsUInt32Number i, j, strideIn, strideOut; + size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); @@ -511,18 +513,18 @@ void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, for (i = 0; i < LineCount; i++) { - accum = (cmsUInt8Number*)in + strideIn; - output = (cmsUInt8Number*)out + strideOut; + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; - for (j = 0; j < PixelsPerLine; j++) { + for (j = 0; j < PixelsPerLine; j++) { - accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); - TransformOnePixelWithGamutCheck(p, wIn, wOut); - output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); - } + accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); + TransformOnePixelWithGamutCheck(p, wIn, wOut); + output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); + } - strideIn += Stride->BytesPerLineIn; - strideOut += Stride->BytesPerLineOut; + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; } } @@ -540,7 +542,7 @@ void CachedXFORM(_cmsTRANSFORM* p, cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; _cmsCACHE Cache; - cmsUInt32Number i, j, strideIn, strideOut; + size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); @@ -595,7 +597,7 @@ void CachedXFORMGamutCheck(_cmsTRANSFORM* p, cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; _cmsCACHE Cache; - cmsUInt32Number i, j, strideIn, strideOut; + size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); @@ -712,7 +714,7 @@ void _cmsTransform2toTransformAdaptor(struct _cmstransform_struct *CMMcargo, const cmsStride* Stride) { - cmsUInt32Number i, strideIn, strideOut; + size_t i, strideIn, strideOut; _cmsHandleExtraChannels(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); @@ -1099,7 +1101,7 @@ cmsBool IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwForm int Space1 = (int) T_COLORSPACE(dwFormat); int Space2 = _cmsLCMScolorSpace(Check); - if (Space1 == PT_ANY) return TRUE; + if (Space1 == PT_ANY) return (T_CHANNELS(dwFormat) == cmsChannelsOf(Check)); if (Space1 == Space2) return TRUE; if (Space1 == PT_LabV2 && Space2 == PT_Lab) return TRUE; @@ -1160,7 +1162,15 @@ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, cmsColorSpaceSignature EntryColorSpace; cmsColorSpaceSignature ExitColorSpace; cmsPipeline* Lut; - cmsUInt32Number LastIntent = Intents[nProfiles-1]; + cmsUInt32Number LastIntent; + + // Safeguard + if (nProfiles <= 0 || nProfiles > 255) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); + return NULL; + } + + LastIntent = Intents[nProfiles - 1]; // If it is a fake transform if (dwFlags & cmsFLAGS_NULLTRANSFORM) diff --git a/src/java.desktop/share/native/liblcms/lcms2.h b/src/java.desktop/share/native/liblcms/lcms2.h index 2d9a8b1248f..5ba09661308 100644 --- a/src/java.desktop/share/native/liblcms/lcms2.h +++ b/src/java.desktop/share/native/liblcms/lcms2.h @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2025 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -52,7 +52,7 @@ // //--------------------------------------------------------------------------------- // -// Version 2.16 +// Version 2.17 // #ifndef _lcms2_H @@ -93,6 +93,9 @@ // Uncomment this to remove the "register" storage class // #define CMS_NO_REGISTER_KEYWORD 1 +// Uncomment this to remove visibility attribute when building shared objects +// #define CMS_NO_VISIBILITY 1 + // ********** End of configuration toggles ****************************** // Needed for streams @@ -113,7 +116,7 @@ extern "C" { #endif // Version/release -#define LCMS_VERSION 2160 +#define LCMS_VERSION 2170 // I will give the chance of redefining basic types for compilers that are not fully C99 compliant #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED @@ -277,7 +280,7 @@ typedef int cmsBool; # define CMSAPI # endif #else // not Windows -# ifdef HAVE_FUNC_ATTRIBUTE_VISIBILITY +# if defined(HAVE_FUNC_ATTRIBUTE_VISIBILITY) && !defined(CMS_NO_VISIBILITY) # define CMSEXPORT # define CMSAPI __attribute__((visibility("default"))) # else @@ -987,7 +990,6 @@ typedef void* cmsHTRANSFORM; // IEEE 754-2008 "half" #define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) #define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) -#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) #define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) diff --git a/src/java.desktop/share/native/liblcms/lcms2_internal.h b/src/java.desktop/share/native/liblcms/lcms2_internal.h index 75973edad0d..d14c0dd823e 100644 --- a/src/java.desktop/share/native/liblcms/lcms2_internal.h +++ b/src/java.desktop/share/native/liblcms/lcms2_internal.h @@ -27,9 +27,10 @@ // However, the following notice accompanied the original version of this // file: // + // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), @@ -467,7 +468,7 @@ cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin // Mutex cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Plugin); -// Paralellization +// Parallelization cmsBool _cmsRegisterParallelizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // --------------------------------------------------------------------------------------------------------- @@ -1000,7 +1001,7 @@ cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile); // Link several profiles to obtain a single LUT modelling the whole color transform. Intents, Black point // compensation and Adaptation parameters may vary across profiles. BPC and Adaptation refers to the PCS -// after the profile. I.e, BPC[0] refers to connexion between profile(0) and profile(1) +// after the profile. I.e, BPC[0] refers to connetion between profile(0) and profile(1) cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], diff --git a/src/java.desktop/share/native/liblcms/lcms2_plugin.h b/src/java.desktop/share/native/liblcms/lcms2_plugin.h index e7e7bd1f0ce..bdfc76f6bf5 100644 --- a/src/java.desktop/share/native/liblcms/lcms2_plugin.h +++ b/src/java.desktop/share/native/liblcms/lcms2_plugin.h @@ -30,7 +30,7 @@ //--------------------------------------------------------------------------------- // // Little Color Management System -// Copyright (c) 1998-2023 Marti Maria Saguer +// Copyright (c) 1998-2024 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"),