external/lcms2/0001-const-up-some-static-arrays.patch.1 | 392 ++++++++++++++++ external/lcms2/UnpackedTarball_lcms2.mk | 4 2 files changed, 396 insertions(+)
New commits: commit 61227073e1b3f37bb4ee49fd1dd32f320ca876f8 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Sun Jul 20 17:25:17 2025 +0100 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Mon Jul 21 00:24:46 2025 +0200 const up lcms2 Change-Id: Iaca3404bd9e8de00d84a89eb86b5e3b9cc12535b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188089 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins diff --git a/external/lcms2/0001-const-up-some-static-arrays.patch.1 b/external/lcms2/0001-const-up-some-static-arrays.patch.1 new file mode 100644 index 000000000000..c61b11d6b2ca --- /dev/null +++ b/external/lcms2/0001-const-up-some-static-arrays.patch.1 @@ -0,0 +1,392 @@ +From f48dd19c6cd6152b5fe56c6fb94d2e966c709f57 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnam...@collabora.com> +Date: Sun, 20 Jul 2025 17:43:36 +0100 +Subject: [PATCH] const up some static arrays + +which enables moving them out of the .data section +--- + src/cmsalpha.c | 2 +- + src/cmscgats.c | 4 ++-- + src/cmscnvrt.c | 8 ++++---- + src/cmsio0.c | 14 +++++++------- + src/cmsopt.c | 12 ++++++------ + src/cmspcs.c | 26 +++++++++++++------------- + src/cmsps2.c | 4 ++-- + src/cmssamp.c | 2 +- + src/cmstypes.c | 16 ++++++++-------- + src/lcms2_internal.h | 8 ++++---- + 10 files changed, 48 insertions(+), 48 deletions(-) + +diff --git a/src/cmsalpha.c b/src/cmsalpha.c +index a5f1a16..b8e1a26 100644 +--- a/src/cmsalpha.c ++++ b/src/cmsalpha.c +@@ -377,7 +377,7 @@ int FormatterPos(cmsUInt32Number frm) + static + cmsFormatterAlphaFn _cmsGetFormatterAlpha(cmsContext id, cmsUInt32Number in, cmsUInt32Number out) + { +-static cmsFormatterAlphaFn FormattersAlpha[6][6] = { ++static const cmsFormatterAlphaFn FormattersAlpha[6][6] = { + + /* from 8 */ { copy8, from8to16, from8to16SE, from8toHLF, from8toFLT, from8toDBL }, + /* from 16*/ { from16to8, copy16, from16to16, from16toHLF, from16toFLT, from16toDBL }, +diff --git a/src/cmscgats.c b/src/cmscgats.c +index 53e3442..27be3b9 100644 +--- a/src/cmscgats.c ++++ b/src/cmscgats.c +@@ -266,7 +266,7 @@ typedef struct { + WRITEMODE as; // How is supposed to be written + } PROPERTY; + +-static PROPERTY PredefinedProperties[] = { ++static const PROPERTY PredefinedProperties[] = { + + {"NUMBER_OF_FIELDS", WRITE_UNCOOKED}, // Required - NUMBER OF FIELDS + {"NUMBER_OF_SETS", WRITE_UNCOOKED}, // Required - NUMBER OF SETS +@@ -344,7 +344,7 @@ static PROPERTY PredefinedProperties[] = { + + + // Predefined sample types on dataset +-static const char* PredefinedSampleID[] = { ++static const char* const PredefinedSampleID[] = { + "SAMPLE_ID", // Identifies sample that data represents + "STRING", // Identifies label, or other non-machine readable value. + // Value must begin and end with a " symbol +diff --git a/src/cmscnvrt.c b/src/cmscnvrt.c +index 9dfca7d..a050db3 100644 +--- a/src/cmscnvrt.c ++++ b/src/cmscnvrt.c +@@ -103,7 +103,7 @@ void DupPluginIntentsList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) + { + _cmsIntentsPluginChunkType newHead = { NULL }; +- cmsIntentsList* entry; ++ const cmsIntentsList* entry; + cmsIntentsList* Anterior = NULL; + _cmsIntentsPluginChunkType* head = (_cmsIntentsPluginChunkType*) src->chunks[IntentPlugin]; + +@@ -148,10 +148,10 @@ void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, + + // Search the list for a suitable intent. Returns NULL if not found + static +-cmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent) ++const cmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent) + { + _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin); +- cmsIntentsList* pt; ++ const cmsIntentsList* pt; + + for (pt = ctx -> Intents; pt != NULL; pt = pt -> Next) + if (pt ->Intent == Intent) return pt; +@@ -1108,7 +1108,7 @@ cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, + cmsUInt32Number dwFlags) + { + cmsUInt32Number i; +- cmsIntentsList* Intent; ++ const cmsIntentsList* Intent; + + // Make sure a reasonable number of profiles is provided + if (nProfiles <= 0 || nProfiles > 255) { +diff --git a/src/cmsio0.c b/src/cmsio0.c +index 859def3..30b6f1e 100644 +--- a/src/cmsio0.c ++++ b/src/cmsio0.c +@@ -658,7 +658,7 @@ void _cmsDeleteTagByPos(_cmsICCPROFILE* Icc, int i) + _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]); + } + else { +- cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i]; ++ const cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i]; + + if (TypeHandler != NULL) { + +@@ -1310,7 +1310,7 @@ cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig) + cmsTagDescriptor* TagDescriptor; + cmsTagTypeSignature TypeBase; + cmsTagTypeSignature Type; +- cmsTagTypeHandler* TypeHandler; ++ const cmsTagTypeHandler* TypeHandler; + cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc); + cmsTagTypeHandler LocalTypeHandler; + +@@ -1564,7 +1564,7 @@ void freeOneTag(_cmsICCPROFILE* Icc, cmsUInt32Number i) + { + if (Icc->TagPtrs[i]) { + +- cmsTagTypeHandler* TypeHandler = Icc->TagTypeHandlers[i]; ++ const cmsTagTypeHandler* TypeHandler = Icc->TagTypeHandlers[i]; + + if (TypeHandler != NULL) { + cmsTagTypeHandler LocalTypeHandler = *TypeHandler; +@@ -1637,7 +1637,7 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) + { + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + cmsIOHANDLER* io; +- cmsTagTypeHandler* TypeHandler; ++ const cmsTagTypeHandler* TypeHandler; + cmsTagTypeHandler LocalTypeHandler; + cmsTagDescriptor* TagDescriptor; + cmsTagTypeSignature BaseType; +@@ -1771,7 +1771,7 @@ Error: + cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig) + { + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; +- cmsTagTypeHandler* TypeHandler; ++ const cmsTagTypeHandler* TypeHandler; + int n; + + // Search for given tag in ICC profile directory +@@ -1789,7 +1789,7 @@ cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig + cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data) + { + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; +- cmsTagTypeHandler* TypeHandler = NULL; ++ const cmsTagTypeHandler* TypeHandler = NULL; + cmsTagTypeHandler LocalTypeHandler; + cmsTagDescriptor* TagDescriptor = NULL; + cmsTagTypeSignature Type; +@@ -1910,7 +1910,7 @@ cmsUInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature si + void *Object; + int i; + cmsIOHANDLER* MemIO; +- cmsTagTypeHandler* TypeHandler = NULL; ++ const cmsTagTypeHandler* TypeHandler = NULL; + cmsTagTypeHandler LocalTypeHandler; + cmsTagDescriptor* TagDescriptor = NULL; + cmsUInt32Number rc; +diff --git a/src/cmsopt.c b/src/cmsopt.c +index 7d4fcf4..27f8d6b 100644 +--- a/src/cmsopt.c ++++ b/src/cmsopt.c +@@ -547,7 +547,7 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], + + // Auxiliary, to see if two values are equal or very different + static +-cmsBool WhitesAreEqual(cmsUInt32Number n, cmsUInt16Number White1[], cmsUInt16Number White2[] ) ++cmsBool WhitesAreEqual(cmsUInt32Number n, const cmsUInt16Number White1[], const cmsUInt16Number White2[] ) + { + cmsUInt32Number i; + +@@ -564,7 +564,7 @@ cmsBool WhitesAreEqual(cmsUInt32Number n, cmsUInt16Number White1[], cmsUInt16Num + static + cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColorSpace, cmsColorSpaceSignature ExitColorSpace) + { +- cmsUInt16Number *WhitePointIn, *WhitePointOut; ++ const cmsUInt16Number *WhitePointIn, *WhitePointOut; + cmsUInt16Number WhiteIn[cmsMAXCHANNELS], WhiteOut[cmsMAXCHANNELS], ObtainedOut[cmsMAXCHANNELS]; + cmsUInt32Number i, nOuts, nIns; + cmsStage *PreLin = NULL, *CLUT = NULL, *PostLin = NULL; +@@ -1799,13 +1799,13 @@ typedef struct _cmsOptimizationCollection_st { + + _cmsOPToptimizeFn OptimizePtr; + +- struct _cmsOptimizationCollection_st *Next; ++ const struct _cmsOptimizationCollection_st *Next; + + } _cmsOptimizationCollection; + + + // The built-in list. We currently implement 4 types of optimizations. Joining of curves, matrix-shaper, linearization and resampling +-static _cmsOptimizationCollection DefaultOptimization[] = { ++static const _cmsOptimizationCollection DefaultOptimization[] = { + + { OptimizeByJoiningCurves, &DefaultOptimization[1] }, + { OptimizeMatrixShaper, &DefaultOptimization[2] }, +@@ -1823,7 +1823,7 @@ void DupPluginOptimizationList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) + { + _cmsOptimizationPluginChunkType newHead = { NULL }; +- _cmsOptimizationCollection* entry; ++ const _cmsOptimizationCollection* entry; + _cmsOptimizationCollection* Anterior = NULL; + _cmsOptimizationPluginChunkType* head = (_cmsOptimizationPluginChunkType*) src->chunks[OptimizationPlugin]; + +@@ -1910,7 +1910,7 @@ cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, + cmsUInt32Number* dwFlags) + { + _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin); +- _cmsOptimizationCollection* Opts; ++ const _cmsOptimizationCollection* Opts; + cmsBool AnySuccess = FALSE; + cmsStage* mpe; + +diff --git a/src/cmspcs.c b/src/cmspcs.c +index 84a62b4..6295dfd 100644 +--- a/src/cmspcs.c ++++ b/src/cmspcs.c +@@ -705,22 +705,22 @@ cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSign + + + cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, +- cmsUInt16Number **White, +- cmsUInt16Number **Black, ++ const cmsUInt16Number **White, ++ const cmsUInt16Number **Black, + cmsUInt32Number *nOutputs) + { + // Only most common spaces + +- static cmsUInt16Number RGBblack[4] = { 0, 0, 0 }; +- static cmsUInt16Number RGBwhite[4] = { 0xffff, 0xffff, 0xffff }; +- static cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; // 400% of ink +- static cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 }; +- static cmsUInt16Number LABblack[4] = { 0, 0x8080, 0x8080 }; // V4 Lab encoding +- static cmsUInt16Number LABwhite[4] = { 0xFFFF, 0x8080, 0x8080 }; +- static cmsUInt16Number CMYblack[4] = { 0xffff, 0xffff, 0xffff }; +- static cmsUInt16Number CMYwhite[4] = { 0, 0, 0 }; +- static cmsUInt16Number Grayblack[4] = { 0 }; +- static cmsUInt16Number GrayWhite[4] = { 0xffff }; ++ static const cmsUInt16Number RGBblack[4] = { 0, 0, 0 }; ++ static const cmsUInt16Number RGBwhite[4] = { 0xffff, 0xffff, 0xffff }; ++ static const cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; // 400% of ink ++ static const cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 }; ++ static const cmsUInt16Number LABblack[4] = { 0, 0x8080, 0x8080 }; // V4 Lab encoding ++ static const cmsUInt16Number LABwhite[4] = { 0xFFFF, 0x8080, 0x8080 }; ++ static const cmsUInt16Number CMYblack[4] = { 0xffff, 0xffff, 0xffff }; ++ static const cmsUInt16Number CMYwhite[4] = { 0, 0, 0 }; ++ static const cmsUInt16Number Grayblack[4] = { 0 }; ++ static const cmsUInt16Number GrayWhite[4] = { 0xffff }; + + switch (Space) { + +@@ -947,4 +947,4 @@ cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace) + int n = cmsChannelsOfColorSpace(ColorSpace); + if (n < 0) return 3; + return (cmsUInt32Number)n; +-} +\ No newline at end of file ++} +diff --git a/src/cmsps2.c b/src/cmsps2.c +index cb2db85..6fb828e 100644 +--- a/src/cmsps2.c ++++ b/src/cmsps2.c +@@ -573,8 +573,8 @@ int OutputValueSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUI + if ((In[1] >= 0x7800 && In[1] <= 0x8800) && + (In[2] >= 0x7800 && In[2] <= 0x8800)) { + +- cmsUInt16Number* Black; +- cmsUInt16Number* White; ++ const cmsUInt16Number* Black; ++ const cmsUInt16Number* White; + cmsUInt32Number nOutputs; + + if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs)) +diff --git a/src/cmssamp.c b/src/cmssamp.c +index af76afa..56aa859 100644 +--- a/src/cmssamp.c ++++ b/src/cmssamp.c +@@ -66,7 +66,7 @@ cmsBool BlackPointAsDarkerColorant(cmsHPROFILE hInput, + cmsCIEXYZ* BlackPoint, + cmsUInt32Number dwFlags) + { +- cmsUInt16Number *Black; ++ const cmsUInt16Number *Black; + cmsHTRANSFORM xform; + cmsColorSpaceSignature Space; + cmsUInt32Number nChannels; +diff --git a/src/cmstypes.c b/src/cmstypes.c +index b456276..d9c0105 100644 +--- a/src/cmstypes.c ++++ b/src/cmstypes.c +@@ -44,7 +44,7 @@ + typedef struct _cmsTagTypeLinkedList_st { + + cmsTagTypeHandler Handler; +- struct _cmsTagTypeLinkedList_st* Next; ++ const struct _cmsTagTypeLinkedList_st* Next; + + } _cmsTagTypeLinkedList; + +@@ -96,9 +96,9 @@ cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsMemoryClient + // Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additions + // made by plug-ins and then the built-in defaults. + static +-cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList) ++const cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, const _cmsTagTypeLinkedList* DefaultLinkedList) + { +- _cmsTagTypeLinkedList* pt; ++ const _cmsTagTypeLinkedList* pt; + + for (pt = PluginLinkedList; + pt != NULL; +@@ -4701,7 +4701,7 @@ cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* + + + // This is the list of built-in MPE types +-static _cmsTagTypeLinkedList SupportedMPEtypes[] = { ++static const _cmsTagTypeLinkedList SupportedMPEtypes[] = { + + {{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] }, // Ignore those elements for now + {{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] }, // (That's what the spec says) +@@ -4721,7 +4721,7 @@ cmsBool ReadMPEElem(struct _cms_typehandler_struct* self, + cmsUInt32Number SizeOfTag) + { + cmsStageSignature ElementSig; +- cmsTagTypeHandler* TypeHandler; ++ const cmsTagTypeHandler* TypeHandler; + cmsUInt32Number nItems; + cmsPipeline *NewLUT = (cmsPipeline *) Cargo; + _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); +@@ -4817,7 +4817,7 @@ cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, v + cmsStageSignature ElementSig; + cmsPipeline* Lut = (cmsPipeline*) Ptr; + cmsStage* Elem = Lut ->Elements; +- cmsTagTypeHandler* TypeHandler; ++ const cmsTagTypeHandler* TypeHandler; + _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); +@@ -5934,7 +5934,7 @@ void DupTagTypeList(struct _cmsContext_struct* ctx, + int loc) + { + _cmsTagTypePluginChunkType newHead = { NULL }; +- _cmsTagTypeLinkedList* entry; ++ const _cmsTagTypeLinkedList* entry; + _cmsTagTypeLinkedList* Anterior = NULL; + _cmsTagTypePluginChunkType* head = (_cmsTagTypePluginChunkType*) src->chunks[loc]; + +@@ -6006,7 +6006,7 @@ cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Dat + + + // Wrapper for tag types +-cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig) ++const cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig) + { + _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(ContextID, TagTypePlugin); + +diff --git a/src/lcms2_internal.h b/src/lcms2_internal.h +index 5b3f263..569ccfb 100644 +--- a/src/lcms2_internal.h ++++ b/src/lcms2_internal.h +@@ -838,7 +838,7 @@ typedef struct _cms_iccprofile_struct { + cmsUInt32Number TagOffsets[MAX_TABLE_TAG]; + cmsBool TagSaveAsRaw[MAX_TABLE_TAG]; // True to write uncooked + void * TagPtrs[MAX_TABLE_TAG]; +- cmsTagTypeHandler* TagTypeHandlers[MAX_TABLE_TAG]; // Same structure may be serialized on different types ++ const cmsTagTypeHandler* TagTypeHandlers[MAX_TABLE_TAG]; // Same structure may be serialized on different types + // depending on profile version, so we keep track of the + // type handler for each tag in the list. + // Special +@@ -855,7 +855,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSp + int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks); + + // Tag types +-cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig); ++const cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig); + cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig); + cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig); + +@@ -995,8 +995,8 @@ CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cms + CMSAPI cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags); + + cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, +- cmsUInt16Number **White, +- cmsUInt16Number **Black, ++ const cmsUInt16Number **White, ++ const cmsUInt16Number **Black, + cmsUInt32Number *nOutputs); + + CMSAPI cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, +-- +2.49.0 + diff --git a/external/lcms2/UnpackedTarball_lcms2.mk b/external/lcms2/UnpackedTarball_lcms2.mk index f99fc708a33e..b09b38c80f91 100644 --- a/external/lcms2/UnpackedTarball_lcms2.mk +++ b/external/lcms2/UnpackedTarball_lcms2.mk @@ -20,8 +20,12 @@ ifneq ($(MSYSTEM),) $(eval $(call gb_UnpackedTarball_set_patchflags,lcms2,--binary)) endif +# external/lcms2/0001-const-up-some-static-arrays.patch.1 +# upstream effort at: https://github.com/mm2/Little-CMS/pull/501 + $(eval $(call gb_UnpackedTarball_add_patches,lcms2,\ external/lcms2/lcms2-2.4-windows.patch \ + external/lcms2/0001-const-up-some-static-arrays.patch.1 \ )) # vim: set noet sw=4 ts=4: