1*3ac0a46fSAndroid Build Coastguard Worker //---------------------------------------------------------------------------------
2*3ac0a46fSAndroid Build Coastguard Worker //
3*3ac0a46fSAndroid Build Coastguard Worker // Little Color Management System
4*3ac0a46fSAndroid Build Coastguard Worker // Copyright (c) 1998-2023 Marti Maria Saguer
5*3ac0a46fSAndroid Build Coastguard Worker //
6*3ac0a46fSAndroid Build Coastguard Worker // Permission is hereby granted, free of charge, to any person obtaining
7*3ac0a46fSAndroid Build Coastguard Worker // a copy of this software and associated documentation files (the "Software"),
8*3ac0a46fSAndroid Build Coastguard Worker // to deal in the Software without restriction, including without limitation
9*3ac0a46fSAndroid Build Coastguard Worker // the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*3ac0a46fSAndroid Build Coastguard Worker // and/or sell copies of the Software, and to permit persons to whom the Software
11*3ac0a46fSAndroid Build Coastguard Worker // is furnished to do so, subject to the following conditions:
12*3ac0a46fSAndroid Build Coastguard Worker //
13*3ac0a46fSAndroid Build Coastguard Worker // The above copyright notice and this permission notice shall be included in
14*3ac0a46fSAndroid Build Coastguard Worker // all copies or substantial portions of the Software.
15*3ac0a46fSAndroid Build Coastguard Worker //
16*3ac0a46fSAndroid Build Coastguard Worker // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17*3ac0a46fSAndroid Build Coastguard Worker // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
18*3ac0a46fSAndroid Build Coastguard Worker // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19*3ac0a46fSAndroid Build Coastguard Worker // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20*3ac0a46fSAndroid Build Coastguard Worker // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21*3ac0a46fSAndroid Build Coastguard Worker // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22*3ac0a46fSAndroid Build Coastguard Worker // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23*3ac0a46fSAndroid Build Coastguard Worker //
24*3ac0a46fSAndroid Build Coastguard Worker //---------------------------------------------------------------------------------
25*3ac0a46fSAndroid Build Coastguard Worker
26*3ac0a46fSAndroid Build Coastguard Worker #include "lcms2_internal.h"
27*3ac0a46fSAndroid Build Coastguard Worker
28*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_memory.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_system.h"
30*3ac0a46fSAndroid Build Coastguard Worker
31*3ac0a46fSAndroid Build Coastguard Worker // This function is here to help applications to prevent mixing lcms versions on header and shared objects.
cmsGetEncodedCMMversion(void)32*3ac0a46fSAndroid Build Coastguard Worker int CMSEXPORT cmsGetEncodedCMMversion(void)
33*3ac0a46fSAndroid Build Coastguard Worker {
34*3ac0a46fSAndroid Build Coastguard Worker return LCMS_VERSION;
35*3ac0a46fSAndroid Build Coastguard Worker }
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker // I am so tired about incompatibilities on those functions that here are some replacements
38*3ac0a46fSAndroid Build Coastguard Worker // that hopefully would be fully portable.
39*3ac0a46fSAndroid Build Coastguard Worker
40*3ac0a46fSAndroid Build Coastguard Worker // compare two strings ignoring case
cmsstrcasecmp(const char * s1,const char * s2)41*3ac0a46fSAndroid Build Coastguard Worker int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2)
42*3ac0a46fSAndroid Build Coastguard Worker {
43*3ac0a46fSAndroid Build Coastguard Worker CMSREGISTER const unsigned char *us1 = (const unsigned char *)s1,
44*3ac0a46fSAndroid Build Coastguard Worker *us2 = (const unsigned char *)s2;
45*3ac0a46fSAndroid Build Coastguard Worker
46*3ac0a46fSAndroid Build Coastguard Worker while (toupper(*us1) == toupper(*us2++))
47*3ac0a46fSAndroid Build Coastguard Worker if (*us1++ == '\0')
48*3ac0a46fSAndroid Build Coastguard Worker return 0;
49*3ac0a46fSAndroid Build Coastguard Worker
50*3ac0a46fSAndroid Build Coastguard Worker return (toupper(*us1) - toupper(*--us2));
51*3ac0a46fSAndroid Build Coastguard Worker }
52*3ac0a46fSAndroid Build Coastguard Worker
53*3ac0a46fSAndroid Build Coastguard Worker // long int because C99 specifies ftell in such way (7.19.9.2)
cmsfilelength(FILE * f)54*3ac0a46fSAndroid Build Coastguard Worker long int CMSEXPORT cmsfilelength(FILE* f)
55*3ac0a46fSAndroid Build Coastguard Worker {
56*3ac0a46fSAndroid Build Coastguard Worker long int p , n;
57*3ac0a46fSAndroid Build Coastguard Worker
58*3ac0a46fSAndroid Build Coastguard Worker p = ftell(f); // register current file position
59*3ac0a46fSAndroid Build Coastguard Worker if (p == -1L)
60*3ac0a46fSAndroid Build Coastguard Worker return -1L;
61*3ac0a46fSAndroid Build Coastguard Worker
62*3ac0a46fSAndroid Build Coastguard Worker if (fseek(f, 0, SEEK_END) != 0) {
63*3ac0a46fSAndroid Build Coastguard Worker return -1L;
64*3ac0a46fSAndroid Build Coastguard Worker }
65*3ac0a46fSAndroid Build Coastguard Worker
66*3ac0a46fSAndroid Build Coastguard Worker n = ftell(f);
67*3ac0a46fSAndroid Build Coastguard Worker fseek(f, p, SEEK_SET); // file position restored
68*3ac0a46fSAndroid Build Coastguard Worker
69*3ac0a46fSAndroid Build Coastguard Worker return n;
70*3ac0a46fSAndroid Build Coastguard Worker }
71*3ac0a46fSAndroid Build Coastguard Worker
_cmsRegisterMemHandlerPlugin(cmsContext ContextID,cmsPluginBase * Plugin)72*3ac0a46fSAndroid Build Coastguard Worker cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin)
73*3ac0a46fSAndroid Build Coastguard Worker {
74*3ac0a46fSAndroid Build Coastguard Worker return TRUE;
75*3ac0a46fSAndroid Build Coastguard Worker }
76*3ac0a46fSAndroid Build Coastguard Worker
77*3ac0a46fSAndroid Build Coastguard Worker // Generic allocate
_cmsMalloc(cmsContext ContextID,cmsUInt32Number size)78*3ac0a46fSAndroid Build Coastguard Worker void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size)
79*3ac0a46fSAndroid Build Coastguard Worker {
80*3ac0a46fSAndroid Build Coastguard Worker return FXMEM_DefaultAlloc(size);
81*3ac0a46fSAndroid Build Coastguard Worker }
82*3ac0a46fSAndroid Build Coastguard Worker
83*3ac0a46fSAndroid Build Coastguard Worker // Generic allocate & zero
_cmsMallocZero(cmsContext ContextID,cmsUInt32Number size)84*3ac0a46fSAndroid Build Coastguard Worker void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size)
85*3ac0a46fSAndroid Build Coastguard Worker {
86*3ac0a46fSAndroid Build Coastguard Worker void* p = FXMEM_DefaultAlloc(size);
87*3ac0a46fSAndroid Build Coastguard Worker if (p) memset(p, 0, size);
88*3ac0a46fSAndroid Build Coastguard Worker return p;
89*3ac0a46fSAndroid Build Coastguard Worker }
90*3ac0a46fSAndroid Build Coastguard Worker
91*3ac0a46fSAndroid Build Coastguard Worker // Generic calloc
_cmsCalloc(cmsContext ContextID,cmsUInt32Number num,cmsUInt32Number size)92*3ac0a46fSAndroid Build Coastguard Worker void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)
93*3ac0a46fSAndroid Build Coastguard Worker {
94*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number total = num * size;
95*3ac0a46fSAndroid Build Coastguard Worker if (total == 0 || total / size != num || total >= 512 * 1024 * 1024)
96*3ac0a46fSAndroid Build Coastguard Worker return NULL;
97*3ac0a46fSAndroid Build Coastguard Worker
98*3ac0a46fSAndroid Build Coastguard Worker return _cmsMallocZero(ContextID, num * size);
99*3ac0a46fSAndroid Build Coastguard Worker }
100*3ac0a46fSAndroid Build Coastguard Worker
101*3ac0a46fSAndroid Build Coastguard Worker // Generic reallocate
_cmsRealloc(cmsContext ContextID,void * Ptr,cmsUInt32Number size)102*3ac0a46fSAndroid Build Coastguard Worker void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size)
103*3ac0a46fSAndroid Build Coastguard Worker {
104*3ac0a46fSAndroid Build Coastguard Worker return FXMEM_DefaultRealloc(Ptr, size);
105*3ac0a46fSAndroid Build Coastguard Worker }
106*3ac0a46fSAndroid Build Coastguard Worker
107*3ac0a46fSAndroid Build Coastguard Worker // Generic free memory
_cmsFree(cmsContext ContextID,void * Ptr)108*3ac0a46fSAndroid Build Coastguard Worker void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr)
109*3ac0a46fSAndroid Build Coastguard Worker {
110*3ac0a46fSAndroid Build Coastguard Worker if (Ptr != NULL) FXMEM_DefaultFree(Ptr);
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker
113*3ac0a46fSAndroid Build Coastguard Worker // Generic block duplication
_cmsDupMem(cmsContext ContextID,const void * Org,cmsUInt32Number size)114*3ac0a46fSAndroid Build Coastguard Worker void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size)
115*3ac0a46fSAndroid Build Coastguard Worker {
116*3ac0a46fSAndroid Build Coastguard Worker void* p = FXMEM_DefaultAlloc(size);
117*3ac0a46fSAndroid Build Coastguard Worker memmove(p, Org, size);
118*3ac0a46fSAndroid Build Coastguard Worker return p;
119*3ac0a46fSAndroid Build Coastguard Worker }
120*3ac0a46fSAndroid Build Coastguard Worker
121*3ac0a46fSAndroid Build Coastguard Worker _cmsMemPluginChunkType _cmsMemPluginChunk = {_cmsMalloc, _cmsMallocZero, _cmsFree,
122*3ac0a46fSAndroid Build Coastguard Worker _cmsRealloc, _cmsCalloc, _cmsDupMem
123*3ac0a46fSAndroid Build Coastguard Worker };
124*3ac0a46fSAndroid Build Coastguard Worker
_cmsAllocMemPluginChunk(struct _cmsContext_struct * ctx,const struct _cmsContext_struct * src)125*3ac0a46fSAndroid Build Coastguard Worker void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)
126*3ac0a46fSAndroid Build Coastguard Worker {
127*3ac0a46fSAndroid Build Coastguard Worker _cmsAssert(ctx != NULL);
128*3ac0a46fSAndroid Build Coastguard Worker
129*3ac0a46fSAndroid Build Coastguard Worker if (src != NULL) {
130*3ac0a46fSAndroid Build Coastguard Worker
131*3ac0a46fSAndroid Build Coastguard Worker // Duplicate
132*3ac0a46fSAndroid Build Coastguard Worker ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType));
133*3ac0a46fSAndroid Build Coastguard Worker }
134*3ac0a46fSAndroid Build Coastguard Worker else {
135*3ac0a46fSAndroid Build Coastguard Worker
136*3ac0a46fSAndroid Build Coastguard Worker // To reset it, we use the default allocators, which cannot be overridden
137*3ac0a46fSAndroid Build Coastguard Worker ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;
138*3ac0a46fSAndroid Build Coastguard Worker }
139*3ac0a46fSAndroid Build Coastguard Worker }
140*3ac0a46fSAndroid Build Coastguard Worker
_cmsInstallAllocFunctions(cmsPluginMemHandler * Plugin,_cmsMemPluginChunkType * ptr)141*3ac0a46fSAndroid Build Coastguard Worker void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)
142*3ac0a46fSAndroid Build Coastguard Worker {
143*3ac0a46fSAndroid Build Coastguard Worker if (Plugin == NULL) {
144*3ac0a46fSAndroid Build Coastguard Worker
145*3ac0a46fSAndroid Build Coastguard Worker memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk));
146*3ac0a46fSAndroid Build Coastguard Worker }
147*3ac0a46fSAndroid Build Coastguard Worker else {
148*3ac0a46fSAndroid Build Coastguard Worker
149*3ac0a46fSAndroid Build Coastguard Worker ptr ->MallocPtr = Plugin -> MallocPtr;
150*3ac0a46fSAndroid Build Coastguard Worker ptr ->FreePtr = Plugin -> FreePtr;
151*3ac0a46fSAndroid Build Coastguard Worker ptr ->ReallocPtr = Plugin -> ReallocPtr;
152*3ac0a46fSAndroid Build Coastguard Worker
153*3ac0a46fSAndroid Build Coastguard Worker // Make sure we revert to defaults
154*3ac0a46fSAndroid Build Coastguard Worker ptr ->MallocZeroPtr= _cmsMallocZero;
155*3ac0a46fSAndroid Build Coastguard Worker ptr ->CallocPtr = _cmsCalloc;
156*3ac0a46fSAndroid Build Coastguard Worker ptr ->DupPtr = _cmsDupMem;
157*3ac0a46fSAndroid Build Coastguard Worker
158*3ac0a46fSAndroid Build Coastguard Worker if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr;
159*3ac0a46fSAndroid Build Coastguard Worker if (Plugin ->CallocPtr != NULL) ptr ->CallocPtr = Plugin -> CallocPtr;
160*3ac0a46fSAndroid Build Coastguard Worker if (Plugin ->DupPtr != NULL) ptr ->DupPtr = Plugin -> DupPtr;
161*3ac0a46fSAndroid Build Coastguard Worker
162*3ac0a46fSAndroid Build Coastguard Worker }
163*3ac0a46fSAndroid Build Coastguard Worker }
164*3ac0a46fSAndroid Build Coastguard Worker
165*3ac0a46fSAndroid Build Coastguard Worker // ********************************************************************************************
166*3ac0a46fSAndroid Build Coastguard Worker
167*3ac0a46fSAndroid Build Coastguard Worker // Sub allocation takes care of many pointers of small size. The memory allocated in
168*3ac0a46fSAndroid Build Coastguard Worker // this way have be freed at once. Next function allocates a single chunk for linked list
169*3ac0a46fSAndroid Build Coastguard Worker // I prefer this method over realloc due to the big impact on xput realloc may have if
170*3ac0a46fSAndroid Build Coastguard Worker // memory is being swapped to disk. This approach is safer (although that may not be true on all platforms)
171*3ac0a46fSAndroid Build Coastguard Worker static
_cmsCreateSubAllocChunk(cmsContext ContextID,cmsUInt32Number Initial)172*3ac0a46fSAndroid Build Coastguard Worker _cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial)
173*3ac0a46fSAndroid Build Coastguard Worker {
174*3ac0a46fSAndroid Build Coastguard Worker _cmsSubAllocator_chunk* chunk;
175*3ac0a46fSAndroid Build Coastguard Worker
176*3ac0a46fSAndroid Build Coastguard Worker // 20K by default
177*3ac0a46fSAndroid Build Coastguard Worker if (Initial == 0)
178*3ac0a46fSAndroid Build Coastguard Worker Initial = 20*1024;
179*3ac0a46fSAndroid Build Coastguard Worker
180*3ac0a46fSAndroid Build Coastguard Worker // Create the container
181*3ac0a46fSAndroid Build Coastguard Worker chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk));
182*3ac0a46fSAndroid Build Coastguard Worker if (chunk == NULL) return NULL;
183*3ac0a46fSAndroid Build Coastguard Worker
184*3ac0a46fSAndroid Build Coastguard Worker // Initialize values
185*3ac0a46fSAndroid Build Coastguard Worker chunk ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, Initial);
186*3ac0a46fSAndroid Build Coastguard Worker if (chunk ->Block == NULL) {
187*3ac0a46fSAndroid Build Coastguard Worker
188*3ac0a46fSAndroid Build Coastguard Worker // Something went wrong
189*3ac0a46fSAndroid Build Coastguard Worker _cmsFree(ContextID, chunk);
190*3ac0a46fSAndroid Build Coastguard Worker return NULL;
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker
193*3ac0a46fSAndroid Build Coastguard Worker chunk ->BlockSize = Initial;
194*3ac0a46fSAndroid Build Coastguard Worker chunk ->Used = 0;
195*3ac0a46fSAndroid Build Coastguard Worker chunk ->next = NULL;
196*3ac0a46fSAndroid Build Coastguard Worker
197*3ac0a46fSAndroid Build Coastguard Worker return chunk;
198*3ac0a46fSAndroid Build Coastguard Worker }
199*3ac0a46fSAndroid Build Coastguard Worker
200*3ac0a46fSAndroid Build Coastguard Worker // The suballocated is nothing but a pointer to the first element in the list. We also keep
201*3ac0a46fSAndroid Build Coastguard Worker // the thread ID in this structure.
_cmsCreateSubAlloc(cmsContext ContextID,cmsUInt32Number Initial)202*3ac0a46fSAndroid Build Coastguard Worker _cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial)
203*3ac0a46fSAndroid Build Coastguard Worker {
204*3ac0a46fSAndroid Build Coastguard Worker _cmsSubAllocator* sub;
205*3ac0a46fSAndroid Build Coastguard Worker
206*3ac0a46fSAndroid Build Coastguard Worker // Create the container
207*3ac0a46fSAndroid Build Coastguard Worker sub = (_cmsSubAllocator*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator));
208*3ac0a46fSAndroid Build Coastguard Worker if (sub == NULL) return NULL;
209*3ac0a46fSAndroid Build Coastguard Worker
210*3ac0a46fSAndroid Build Coastguard Worker sub ->ContextID = ContextID;
211*3ac0a46fSAndroid Build Coastguard Worker
212*3ac0a46fSAndroid Build Coastguard Worker sub ->h = _cmsCreateSubAllocChunk(ContextID, Initial);
213*3ac0a46fSAndroid Build Coastguard Worker if (sub ->h == NULL) {
214*3ac0a46fSAndroid Build Coastguard Worker _cmsFree(ContextID, sub);
215*3ac0a46fSAndroid Build Coastguard Worker return NULL;
216*3ac0a46fSAndroid Build Coastguard Worker }
217*3ac0a46fSAndroid Build Coastguard Worker
218*3ac0a46fSAndroid Build Coastguard Worker return sub;
219*3ac0a46fSAndroid Build Coastguard Worker }
220*3ac0a46fSAndroid Build Coastguard Worker
221*3ac0a46fSAndroid Build Coastguard Worker
222*3ac0a46fSAndroid Build Coastguard Worker // Get rid of whole linked list
_cmsSubAllocDestroy(_cmsSubAllocator * sub)223*3ac0a46fSAndroid Build Coastguard Worker void _cmsSubAllocDestroy(_cmsSubAllocator* sub)
224*3ac0a46fSAndroid Build Coastguard Worker {
225*3ac0a46fSAndroid Build Coastguard Worker _cmsSubAllocator_chunk *chunk, *n;
226*3ac0a46fSAndroid Build Coastguard Worker
227*3ac0a46fSAndroid Build Coastguard Worker for (chunk = sub ->h; chunk != NULL; chunk = n) {
228*3ac0a46fSAndroid Build Coastguard Worker
229*3ac0a46fSAndroid Build Coastguard Worker n = chunk->next;
230*3ac0a46fSAndroid Build Coastguard Worker if (chunk->Block != NULL) _cmsFree(sub ->ContextID, chunk->Block);
231*3ac0a46fSAndroid Build Coastguard Worker _cmsFree(sub ->ContextID, chunk);
232*3ac0a46fSAndroid Build Coastguard Worker }
233*3ac0a46fSAndroid Build Coastguard Worker
234*3ac0a46fSAndroid Build Coastguard Worker // Free the header
235*3ac0a46fSAndroid Build Coastguard Worker _cmsFree(sub ->ContextID, sub);
236*3ac0a46fSAndroid Build Coastguard Worker }
237*3ac0a46fSAndroid Build Coastguard Worker
238*3ac0a46fSAndroid Build Coastguard Worker
239*3ac0a46fSAndroid Build Coastguard Worker // Get a pointer to small memory block.
_cmsSubAlloc(_cmsSubAllocator * sub,cmsUInt32Number size)240*3ac0a46fSAndroid Build Coastguard Worker void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size)
241*3ac0a46fSAndroid Build Coastguard Worker {
242*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used;
243*3ac0a46fSAndroid Build Coastguard Worker cmsUInt8Number* ptr;
244*3ac0a46fSAndroid Build Coastguard Worker
245*3ac0a46fSAndroid Build Coastguard Worker size = _cmsALIGNMEM(size);
246*3ac0a46fSAndroid Build Coastguard Worker
247*3ac0a46fSAndroid Build Coastguard Worker // Check for memory. If there is no room, allocate a new chunk of double memory size.
248*3ac0a46fSAndroid Build Coastguard Worker if (size > Free) {
249*3ac0a46fSAndroid Build Coastguard Worker
250*3ac0a46fSAndroid Build Coastguard Worker _cmsSubAllocator_chunk* chunk;
251*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number newSize;
252*3ac0a46fSAndroid Build Coastguard Worker
253*3ac0a46fSAndroid Build Coastguard Worker newSize = sub -> h ->BlockSize * 2;
254*3ac0a46fSAndroid Build Coastguard Worker if (newSize < size) newSize = size;
255*3ac0a46fSAndroid Build Coastguard Worker
256*3ac0a46fSAndroid Build Coastguard Worker chunk = _cmsCreateSubAllocChunk(sub -> ContextID, newSize);
257*3ac0a46fSAndroid Build Coastguard Worker if (chunk == NULL) return NULL;
258*3ac0a46fSAndroid Build Coastguard Worker
259*3ac0a46fSAndroid Build Coastguard Worker // Link list
260*3ac0a46fSAndroid Build Coastguard Worker chunk ->next = sub ->h;
261*3ac0a46fSAndroid Build Coastguard Worker sub ->h = chunk;
262*3ac0a46fSAndroid Build Coastguard Worker
263*3ac0a46fSAndroid Build Coastguard Worker }
264*3ac0a46fSAndroid Build Coastguard Worker
265*3ac0a46fSAndroid Build Coastguard Worker ptr = sub -> h ->Block + sub -> h ->Used;
266*3ac0a46fSAndroid Build Coastguard Worker sub -> h -> Used += size;
267*3ac0a46fSAndroid Build Coastguard Worker
268*3ac0a46fSAndroid Build Coastguard Worker return (void*) ptr;
269*3ac0a46fSAndroid Build Coastguard Worker }
270*3ac0a46fSAndroid Build Coastguard Worker
271*3ac0a46fSAndroid Build Coastguard Worker // Duplicate in pool
_cmsSubAllocDup(_cmsSubAllocator * s,const void * ptr,cmsUInt32Number size)272*3ac0a46fSAndroid Build Coastguard Worker void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size)
273*3ac0a46fSAndroid Build Coastguard Worker {
274*3ac0a46fSAndroid Build Coastguard Worker void *NewPtr;
275*3ac0a46fSAndroid Build Coastguard Worker
276*3ac0a46fSAndroid Build Coastguard Worker // Dup of null pointer is also NULL
277*3ac0a46fSAndroid Build Coastguard Worker if (ptr == NULL)
278*3ac0a46fSAndroid Build Coastguard Worker return NULL;
279*3ac0a46fSAndroid Build Coastguard Worker
280*3ac0a46fSAndroid Build Coastguard Worker NewPtr = _cmsSubAlloc(s, size);
281*3ac0a46fSAndroid Build Coastguard Worker
282*3ac0a46fSAndroid Build Coastguard Worker if (ptr != NULL && NewPtr != NULL) {
283*3ac0a46fSAndroid Build Coastguard Worker memcpy(NewPtr, ptr, size);
284*3ac0a46fSAndroid Build Coastguard Worker }
285*3ac0a46fSAndroid Build Coastguard Worker
286*3ac0a46fSAndroid Build Coastguard Worker return NewPtr;
287*3ac0a46fSAndroid Build Coastguard Worker }
288*3ac0a46fSAndroid Build Coastguard Worker
289*3ac0a46fSAndroid Build Coastguard Worker
290*3ac0a46fSAndroid Build Coastguard Worker
291*3ac0a46fSAndroid Build Coastguard Worker // Error logging ******************************************************************
292*3ac0a46fSAndroid Build Coastguard Worker
293*3ac0a46fSAndroid Build Coastguard Worker // There is no error handling at all. When a function fails, it returns proper value.
294*3ac0a46fSAndroid Build Coastguard Worker // For example, all create functions does return NULL on failure. Other return FALSE
295*3ac0a46fSAndroid Build Coastguard Worker // It may be interesting, for the developer, to know why the function is failing.
296*3ac0a46fSAndroid Build Coastguard Worker // for that reason, lcms2 does offer a logging function. This function does receive
297*3ac0a46fSAndroid Build Coastguard Worker // a ENGLISH string with some clues on what is going wrong. You can show this
298*3ac0a46fSAndroid Build Coastguard Worker // info to the end user, or just create some sort of log.
299*3ac0a46fSAndroid Build Coastguard Worker // The logging function should NOT terminate the program, as this obviously can leave
300*3ac0a46fSAndroid Build Coastguard Worker // resources. It is the programmer's responsibility to check each function return code
301*3ac0a46fSAndroid Build Coastguard Worker // to make sure it didn't fail.
302*3ac0a46fSAndroid Build Coastguard Worker
303*3ac0a46fSAndroid Build Coastguard Worker // Error messages are limited to MAX_ERROR_MESSAGE_LEN
304*3ac0a46fSAndroid Build Coastguard Worker
305*3ac0a46fSAndroid Build Coastguard Worker #define MAX_ERROR_MESSAGE_LEN 1024
306*3ac0a46fSAndroid Build Coastguard Worker
307*3ac0a46fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------------------------------------
308*3ac0a46fSAndroid Build Coastguard Worker
309*3ac0a46fSAndroid Build Coastguard Worker // This is our default log error
310*3ac0a46fSAndroid Build Coastguard Worker static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);
311*3ac0a46fSAndroid Build Coastguard Worker
312*3ac0a46fSAndroid Build Coastguard Worker // Context0 storage, which is global
313*3ac0a46fSAndroid Build Coastguard Worker _cmsLogErrorChunkType _cmsLogErrorChunk = { DefaultLogErrorHandlerFunction };
314*3ac0a46fSAndroid Build Coastguard Worker
315*3ac0a46fSAndroid Build Coastguard Worker // Allocates and inits error logger container for a given context. If src is NULL, only initializes the value
316*3ac0a46fSAndroid Build Coastguard Worker // to the default. Otherwise, it duplicates the value. The interface is standard across all context clients
_cmsAllocLogErrorChunk(struct _cmsContext_struct * ctx,const struct _cmsContext_struct * src)317*3ac0a46fSAndroid Build Coastguard Worker void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx,
318*3ac0a46fSAndroid Build Coastguard Worker const struct _cmsContext_struct* src)
319*3ac0a46fSAndroid Build Coastguard Worker {
320*3ac0a46fSAndroid Build Coastguard Worker static _cmsLogErrorChunkType LogErrorChunk = { DefaultLogErrorHandlerFunction };
321*3ac0a46fSAndroid Build Coastguard Worker void* from;
322*3ac0a46fSAndroid Build Coastguard Worker
323*3ac0a46fSAndroid Build Coastguard Worker if (src != NULL) {
324*3ac0a46fSAndroid Build Coastguard Worker from = src ->chunks[Logger];
325*3ac0a46fSAndroid Build Coastguard Worker }
326*3ac0a46fSAndroid Build Coastguard Worker else {
327*3ac0a46fSAndroid Build Coastguard Worker from = &LogErrorChunk;
328*3ac0a46fSAndroid Build Coastguard Worker }
329*3ac0a46fSAndroid Build Coastguard Worker
330*3ac0a46fSAndroid Build Coastguard Worker ctx ->chunks[Logger] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsLogErrorChunkType));
331*3ac0a46fSAndroid Build Coastguard Worker }
332*3ac0a46fSAndroid Build Coastguard Worker
333*3ac0a46fSAndroid Build Coastguard Worker // The default error logger does nothing.
334*3ac0a46fSAndroid Build Coastguard Worker static
DefaultLogErrorHandlerFunction(cmsContext ContextID,cmsUInt32Number ErrorCode,const char * Text)335*3ac0a46fSAndroid Build Coastguard Worker void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text)
336*3ac0a46fSAndroid Build Coastguard Worker {
337*3ac0a46fSAndroid Build Coastguard Worker // fprintf(stderr, "[lcms]: %s\n", Text);
338*3ac0a46fSAndroid Build Coastguard Worker // fflush(stderr);
339*3ac0a46fSAndroid Build Coastguard Worker
340*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(ContextID);
341*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(ErrorCode);
342*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(Text);
343*3ac0a46fSAndroid Build Coastguard Worker }
344*3ac0a46fSAndroid Build Coastguard Worker
345*3ac0a46fSAndroid Build Coastguard Worker // Change log error, context based
cmsSetLogErrorHandlerTHR(cmsContext ContextID,cmsLogErrorHandlerFunction Fn)346*3ac0a46fSAndroid Build Coastguard Worker void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn)
347*3ac0a46fSAndroid Build Coastguard Worker {
348*3ac0a46fSAndroid Build Coastguard Worker _cmsLogErrorChunkType* lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);
349*3ac0a46fSAndroid Build Coastguard Worker
350*3ac0a46fSAndroid Build Coastguard Worker if (lhg != NULL) {
351*3ac0a46fSAndroid Build Coastguard Worker
352*3ac0a46fSAndroid Build Coastguard Worker if (Fn == NULL)
353*3ac0a46fSAndroid Build Coastguard Worker lhg -> LogErrorHandler = DefaultLogErrorHandlerFunction;
354*3ac0a46fSAndroid Build Coastguard Worker else
355*3ac0a46fSAndroid Build Coastguard Worker lhg -> LogErrorHandler = Fn;
356*3ac0a46fSAndroid Build Coastguard Worker }
357*3ac0a46fSAndroid Build Coastguard Worker }
358*3ac0a46fSAndroid Build Coastguard Worker
359*3ac0a46fSAndroid Build Coastguard Worker // Change log error, legacy
cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn)360*3ac0a46fSAndroid Build Coastguard Worker void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn)
361*3ac0a46fSAndroid Build Coastguard Worker {
362*3ac0a46fSAndroid Build Coastguard Worker cmsSetLogErrorHandlerTHR(NULL, Fn);
363*3ac0a46fSAndroid Build Coastguard Worker }
364*3ac0a46fSAndroid Build Coastguard Worker
365*3ac0a46fSAndroid Build Coastguard Worker // Log an error
366*3ac0a46fSAndroid Build Coastguard Worker // ErrorText is a text holding an english description of error.
cmsSignalError(cmsContext ContextID,cmsUInt32Number ErrorCode,const char * ErrorText,...)367*3ac0a46fSAndroid Build Coastguard Worker void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...)
368*3ac0a46fSAndroid Build Coastguard Worker {
369*3ac0a46fSAndroid Build Coastguard Worker va_list args;
370*3ac0a46fSAndroid Build Coastguard Worker char Buffer[MAX_ERROR_MESSAGE_LEN];
371*3ac0a46fSAndroid Build Coastguard Worker _cmsLogErrorChunkType* lhg;
372*3ac0a46fSAndroid Build Coastguard Worker
373*3ac0a46fSAndroid Build Coastguard Worker
374*3ac0a46fSAndroid Build Coastguard Worker va_start(args, ErrorText);
375*3ac0a46fSAndroid Build Coastguard Worker vsnprintf(Buffer, MAX_ERROR_MESSAGE_LEN-1, ErrorText, args);
376*3ac0a46fSAndroid Build Coastguard Worker va_end(args);
377*3ac0a46fSAndroid Build Coastguard Worker
378*3ac0a46fSAndroid Build Coastguard Worker // Check for the context, if specified go there. If not, go for the global
379*3ac0a46fSAndroid Build Coastguard Worker lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);
380*3ac0a46fSAndroid Build Coastguard Worker if (lhg ->LogErrorHandler) {
381*3ac0a46fSAndroid Build Coastguard Worker lhg ->LogErrorHandler(ContextID, ErrorCode, Buffer);
382*3ac0a46fSAndroid Build Coastguard Worker }
383*3ac0a46fSAndroid Build Coastguard Worker }
384*3ac0a46fSAndroid Build Coastguard Worker
385*3ac0a46fSAndroid Build Coastguard Worker // Utility function to print signatures
_cmsTagSignature2String(char String[5],cmsTagSignature sig)386*3ac0a46fSAndroid Build Coastguard Worker void _cmsTagSignature2String(char String[5], cmsTagSignature sig)
387*3ac0a46fSAndroid Build Coastguard Worker {
388*3ac0a46fSAndroid Build Coastguard Worker cmsUInt32Number be;
389*3ac0a46fSAndroid Build Coastguard Worker
390*3ac0a46fSAndroid Build Coastguard Worker // Convert to big endian
391*3ac0a46fSAndroid Build Coastguard Worker be = _cmsAdjustEndianess32((cmsUInt32Number) sig);
392*3ac0a46fSAndroid Build Coastguard Worker
393*3ac0a46fSAndroid Build Coastguard Worker // Move chars
394*3ac0a46fSAndroid Build Coastguard Worker memmove(String, &be, 4);
395*3ac0a46fSAndroid Build Coastguard Worker
396*3ac0a46fSAndroid Build Coastguard Worker // Make sure of terminator
397*3ac0a46fSAndroid Build Coastguard Worker String[4] = 0;
398*3ac0a46fSAndroid Build Coastguard Worker }
399*3ac0a46fSAndroid Build Coastguard Worker
400*3ac0a46fSAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------
401*3ac0a46fSAndroid Build Coastguard Worker
402*3ac0a46fSAndroid Build Coastguard Worker
403*3ac0a46fSAndroid Build Coastguard Worker static
defMtxCreate(cmsContext id)404*3ac0a46fSAndroid Build Coastguard Worker void* defMtxCreate(cmsContext id)
405*3ac0a46fSAndroid Build Coastguard Worker {
406*3ac0a46fSAndroid Build Coastguard Worker _cmsMutex* ptr_mutex = (_cmsMutex*) _cmsMalloc(id, sizeof(_cmsMutex));
407*3ac0a46fSAndroid Build Coastguard Worker _cmsInitMutexPrimitive(ptr_mutex);
408*3ac0a46fSAndroid Build Coastguard Worker return (void*) ptr_mutex;
409*3ac0a46fSAndroid Build Coastguard Worker }
410*3ac0a46fSAndroid Build Coastguard Worker
411*3ac0a46fSAndroid Build Coastguard Worker static
defMtxDestroy(cmsContext id,void * mtx)412*3ac0a46fSAndroid Build Coastguard Worker void defMtxDestroy(cmsContext id, void* mtx)
413*3ac0a46fSAndroid Build Coastguard Worker {
414*3ac0a46fSAndroid Build Coastguard Worker _cmsDestroyMutexPrimitive((_cmsMutex *) mtx);
415*3ac0a46fSAndroid Build Coastguard Worker _cmsFree(id, mtx);
416*3ac0a46fSAndroid Build Coastguard Worker }
417*3ac0a46fSAndroid Build Coastguard Worker
418*3ac0a46fSAndroid Build Coastguard Worker static
defMtxLock(cmsContext id,void * mtx)419*3ac0a46fSAndroid Build Coastguard Worker cmsBool defMtxLock(cmsContext id, void* mtx)
420*3ac0a46fSAndroid Build Coastguard Worker {
421*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(id);
422*3ac0a46fSAndroid Build Coastguard Worker return _cmsLockPrimitive((_cmsMutex *) mtx) == 0;
423*3ac0a46fSAndroid Build Coastguard Worker }
424*3ac0a46fSAndroid Build Coastguard Worker
425*3ac0a46fSAndroid Build Coastguard Worker static
defMtxUnlock(cmsContext id,void * mtx)426*3ac0a46fSAndroid Build Coastguard Worker void defMtxUnlock(cmsContext id, void* mtx)
427*3ac0a46fSAndroid Build Coastguard Worker {
428*3ac0a46fSAndroid Build Coastguard Worker cmsUNUSED_PARAMETER(id);
429*3ac0a46fSAndroid Build Coastguard Worker _cmsUnlockPrimitive((_cmsMutex *) mtx);
430*3ac0a46fSAndroid Build Coastguard Worker }
431*3ac0a46fSAndroid Build Coastguard Worker
432*3ac0a46fSAndroid Build Coastguard Worker
433*3ac0a46fSAndroid Build Coastguard Worker
434*3ac0a46fSAndroid Build Coastguard Worker // Pointers to memory manager functions in Context0
435*3ac0a46fSAndroid Build Coastguard Worker _cmsMutexPluginChunkType _cmsMutexPluginChunk = { defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };
436*3ac0a46fSAndroid Build Coastguard Worker
437*3ac0a46fSAndroid Build Coastguard Worker // Allocate and init mutex container.
_cmsAllocMutexPluginChunk(struct _cmsContext_struct * ctx,const struct _cmsContext_struct * src)438*3ac0a46fSAndroid Build Coastguard Worker void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx,
439*3ac0a46fSAndroid Build Coastguard Worker const struct _cmsContext_struct* src)
440*3ac0a46fSAndroid Build Coastguard Worker {
441*3ac0a46fSAndroid Build Coastguard Worker static _cmsMutexPluginChunkType MutexChunk = {defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };
442*3ac0a46fSAndroid Build Coastguard Worker void* from;
443*3ac0a46fSAndroid Build Coastguard Worker
444*3ac0a46fSAndroid Build Coastguard Worker if (src != NULL) {
445*3ac0a46fSAndroid Build Coastguard Worker from = src ->chunks[MutexPlugin];
446*3ac0a46fSAndroid Build Coastguard Worker }
447*3ac0a46fSAndroid Build Coastguard Worker else {
448*3ac0a46fSAndroid Build Coastguard Worker from = &MutexChunk;
449*3ac0a46fSAndroid Build Coastguard Worker }
450*3ac0a46fSAndroid Build Coastguard Worker
451*3ac0a46fSAndroid Build Coastguard Worker ctx ->chunks[MutexPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsMutexPluginChunkType));
452*3ac0a46fSAndroid Build Coastguard Worker }
453*3ac0a46fSAndroid Build Coastguard Worker
454*3ac0a46fSAndroid Build Coastguard Worker // Register new ways to transform
_cmsRegisterMutexPlugin(cmsContext ContextID,cmsPluginBase * Data)455*3ac0a46fSAndroid Build Coastguard Worker cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Data)
456*3ac0a46fSAndroid Build Coastguard Worker {
457*3ac0a46fSAndroid Build Coastguard Worker cmsPluginMutex* Plugin = (cmsPluginMutex*) Data;
458*3ac0a46fSAndroid Build Coastguard Worker _cmsMutexPluginChunkType* ctx = ( _cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
459*3ac0a46fSAndroid Build Coastguard Worker
460*3ac0a46fSAndroid Build Coastguard Worker if (Data == NULL) {
461*3ac0a46fSAndroid Build Coastguard Worker
462*3ac0a46fSAndroid Build Coastguard Worker // No lock routines
463*3ac0a46fSAndroid Build Coastguard Worker ctx->CreateMutexPtr = NULL;
464*3ac0a46fSAndroid Build Coastguard Worker ctx->DestroyMutexPtr = NULL;
465*3ac0a46fSAndroid Build Coastguard Worker ctx->LockMutexPtr = NULL;
466*3ac0a46fSAndroid Build Coastguard Worker ctx ->UnlockMutexPtr = NULL;
467*3ac0a46fSAndroid Build Coastguard Worker return TRUE;
468*3ac0a46fSAndroid Build Coastguard Worker }
469*3ac0a46fSAndroid Build Coastguard Worker
470*3ac0a46fSAndroid Build Coastguard Worker // Factory callback is required
471*3ac0a46fSAndroid Build Coastguard Worker if (Plugin ->CreateMutexPtr == NULL || Plugin ->DestroyMutexPtr == NULL ||
472*3ac0a46fSAndroid Build Coastguard Worker Plugin ->LockMutexPtr == NULL || Plugin ->UnlockMutexPtr == NULL) return FALSE;
473*3ac0a46fSAndroid Build Coastguard Worker
474*3ac0a46fSAndroid Build Coastguard Worker ctx->CreateMutexPtr = Plugin->CreateMutexPtr;
475*3ac0a46fSAndroid Build Coastguard Worker ctx->DestroyMutexPtr = Plugin ->DestroyMutexPtr;
476*3ac0a46fSAndroid Build Coastguard Worker ctx ->LockMutexPtr = Plugin ->LockMutexPtr;
477*3ac0a46fSAndroid Build Coastguard Worker ctx ->UnlockMutexPtr = Plugin ->UnlockMutexPtr;
478*3ac0a46fSAndroid Build Coastguard Worker
479*3ac0a46fSAndroid Build Coastguard Worker // All is ok
480*3ac0a46fSAndroid Build Coastguard Worker return TRUE;
481*3ac0a46fSAndroid Build Coastguard Worker }
482*3ac0a46fSAndroid Build Coastguard Worker
483*3ac0a46fSAndroid Build Coastguard Worker // Generic Mutex fns
_cmsCreateMutex(cmsContext ContextID)484*3ac0a46fSAndroid Build Coastguard Worker void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID)
485*3ac0a46fSAndroid Build Coastguard Worker {
486*3ac0a46fSAndroid Build Coastguard Worker _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
487*3ac0a46fSAndroid Build Coastguard Worker
488*3ac0a46fSAndroid Build Coastguard Worker if (ptr ->CreateMutexPtr == NULL) return NULL;
489*3ac0a46fSAndroid Build Coastguard Worker
490*3ac0a46fSAndroid Build Coastguard Worker return ptr ->CreateMutexPtr(ContextID);
491*3ac0a46fSAndroid Build Coastguard Worker }
492*3ac0a46fSAndroid Build Coastguard Worker
_cmsDestroyMutex(cmsContext ContextID,void * mtx)493*3ac0a46fSAndroid Build Coastguard Worker void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx)
494*3ac0a46fSAndroid Build Coastguard Worker {
495*3ac0a46fSAndroid Build Coastguard Worker _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
496*3ac0a46fSAndroid Build Coastguard Worker
497*3ac0a46fSAndroid Build Coastguard Worker if (ptr ->DestroyMutexPtr != NULL) {
498*3ac0a46fSAndroid Build Coastguard Worker
499*3ac0a46fSAndroid Build Coastguard Worker ptr ->DestroyMutexPtr(ContextID, mtx);
500*3ac0a46fSAndroid Build Coastguard Worker }
501*3ac0a46fSAndroid Build Coastguard Worker }
502*3ac0a46fSAndroid Build Coastguard Worker
_cmsLockMutex(cmsContext ContextID,void * mtx)503*3ac0a46fSAndroid Build Coastguard Worker cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx)
504*3ac0a46fSAndroid Build Coastguard Worker {
505*3ac0a46fSAndroid Build Coastguard Worker _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
506*3ac0a46fSAndroid Build Coastguard Worker
507*3ac0a46fSAndroid Build Coastguard Worker if (ptr ->LockMutexPtr == NULL) return TRUE;
508*3ac0a46fSAndroid Build Coastguard Worker
509*3ac0a46fSAndroid Build Coastguard Worker return ptr ->LockMutexPtr(ContextID, mtx);
510*3ac0a46fSAndroid Build Coastguard Worker }
511*3ac0a46fSAndroid Build Coastguard Worker
_cmsUnlockMutex(cmsContext ContextID,void * mtx)512*3ac0a46fSAndroid Build Coastguard Worker void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx)
513*3ac0a46fSAndroid Build Coastguard Worker {
514*3ac0a46fSAndroid Build Coastguard Worker _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
515*3ac0a46fSAndroid Build Coastguard Worker
516*3ac0a46fSAndroid Build Coastguard Worker if (ptr ->UnlockMutexPtr != NULL) {
517*3ac0a46fSAndroid Build Coastguard Worker
518*3ac0a46fSAndroid Build Coastguard Worker ptr ->UnlockMutexPtr(ContextID, mtx);
519*3ac0a46fSAndroid Build Coastguard Worker }
520*3ac0a46fSAndroid Build Coastguard Worker }
521*3ac0a46fSAndroid Build Coastguard Worker
522*3ac0a46fSAndroid Build Coastguard Worker // The global Context0 storage for parallelization plug-in
523*3ac0a46fSAndroid Build Coastguard Worker _cmsParallelizationPluginChunkType _cmsParallelizationPluginChunk = { 0 };
524*3ac0a46fSAndroid Build Coastguard Worker
525*3ac0a46fSAndroid Build Coastguard Worker // Allocate parallelization container.
_cmsAllocParallelizationPluginChunk(struct _cmsContext_struct * ctx,const struct _cmsContext_struct * src)526*3ac0a46fSAndroid Build Coastguard Worker void _cmsAllocParallelizationPluginChunk(struct _cmsContext_struct* ctx,
527*3ac0a46fSAndroid Build Coastguard Worker const struct _cmsContext_struct* src)
528*3ac0a46fSAndroid Build Coastguard Worker {
529*3ac0a46fSAndroid Build Coastguard Worker if (src != NULL) {
530*3ac0a46fSAndroid Build Coastguard Worker void* from = src->chunks[ParallelizationPlugin];
531*3ac0a46fSAndroid Build Coastguard Worker ctx->chunks[ParallelizationPlugin] = _cmsSubAllocDup(ctx->MemPool, from, sizeof(_cmsParallelizationPluginChunkType));
532*3ac0a46fSAndroid Build Coastguard Worker }
533*3ac0a46fSAndroid Build Coastguard Worker else {
534*3ac0a46fSAndroid Build Coastguard Worker _cmsParallelizationPluginChunkType ParallelizationPluginChunk = { 0 };
535*3ac0a46fSAndroid Build Coastguard Worker ctx->chunks[ParallelizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &ParallelizationPluginChunk, sizeof(_cmsParallelizationPluginChunkType));
536*3ac0a46fSAndroid Build Coastguard Worker }
537*3ac0a46fSAndroid Build Coastguard Worker }
538*3ac0a46fSAndroid Build Coastguard Worker
539*3ac0a46fSAndroid Build Coastguard Worker // Register parallel processing
_cmsRegisterParallelizationPlugin(cmsContext ContextID,cmsPluginBase * Data)540*3ac0a46fSAndroid Build Coastguard Worker cmsBool _cmsRegisterParallelizationPlugin(cmsContext ContextID, cmsPluginBase* Data)
541*3ac0a46fSAndroid Build Coastguard Worker {
542*3ac0a46fSAndroid Build Coastguard Worker cmsPluginParalellization* Plugin = (cmsPluginParalellization*)Data;
543*3ac0a46fSAndroid Build Coastguard Worker _cmsParallelizationPluginChunkType* ctx = (_cmsParallelizationPluginChunkType*)_cmsContextGetClientChunk(ContextID, ParallelizationPlugin);
544*3ac0a46fSAndroid Build Coastguard Worker
545*3ac0a46fSAndroid Build Coastguard Worker if (Data == NULL) {
546*3ac0a46fSAndroid Build Coastguard Worker
547*3ac0a46fSAndroid Build Coastguard Worker // No parallelization routines
548*3ac0a46fSAndroid Build Coastguard Worker ctx->MaxWorkers = 0;
549*3ac0a46fSAndroid Build Coastguard Worker ctx->WorkerFlags = 0;
550*3ac0a46fSAndroid Build Coastguard Worker ctx->SchedulerFn = NULL;
551*3ac0a46fSAndroid Build Coastguard Worker return TRUE;
552*3ac0a46fSAndroid Build Coastguard Worker }
553*3ac0a46fSAndroid Build Coastguard Worker
554*3ac0a46fSAndroid Build Coastguard Worker // callback is required
555*3ac0a46fSAndroid Build Coastguard Worker if (Plugin->SchedulerFn == NULL) return FALSE;
556*3ac0a46fSAndroid Build Coastguard Worker
557*3ac0a46fSAndroid Build Coastguard Worker ctx->MaxWorkers = Plugin->MaxWorkers;
558*3ac0a46fSAndroid Build Coastguard Worker ctx->WorkerFlags = Plugin->WorkerFlags;
559*3ac0a46fSAndroid Build Coastguard Worker ctx->SchedulerFn = Plugin->SchedulerFn;
560*3ac0a46fSAndroid Build Coastguard Worker
561*3ac0a46fSAndroid Build Coastguard Worker // All is ok
562*3ac0a46fSAndroid Build Coastguard Worker return TRUE;
563*3ac0a46fSAndroid Build Coastguard Worker }
564*3ac0a46fSAndroid Build Coastguard Worker
565