| 1 | /* | 
|---|
| 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|---|
| 3 | * | 
|---|
| 4 | * This code is free software; you can redistribute it and/or modify it | 
|---|
| 5 | * under the terms of the GNU General Public License version 2 only, as | 
|---|
| 6 | * published by the Free Software Foundation.  Oracle designates this | 
|---|
| 7 | * particular file as subject to the "Classpath" exception as provided | 
|---|
| 8 | * by Oracle in the LICENSE file that accompanied this code. | 
|---|
| 9 | * | 
|---|
| 10 | * This code is distributed in the hope that it will be useful, but WITHOUT | 
|---|
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|---|
| 12 | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|---|
| 13 | * version 2 for more details (a copy is included in the LICENSE file that | 
|---|
| 14 | * accompanied this code). | 
|---|
| 15 | * | 
|---|
| 16 | * You should have received a copy of the GNU General Public License version | 
|---|
| 17 | * 2 along with this work; if not, write to the Free Software Foundation, | 
|---|
| 18 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|---|
| 19 | * | 
|---|
| 20 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|---|
| 21 | * or visit www.oracle.com if you need additional information or have any | 
|---|
| 22 | * questions. | 
|---|
| 23 | */ | 
|---|
| 24 |  | 
|---|
| 25 | // This file is available under and governed by the GNU General Public | 
|---|
| 26 | // License version 2 only, as published by the Free Software Foundation. | 
|---|
| 27 | // However, the following notice accompanied the original version of this | 
|---|
| 28 | // file: | 
|---|
| 29 | // | 
|---|
| 30 | //--------------------------------------------------------------------------------- | 
|---|
| 31 | // | 
|---|
| 32 | //  Little Color Management System | 
|---|
| 33 | //  Copyright (c) 1998-2017 Marti Maria Saguer | 
|---|
| 34 | // | 
|---|
| 35 | // Permission is hereby granted, free of charge, to any person obtaining | 
|---|
| 36 | // a copy of this software and associated documentation files (the "Software"), | 
|---|
| 37 | // to deal in the Software without restriction, including without limitation | 
|---|
| 38 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, | 
|---|
| 39 | // and/or sell copies of the Software, and to permit persons to whom the Software | 
|---|
| 40 | // is furnished to do so, subject to the following conditions: | 
|---|
| 41 | // | 
|---|
| 42 | // The above copyright notice and this permission notice shall be included in | 
|---|
| 43 | // all copies or substantial portions of the Software. | 
|---|
| 44 | // | 
|---|
| 45 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
|---|
| 46 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO | 
|---|
| 47 | // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
|---|
| 48 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | 
|---|
| 49 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | 
|---|
| 50 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | 
|---|
| 51 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 
|---|
| 52 | // | 
|---|
| 53 | //--------------------------------------------------------------------------------- | 
|---|
| 54 | // | 
|---|
| 55 | // This is the plug-in header file. Normal LittleCMS clients should not use it. | 
|---|
| 56 | // It is provided for plug-in writters that may want to access the support | 
|---|
| 57 | // functions to do low level operations. All plug-in related structures | 
|---|
| 58 | // are defined here. Including this file forces to include the standard API too. | 
|---|
| 59 |  | 
|---|
| 60 | #ifndef _lcms_plugin_H | 
|---|
| 61 |  | 
|---|
| 62 | // Deal with Microsoft's attempt at deprecating C standard runtime functions | 
|---|
| 63 | #ifdef _MSC_VER | 
|---|
| 64 | #    if (_MSC_VER >= 1400) | 
|---|
| 65 | #      ifndef _CRT_SECURE_NO_DEPRECATE | 
|---|
| 66 | #        define _CRT_SECURE_NO_DEPRECATE | 
|---|
| 67 | #      endif | 
|---|
| 68 | #      ifndef _CRT_SECURE_NO_WARNINGS | 
|---|
| 69 | #        define _CRT_SECURE_NO_WARNINGS | 
|---|
| 70 | #      endif | 
|---|
| 71 | #    endif | 
|---|
| 72 | #endif | 
|---|
| 73 |  | 
|---|
| 74 | #ifndef _lcms2_H | 
|---|
| 75 | #include "lcms2.h" | 
|---|
| 76 | #endif | 
|---|
| 77 |  | 
|---|
| 78 | // We need some standard C functions. | 
|---|
| 79 | #include <stdlib.h> | 
|---|
| 80 | #include <math.h> | 
|---|
| 81 | #include <stdarg.h> | 
|---|
| 82 | #include <memory.h> | 
|---|
| 83 | #include <string.h> | 
|---|
| 84 |  | 
|---|
| 85 |  | 
|---|
| 86 | #ifndef CMS_USE_CPP_API | 
|---|
| 87 | #   ifdef __cplusplus | 
|---|
| 88 | extern "C"{ | 
|---|
| 89 | #   endif | 
|---|
| 90 | #endif | 
|---|
| 91 |  | 
|---|
| 92 | // Vector & Matrix operations ----------------------------------------------------------------------- | 
|---|
| 93 |  | 
|---|
| 94 | // Axis of the matrix/array. No specific meaning at all. | 
|---|
| 95 | #define VX      0 | 
|---|
| 96 | #define VY      1 | 
|---|
| 97 | #define VZ      2 | 
|---|
| 98 |  | 
|---|
| 99 | // Vectors | 
|---|
| 100 | typedef struct { | 
|---|
| 101 | cmsFloat64Number n[3]; | 
|---|
| 102 |  | 
|---|
| 103 | } cmsVEC3; | 
|---|
| 104 |  | 
|---|
| 105 | // 3x3 Matrix | 
|---|
| 106 | typedef struct { | 
|---|
| 107 | cmsVEC3 v[3]; | 
|---|
| 108 |  | 
|---|
| 109 | } cmsMAT3; | 
|---|
| 110 |  | 
|---|
| 111 | CMSAPI void               CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z); | 
|---|
| 112 | CMSAPI void               CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b); | 
|---|
| 113 | CMSAPI void               CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v); | 
|---|
| 114 | CMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v); | 
|---|
| 115 | CMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3length(const cmsVEC3* a); | 
|---|
| 116 | CMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b); | 
|---|
| 117 |  | 
|---|
| 118 | CMSAPI void               CMSEXPORT _cmsMAT3identity(cmsMAT3* a); | 
|---|
| 119 | CMSAPI cmsBool            CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a); | 
|---|
| 120 | CMSAPI void               CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b); | 
|---|
| 121 | CMSAPI cmsBool            CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b); | 
|---|
| 122 | CMSAPI cmsBool            CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b); | 
|---|
| 123 | CMSAPI void               CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v); | 
|---|
| 124 |  | 
|---|
| 125 |  | 
|---|
| 126 | // Error logging  ------------------------------------------------------------------------------------- | 
|---|
| 127 |  | 
|---|
| 128 | CMSAPI void               CMSEXPORT  cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...); | 
|---|
| 129 |  | 
|---|
| 130 | // Memory management ---------------------------------------------------------------------------------- | 
|---|
| 131 |  | 
|---|
| 132 | CMSAPI void*              CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size); | 
|---|
| 133 | CMSAPI void*              CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size); | 
|---|
| 134 | CMSAPI void*              CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); | 
|---|
| 135 | CMSAPI void*              CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); | 
|---|
| 136 | CMSAPI void               CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr); | 
|---|
| 137 | CMSAPI void*              CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size); | 
|---|
| 138 |  | 
|---|
| 139 | // I/O handler ---------------------------------------------------------------------------------- | 
|---|
| 140 |  | 
|---|
| 141 | struct _cms_io_handler { | 
|---|
| 142 |  | 
|---|
| 143 | void* stream;   // Associated stream, which is implemented differently depending on media. | 
|---|
| 144 |  | 
|---|
| 145 | cmsContext        ContextID; | 
|---|
| 146 | cmsUInt32Number   UsedSpace; | 
|---|
| 147 | cmsUInt32Number   ReportedSize; | 
|---|
| 148 | char              PhysicalFile[cmsMAX_PATH]; | 
|---|
| 149 |  | 
|---|
| 150 | cmsUInt32Number   (* Read)(struct _cms_io_handler* iohandler, void *Buffer, | 
|---|
| 151 | cmsUInt32Number size, | 
|---|
| 152 | cmsUInt32Number count); | 
|---|
| 153 | cmsBool           (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset); | 
|---|
| 154 | cmsBool           (* Close)(struct _cms_io_handler* iohandler); | 
|---|
| 155 | cmsUInt32Number   (* Tell)(struct _cms_io_handler* iohandler); | 
|---|
| 156 | cmsBool           (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size, | 
|---|
| 157 | const void* Buffer); | 
|---|
| 158 | }; | 
|---|
| 159 |  | 
|---|
| 160 | // Endianness adjust functions | 
|---|
| 161 | CMSAPI cmsUInt16Number   CMSEXPORT  _cmsAdjustEndianess16(cmsUInt16Number Word); | 
|---|
| 162 | CMSAPI cmsUInt32Number   CMSEXPORT  _cmsAdjustEndianess32(cmsUInt32Number Value); | 
|---|
| 163 | CMSAPI void              CMSEXPORT  _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord); | 
|---|
| 164 |  | 
|---|
| 165 | // Helper IO functions | 
|---|
| 166 | CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt8Number(cmsIOHANDLER* io,  cmsUInt8Number* n); | 
|---|
| 167 | CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n); | 
|---|
| 168 | CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n); | 
|---|
| 169 | CMSAPI cmsBool           CMSEXPORT  _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n); | 
|---|
| 170 | CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); | 
|---|
| 171 | CMSAPI cmsBool           CMSEXPORT  _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n); | 
|---|
| 172 | CMSAPI cmsBool           CMSEXPORT  _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ); | 
|---|
| 173 | CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array); | 
|---|
| 174 |  | 
|---|
| 175 | CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n); | 
|---|
| 176 | CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n); | 
|---|
| 177 | CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n); | 
|---|
| 178 | CMSAPI cmsBool           CMSEXPORT  _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n); | 
|---|
| 179 | CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); | 
|---|
| 180 | CMSAPI cmsBool           CMSEXPORT  _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n); | 
|---|
| 181 | CMSAPI cmsBool           CMSEXPORT  _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ); | 
|---|
| 182 | CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array); | 
|---|
| 183 |  | 
|---|
| 184 | // ICC base tag | 
|---|
| 185 | typedef struct { | 
|---|
| 186 | cmsTagTypeSignature  sig; | 
|---|
| 187 | cmsInt8Number        reserved[4]; | 
|---|
| 188 |  | 
|---|
| 189 | } _cmsTagBase; | 
|---|
| 190 |  | 
|---|
| 191 | // Type base helper functions | 
|---|
| 192 | CMSAPI cmsTagTypeSignature  CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io); | 
|---|
| 193 | CMSAPI cmsBool              CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig); | 
|---|
| 194 |  | 
|---|
| 195 | // Alignment functions | 
|---|
| 196 | CMSAPI cmsBool             CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io); | 
|---|
| 197 | CMSAPI cmsBool             CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io); | 
|---|
| 198 |  | 
|---|
| 199 | // To deal with text streams. 2K at most | 
|---|
| 200 | CMSAPI cmsBool             CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...); | 
|---|
| 201 |  | 
|---|
| 202 | // Fixed point helper functions | 
|---|
| 203 | CMSAPI cmsFloat64Number    CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8); | 
|---|
| 204 | CMSAPI cmsUInt16Number     CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val); | 
|---|
| 205 |  | 
|---|
| 206 | CMSAPI cmsFloat64Number    CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32); | 
|---|
| 207 | CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v); | 
|---|
| 208 |  | 
|---|
| 209 | // Date/time helper functions | 
|---|
| 210 | CMSAPI void                CMSEXPORT (cmsDateTimeNumber *Dest, const struct tm *Source); | 
|---|
| 211 | CMSAPI void                CMSEXPORT (const cmsDateTimeNumber *Source, struct tm *Dest); | 
|---|
| 212 |  | 
|---|
| 213 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 214 |  | 
|---|
| 215 | // Shared callbacks for user data | 
|---|
| 216 | typedef void     (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data); | 
|---|
| 217 | typedef void*    (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data); | 
|---|
| 218 |  | 
|---|
| 219 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 220 |  | 
|---|
| 221 | // Plug-in foundation | 
|---|
| 222 | #define cmsPluginMagicNumber                 0x61637070     // 'acpp' | 
|---|
| 223 |  | 
|---|
| 224 | #define cmsPluginMemHandlerSig               0x6D656D48     // 'memH' | 
|---|
| 225 | #define cmsPluginInterpolationSig            0x696E7048     // 'inpH' | 
|---|
| 226 | #define cmsPluginParametricCurveSig          0x70617248     // 'parH' | 
|---|
| 227 | #define                0x66726D48     // 'frmH | 
|---|
| 228 | #define cmsPluginTagTypeSig                  0x74797048     // 'typH' | 
|---|
| 229 | #define cmsPluginTagSig                      0x74616748     // 'tagH' | 
|---|
| 230 | #define cmsPluginRenderingIntentSig          0x696E7448     // 'intH' | 
|---|
| 231 | #define cmsPluginMultiProcessElementSig      0x6D706548     // 'mpeH' | 
|---|
| 232 | #define cmsPluginOptimizationSig             0x6F707448     // 'optH' | 
|---|
| 233 | #define cmsPluginTransformSig                0x7A666D48     // 'xfmH' | 
|---|
| 234 | #define cmsPluginMutexSig                    0x6D747A48     // 'mtxH' | 
|---|
| 235 |  | 
|---|
| 236 | typedef struct _cmsPluginBaseStruct { | 
|---|
| 237 |  | 
|---|
| 238 | cmsUInt32Number                Magic;               // 'acpp' signature | 
|---|
| 239 | cmsUInt32Number                ExpectedVersion;     // Expected version of LittleCMS | 
|---|
| 240 | cmsUInt32Number                Type;                // Type of plug-in | 
|---|
| 241 | struct _cmsPluginBaseStruct*   Next;                // For multiple plugin definition. NULL for end of list. | 
|---|
| 242 |  | 
|---|
| 243 | } cmsPluginBase; | 
|---|
| 244 |  | 
|---|
| 245 | // Maximum number of types in a plugin array | 
|---|
| 246 | #define MAX_TYPES_IN_LCMS_PLUGIN    20 | 
|---|
| 247 |  | 
|---|
| 248 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 249 |  | 
|---|
| 250 | // Memory handler. Each new plug-in type replaces current behaviour | 
|---|
| 251 |  | 
|---|
| 252 | typedef void* (* _cmsMallocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); | 
|---|
| 253 | typedef void  (* _cmsFreeFnPtrType)(cmsContext ContextID, void *Ptr); | 
|---|
| 254 | typedef void* (* _cmsReallocFnPtrType)(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); | 
|---|
| 255 |  | 
|---|
| 256 | typedef void* (* _cmsMalloZerocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); | 
|---|
| 257 | typedef void* (* _cmsCallocFnPtrType)(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); | 
|---|
| 258 | typedef void* (* _cmsDupFnPtrType)(cmsContext ContextID, const void* Org, cmsUInt32Number size); | 
|---|
| 259 |  | 
|---|
| 260 | typedef struct { | 
|---|
| 261 |  | 
|---|
| 262 | cmsPluginBase base; | 
|---|
| 263 |  | 
|---|
| 264 | // Required | 
|---|
| 265 | _cmsMallocFnPtrType  MallocPtr; | 
|---|
| 266 | _cmsFreeFnPtrType    FreePtr; | 
|---|
| 267 | _cmsReallocFnPtrType ReallocPtr; | 
|---|
| 268 |  | 
|---|
| 269 | // Optional | 
|---|
| 270 | _cmsMalloZerocFnPtrType MallocZeroPtr; | 
|---|
| 271 | _cmsCallocFnPtrType     CallocPtr; | 
|---|
| 272 | _cmsDupFnPtrType        DupPtr; | 
|---|
| 273 |  | 
|---|
| 274 | } cmsPluginMemHandler; | 
|---|
| 275 |  | 
|---|
| 276 |  | 
|---|
| 277 | // ------------------------------------------------------------------------------------------------------------------ | 
|---|
| 278 |  | 
|---|
| 279 | // Interpolation. 16 bits and floating point versions. | 
|---|
| 280 | struct _cms_interp_struc; | 
|---|
| 281 |  | 
|---|
| 282 | // Interpolation callbacks | 
|---|
| 283 |  | 
|---|
| 284 | // 16 bits forward interpolation. This function performs precision-limited linear interpolation | 
|---|
| 285 | // and is supposed to be quite fast. Implementation may be tetrahedral or trilinear, and plug-ins may | 
|---|
| 286 | // choose to implement any other interpolation algorithm. | 
|---|
| 287 | typedef void (* _cmsInterpFn16)(register const cmsUInt16Number Input[], | 
|---|
| 288 | register cmsUInt16Number Output[], | 
|---|
| 289 | register const struct _cms_interp_struc* p); | 
|---|
| 290 |  | 
|---|
| 291 | // Floating point forward interpolation. Full precision interpolation using floats. This is not a | 
|---|
| 292 | // time critical function. Implementation may be tetrahedral or trilinear, and plug-ins may | 
|---|
| 293 | // choose to implement any other interpolation algorithm. | 
|---|
| 294 | typedef void (* _cmsInterpFnFloat)(cmsFloat32Number const Input[], | 
|---|
| 295 | cmsFloat32Number Output[], | 
|---|
| 296 | const struct _cms_interp_struc* p); | 
|---|
| 297 |  | 
|---|
| 298 |  | 
|---|
| 299 |  | 
|---|
| 300 | // This type holds a pointer to an interpolator that can be either 16 bits or float | 
|---|
| 301 | typedef union { | 
|---|
| 302 | _cmsInterpFn16       Lerp16;            // Forward interpolation in 16 bits | 
|---|
| 303 | _cmsInterpFnFloat    LerpFloat;         // Forward interpolation in floating point | 
|---|
| 304 | } cmsInterpFunction; | 
|---|
| 305 |  | 
|---|
| 306 | // Flags for interpolator selection | 
|---|
| 307 | #define CMS_LERP_FLAGS_16BITS             0x0000        // The default | 
|---|
| 308 | #define CMS_LERP_FLAGS_FLOAT              0x0001        // Requires different implementation | 
|---|
| 309 | #define CMS_LERP_FLAGS_TRILINEAR          0x0100        // Hint only | 
|---|
| 310 |  | 
|---|
| 311 |  | 
|---|
| 312 | #define MAX_INPUT_DIMENSIONS 8 | 
|---|
| 313 |  | 
|---|
| 314 | typedef struct _cms_interp_struc {  // Used on all interpolations. Supplied by lcms2 when calling the interpolation function | 
|---|
| 315 |  | 
|---|
| 316 | cmsContext ContextID;     // The calling thread | 
|---|
| 317 |  | 
|---|
| 318 | cmsUInt32Number dwFlags;  // Keep original flags | 
|---|
| 319 | cmsUInt32Number nInputs;  // != 1 only in 3D interpolation | 
|---|
| 320 | cmsUInt32Number nOutputs; // != 1 only in 3D interpolation | 
|---|
| 321 |  | 
|---|
| 322 | cmsUInt32Number nSamples[MAX_INPUT_DIMENSIONS];  // Valid on all kinds of tables | 
|---|
| 323 | cmsUInt32Number Domain[MAX_INPUT_DIMENSIONS];    // Domain = nSamples - 1 | 
|---|
| 324 |  | 
|---|
| 325 | cmsUInt32Number opta[MAX_INPUT_DIMENSIONS];     // Optimization for 3D CLUT. This is the number of nodes premultiplied for each | 
|---|
| 326 | // dimension. For example, in 7 nodes, 7, 7^2 , 7^3, 7^4, etc. On non-regular | 
|---|
| 327 | // Samplings may vary according of the number of nodes for each dimension. | 
|---|
| 328 |  | 
|---|
| 329 | const void *Table;                // Points to the actual interpolation table | 
|---|
| 330 | cmsInterpFunction Interpolation;  // Points to the function to do the interpolation | 
|---|
| 331 |  | 
|---|
| 332 | } cmsInterpParams; | 
|---|
| 333 |  | 
|---|
| 334 | // Interpolators factory | 
|---|
| 335 | typedef cmsInterpFunction (* cmsInterpFnFactory)(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); | 
|---|
| 336 |  | 
|---|
| 337 | // The plug-in | 
|---|
| 338 | typedef struct { | 
|---|
| 339 | cmsPluginBase base; | 
|---|
| 340 |  | 
|---|
| 341 | // Points to a user-supplied function which implements the factory | 
|---|
| 342 | cmsInterpFnFactory InterpolatorsFactory; | 
|---|
| 343 |  | 
|---|
| 344 | } cmsPluginInterpolation; | 
|---|
| 345 |  | 
|---|
| 346 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 347 |  | 
|---|
| 348 | // Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10 | 
|---|
| 349 |  | 
|---|
| 350 | // Evaluator callback for user-supplied parametric curves. May implement more than one type | 
|---|
| 351 | typedef  cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R); | 
|---|
| 352 |  | 
|---|
| 353 | // Plug-in may implement an arbitrary number of parametric curves | 
|---|
| 354 | typedef struct { | 
|---|
| 355 | cmsPluginBase base; | 
|---|
| 356 |  | 
|---|
| 357 | cmsUInt32Number nFunctions;                                     // Number of supported functions | 
|---|
| 358 | cmsUInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN];        // The identification types | 
|---|
| 359 | cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN];       // Number of parameters for each function | 
|---|
| 360 |  | 
|---|
| 361 | cmsParametricCurveEvaluator    Evaluator;                       // The evaluator | 
|---|
| 362 |  | 
|---|
| 363 | } cmsPluginParametricCurves; | 
|---|
| 364 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 365 |  | 
|---|
| 366 | // Formatters. This plug-in adds new handlers, replacing them if they already exist. Formatters dealing with | 
|---|
| 367 | // cmsFloat32Number (bps = 4) or double (bps = 0) types are requested via FormatterFloat callback. Others come across | 
|---|
| 368 | // Formatter16 callback | 
|---|
| 369 |  | 
|---|
| 370 | struct _cmstransform_struct; | 
|---|
| 371 |  | 
|---|
| 372 | typedef cmsUInt8Number* (* cmsFormatter16)(register struct _cmstransform_struct* CMMcargo, | 
|---|
| 373 | register cmsUInt16Number Values[], | 
|---|
| 374 | register cmsUInt8Number* Buffer, | 
|---|
| 375 | register cmsUInt32Number Stride); | 
|---|
| 376 |  | 
|---|
| 377 | typedef cmsUInt8Number* (* cmsFormatterFloat)(struct _cmstransform_struct* CMMcargo, | 
|---|
| 378 | cmsFloat32Number Values[], | 
|---|
| 379 | cmsUInt8Number*  Buffer, | 
|---|
| 380 | cmsUInt32Number  Stride); | 
|---|
| 381 |  | 
|---|
| 382 | // This type holds a pointer to a formatter that can be either 16 bits or cmsFloat32Number | 
|---|
| 383 | typedef union { | 
|---|
| 384 | cmsFormatter16    Fmt16; | 
|---|
| 385 | cmsFormatterFloat FmtFloat; | 
|---|
| 386 |  | 
|---|
| 387 | } cmsFormatter; | 
|---|
| 388 |  | 
|---|
| 389 | #define CMS_PACK_FLAGS_16BITS       0x0000 | 
|---|
| 390 | #define CMS_PACK_FLAGS_FLOAT        0x0001 | 
|---|
| 391 |  | 
|---|
| 392 | typedef enum { cmsFormatterInput=0, cmsFormatterOutput=1 } cmsFormatterDirection; | 
|---|
| 393 |  | 
|---|
| 394 | typedef cmsFormatter (* cmsFormatterFactory)(cmsUInt32Number Type,           // Specific type, i.e. TYPE_RGB_8 | 
|---|
| 395 | cmsFormatterDirection Dir, | 
|---|
| 396 | cmsUInt32Number dwFlags);      // precision | 
|---|
| 397 |  | 
|---|
| 398 | // Plug-in may implement an arbitrary number of formatters | 
|---|
| 399 | typedef struct { | 
|---|
| 400 | cmsPluginBase          base; | 
|---|
| 401 | cmsFormatterFactory    FormattersFactory; | 
|---|
| 402 |  | 
|---|
| 403 | } cmsPluginFormatters; | 
|---|
| 404 |  | 
|---|
| 405 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 406 |  | 
|---|
| 407 | // Tag type handler. Each type is free to return anything it wants, and it is up to the caller to | 
|---|
| 408 | // know in advance what is the type contained in the tag. | 
|---|
| 409 | typedef struct _cms_typehandler_struct { | 
|---|
| 410 |  | 
|---|
| 411 | cmsTagTypeSignature Signature;     // The signature of the type | 
|---|
| 412 |  | 
|---|
| 413 | // Allocates and reads items | 
|---|
| 414 | void *   (* ReadPtr)(struct _cms_typehandler_struct* self, | 
|---|
| 415 | cmsIOHANDLER*      io, | 
|---|
| 416 | cmsUInt32Number*   nItems, | 
|---|
| 417 | cmsUInt32Number    SizeOfTag); | 
|---|
| 418 |  | 
|---|
| 419 | // Writes n Items | 
|---|
| 420 | cmsBool  (* WritePtr)(struct _cms_typehandler_struct* self, | 
|---|
| 421 | cmsIOHANDLER*     io, | 
|---|
| 422 | void*             Ptr, | 
|---|
| 423 | cmsUInt32Number   nItems); | 
|---|
| 424 |  | 
|---|
| 425 | // Duplicate an item or array of items | 
|---|
| 426 | void*   (* DupPtr)(struct _cms_typehandler_struct* self, | 
|---|
| 427 | const void *Ptr, | 
|---|
| 428 | cmsUInt32Number n); | 
|---|
| 429 |  | 
|---|
| 430 | // Free all resources | 
|---|
| 431 | void    (* FreePtr)(struct _cms_typehandler_struct* self, | 
|---|
| 432 | void *Ptr); | 
|---|
| 433 |  | 
|---|
| 434 | // Additional parameters used by the calling thread | 
|---|
| 435 | cmsContext       ContextID; | 
|---|
| 436 | cmsUInt32Number  ICCVersion; | 
|---|
| 437 |  | 
|---|
| 438 | } cmsTagTypeHandler; | 
|---|
| 439 |  | 
|---|
| 440 | // Each plug-in implements a single type | 
|---|
| 441 | typedef struct { | 
|---|
| 442 | cmsPluginBase      base; | 
|---|
| 443 | cmsTagTypeHandler  Handler; | 
|---|
| 444 |  | 
|---|
| 445 | } cmsPluginTagType; | 
|---|
| 446 |  | 
|---|
| 447 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 448 |  | 
|---|
| 449 | // This is the tag plugin, which identifies tags. For writing, a pointer to function is provided. | 
|---|
| 450 | // This function should return the desired type for this tag, given the version of profile | 
|---|
| 451 | // and the data being serialized. | 
|---|
| 452 | typedef struct { | 
|---|
| 453 |  | 
|---|
| 454 | cmsUInt32Number     ElemCount;          // If this tag needs an array, how many elements should keep | 
|---|
| 455 |  | 
|---|
| 456 | // For reading. | 
|---|
| 457 | cmsUInt32Number     nSupportedTypes;    // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum) | 
|---|
| 458 | cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN]; | 
|---|
| 459 |  | 
|---|
| 460 | // For writing | 
|---|
| 461 | cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data); | 
|---|
| 462 |  | 
|---|
| 463 | } cmsTagDescriptor; | 
|---|
| 464 |  | 
|---|
| 465 | // Plug-in implements a single tag | 
|---|
| 466 | typedef struct { | 
|---|
| 467 | cmsPluginBase    base; | 
|---|
| 468 |  | 
|---|
| 469 | cmsTagSignature  Signature; | 
|---|
| 470 | cmsTagDescriptor Descriptor; | 
|---|
| 471 |  | 
|---|
| 472 | } cmsPluginTag; | 
|---|
| 473 |  | 
|---|
| 474 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 475 |  | 
|---|
| 476 | // Custom intents. This function should join all profiles specified in the array in | 
|---|
| 477 | // a single LUT. Any custom intent in the chain redirects to custom function. If more than | 
|---|
| 478 | // one custom intent is found, the one located first is invoked. Usually users should use only one | 
|---|
| 479 | // custom intent, so mixing custom intents in same multiprofile transform is not supported. | 
|---|
| 480 |  | 
|---|
| 481 | typedef cmsPipeline* (* cmsIntentFn)( cmsContext       ContextID, | 
|---|
| 482 | cmsUInt32Number  nProfiles, | 
|---|
| 483 | cmsUInt32Number  Intents[], | 
|---|
| 484 | cmsHPROFILE      hProfiles[], | 
|---|
| 485 | cmsBool          BPC[], | 
|---|
| 486 | cmsFloat64Number AdaptationStates[], | 
|---|
| 487 | cmsUInt32Number  dwFlags); | 
|---|
| 488 |  | 
|---|
| 489 |  | 
|---|
| 490 | // Each plug-in defines a single intent number. | 
|---|
| 491 | typedef struct { | 
|---|
| 492 | cmsPluginBase     base; | 
|---|
| 493 | cmsUInt32Number   Intent; | 
|---|
| 494 | cmsIntentFn       Link; | 
|---|
| 495 | char              Description[256]; | 
|---|
| 496 |  | 
|---|
| 497 | } cmsPluginRenderingIntent; | 
|---|
| 498 |  | 
|---|
| 499 |  | 
|---|
| 500 | // The default ICC intents (perceptual, saturation, rel.col and abs.col) | 
|---|
| 501 | CMSAPI cmsPipeline*  CMSEXPORT _cmsDefaultICCintents(cmsContext       ContextID, | 
|---|
| 502 | cmsUInt32Number  nProfiles, | 
|---|
| 503 | cmsUInt32Number  Intents[], | 
|---|
| 504 | cmsHPROFILE      hProfiles[], | 
|---|
| 505 | cmsBool          BPC[], | 
|---|
| 506 | cmsFloat64Number AdaptationStates[], | 
|---|
| 507 | cmsUInt32Number  dwFlags); | 
|---|
| 508 |  | 
|---|
| 509 |  | 
|---|
| 510 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 511 |  | 
|---|
| 512 | // Pipelines, Multi Process Elements. | 
|---|
| 513 |  | 
|---|
| 514 | typedef void (* _cmsStageEvalFn)     (const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage* mpe); | 
|---|
| 515 | typedef void*(* _cmsStageDupElemFn)  (cmsStage* mpe); | 
|---|
| 516 | typedef void (* _cmsStageFreeElemFn) (cmsStage* mpe); | 
|---|
| 517 |  | 
|---|
| 518 |  | 
|---|
| 519 | // This function allocates a generic MPE | 
|---|
| 520 | CMSAPI cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID, | 
|---|
| 521 | cmsStageSignature     Type, | 
|---|
| 522 | cmsUInt32Number       InputChannels, | 
|---|
| 523 | cmsUInt32Number       OutputChannels, | 
|---|
| 524 | _cmsStageEvalFn       EvalPtr,            // Points to fn that evaluates the element (always in floating point) | 
|---|
| 525 | _cmsStageDupElemFn    DupElemPtr,         // Points to a fn that duplicates the stage | 
|---|
| 526 | _cmsStageFreeElemFn   FreePtr,            // Points to a fn that sets the element free | 
|---|
| 527 | void*                 Data);              // A generic pointer to whatever memory needed by the element | 
|---|
| 528 | typedef struct { | 
|---|
| 529 | cmsPluginBase     base; | 
|---|
| 530 | cmsTagTypeHandler Handler; | 
|---|
| 531 |  | 
|---|
| 532 | }  cmsPluginMultiProcessElement; | 
|---|
| 533 |  | 
|---|
| 534 |  | 
|---|
| 535 | // Data kept in "Element" member of cmsStage | 
|---|
| 536 |  | 
|---|
| 537 | // Curves | 
|---|
| 538 | typedef struct { | 
|---|
| 539 | cmsUInt32Number nCurves; | 
|---|
| 540 | cmsToneCurve**  TheCurves; | 
|---|
| 541 |  | 
|---|
| 542 | } _cmsStageToneCurvesData; | 
|---|
| 543 |  | 
|---|
| 544 | // Matrix | 
|---|
| 545 | typedef struct { | 
|---|
| 546 | cmsFloat64Number*  Double;          // floating point for the matrix | 
|---|
| 547 | cmsFloat64Number*  Offset;          // The offset | 
|---|
| 548 |  | 
|---|
| 549 | } _cmsStageMatrixData; | 
|---|
| 550 |  | 
|---|
| 551 | // CLUT | 
|---|
| 552 | typedef struct { | 
|---|
| 553 |  | 
|---|
| 554 | union {                       // Can have only one of both representations at same time | 
|---|
| 555 | cmsUInt16Number*  T;      // Points to the table 16 bits table | 
|---|
| 556 | cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table | 
|---|
| 557 |  | 
|---|
| 558 | } Tab; | 
|---|
| 559 |  | 
|---|
| 560 | cmsInterpParams* Params; | 
|---|
| 561 | cmsUInt32Number  nEntries; | 
|---|
| 562 | cmsBool          HasFloatValues; | 
|---|
| 563 |  | 
|---|
| 564 | } _cmsStageCLutData; | 
|---|
| 565 |  | 
|---|
| 566 |  | 
|---|
| 567 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 568 | // Optimization. Using this plug-in, additional optimization strategies may be implemented. | 
|---|
| 569 | // The function should return TRUE if any optimization is done on the LUT, this terminates | 
|---|
| 570 | // the optimization  search. Or FALSE if it is unable to optimize and want to give a chance | 
|---|
| 571 | // to the rest of optimizers. | 
|---|
| 572 |  | 
|---|
| 573 | typedef void     (* _cmsOPTeval16Fn)(register const cmsUInt16Number In[], | 
|---|
| 574 | register cmsUInt16Number Out[], | 
|---|
| 575 | register const void* Data); | 
|---|
| 576 |  | 
|---|
| 577 |  | 
|---|
| 578 | typedef cmsBool  (* _cmsOPToptimizeFn)(cmsPipeline** Lut, | 
|---|
| 579 | cmsUInt32Number  Intent, | 
|---|
| 580 | cmsUInt32Number* InputFormat, | 
|---|
| 581 | cmsUInt32Number* OutputFormat, | 
|---|
| 582 | cmsUInt32Number* dwFlags); | 
|---|
| 583 |  | 
|---|
| 584 | // This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional | 
|---|
| 585 | // duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. | 
|---|
| 586 |  | 
|---|
| 587 | CMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, | 
|---|
| 588 | _cmsOPTeval16Fn Eval16, | 
|---|
| 589 | void* PrivateData, | 
|---|
| 590 | _cmsFreeUserDataFn FreePrivateDataFn, | 
|---|
| 591 | _cmsDupUserDataFn DupPrivateDataFn); | 
|---|
| 592 |  | 
|---|
| 593 | typedef struct { | 
|---|
| 594 | cmsPluginBase     base; | 
|---|
| 595 |  | 
|---|
| 596 | // Optimize entry point | 
|---|
| 597 | _cmsOPToptimizeFn  OptimizePtr; | 
|---|
| 598 |  | 
|---|
| 599 | }  cmsPluginOptimization; | 
|---|
| 600 |  | 
|---|
| 601 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 602 | // Full xform | 
|---|
| 603 |  | 
|---|
| 604 | typedef struct { | 
|---|
| 605 | cmsUInt32Number BytesPerLineIn; | 
|---|
| 606 | cmsUInt32Number BytesPerLineOut; | 
|---|
| 607 | cmsUInt32Number BytesPerPlaneIn; | 
|---|
| 608 | cmsUInt32Number BytesPerPlaneOut; | 
|---|
| 609 |  | 
|---|
| 610 | } cmsStride; | 
|---|
| 611 |  | 
|---|
| 612 | typedef void     (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo,   // Legacy function, handles just ONE scanline. | 
|---|
| 613 | const void* InputBuffer, | 
|---|
| 614 | void* OutputBuffer, | 
|---|
| 615 | cmsUInt32Number Size, | 
|---|
| 616 | cmsUInt32Number Stride);                 // Stride in bytes to the next plana in planar formats | 
|---|
| 617 |  | 
|---|
| 618 |  | 
|---|
| 619 | typedef void     (*_cmsTransform2Fn)(struct _cmstransform_struct *CMMcargo, | 
|---|
| 620 | const void* InputBuffer, | 
|---|
| 621 | void* OutputBuffer, | 
|---|
| 622 | cmsUInt32Number PixelsPerLine, | 
|---|
| 623 | cmsUInt32Number LineCount, | 
|---|
| 624 | const cmsStride* Stride); | 
|---|
| 625 |  | 
|---|
| 626 | typedef cmsBool  (* _cmsTransformFactory)(_cmsTransformFn* xform, | 
|---|
| 627 | void** UserData, | 
|---|
| 628 | _cmsFreeUserDataFn* FreePrivateDataFn, | 
|---|
| 629 | cmsPipeline** Lut, | 
|---|
| 630 | cmsUInt32Number* InputFormat, | 
|---|
| 631 | cmsUInt32Number* OutputFormat, | 
|---|
| 632 | cmsUInt32Number* dwFlags); | 
|---|
| 633 |  | 
|---|
| 634 | typedef cmsBool  (* _cmsTransform2Factory)(_cmsTransform2Fn* xform, | 
|---|
| 635 | void** UserData, | 
|---|
| 636 | _cmsFreeUserDataFn* FreePrivateDataFn, | 
|---|
| 637 | cmsPipeline** Lut, | 
|---|
| 638 | cmsUInt32Number* InputFormat, | 
|---|
| 639 | cmsUInt32Number* OutputFormat, | 
|---|
| 640 | cmsUInt32Number* dwFlags); | 
|---|
| 641 |  | 
|---|
| 642 |  | 
|---|
| 643 | // Retrieve user data as specified by the factory | 
|---|
| 644 | CMSAPI void   CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn); | 
|---|
| 645 | CMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo); | 
|---|
| 646 |  | 
|---|
| 647 |  | 
|---|
| 648 | // Retrieve formatters | 
|---|
| 649 | CMSAPI void   CMSEXPORT _cmsGetTransformFormatters16   (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput); | 
|---|
| 650 | CMSAPI void   CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput); | 
|---|
| 651 |  | 
|---|
| 652 | typedef struct { | 
|---|
| 653 | cmsPluginBase     base; | 
|---|
| 654 |  | 
|---|
| 655 | // Transform entry point | 
|---|
| 656 | union { | 
|---|
| 657 | _cmsTransformFactory        legacy_xform; | 
|---|
| 658 | _cmsTransform2Factory       xform; | 
|---|
| 659 | } factories; | 
|---|
| 660 |  | 
|---|
| 661 | }  cmsPluginTransform; | 
|---|
| 662 |  | 
|---|
| 663 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 664 | // Mutex | 
|---|
| 665 |  | 
|---|
| 666 | typedef void*    (* _cmsCreateMutexFnPtrType)(cmsContext ContextID); | 
|---|
| 667 | typedef void     (* _cmsDestroyMutexFnPtrType)(cmsContext ContextID, void* mtx); | 
|---|
| 668 | typedef cmsBool  (* _cmsLockMutexFnPtrType)(cmsContext ContextID, void* mtx); | 
|---|
| 669 | typedef void     (* _cmsUnlockMutexFnPtrType)(cmsContext ContextID, void* mtx); | 
|---|
| 670 |  | 
|---|
| 671 | typedef struct { | 
|---|
| 672 | cmsPluginBase     base; | 
|---|
| 673 |  | 
|---|
| 674 | _cmsCreateMutexFnPtrType  CreateMutexPtr; | 
|---|
| 675 | _cmsDestroyMutexFnPtrType DestroyMutexPtr; | 
|---|
| 676 | _cmsLockMutexFnPtrType    LockMutexPtr; | 
|---|
| 677 | _cmsUnlockMutexFnPtrType  UnlockMutexPtr; | 
|---|
| 678 |  | 
|---|
| 679 | }  cmsPluginMutex; | 
|---|
| 680 |  | 
|---|
| 681 | CMSAPI void*   CMSEXPORT _cmsCreateMutex(cmsContext ContextID); | 
|---|
| 682 | CMSAPI void    CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx); | 
|---|
| 683 | CMSAPI cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx); | 
|---|
| 684 | CMSAPI void    CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx); | 
|---|
| 685 |  | 
|---|
| 686 |  | 
|---|
| 687 | #ifndef CMS_USE_CPP_API | 
|---|
| 688 | #   ifdef __cplusplus | 
|---|
| 689 | } | 
|---|
| 690 | #   endif | 
|---|
| 691 | #endif | 
|---|
| 692 |  | 
|---|
| 693 | #define _lcms_plugin_H | 
|---|
| 694 | #endif | 
|---|
| 695 |  | 
|---|