1 //---------------------------------------------------------------------------------
3 // Little Color Management System
4 // Copyright (c) 1998-2013 Marti Maria Saguer
6 // Permission is hereby granted, free of charge, to any person obtaining
7 // a copy of this software and associated documentation files (the "Software"),
8 // to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 // and/or sell copies of the Software, and to permit persons to whom the Software
11 // is furnished to do so, subject to the following conditions:
13 // The above copyright notice and this permission notice shall be included in
14 // all copies or substantial portions of the Software.
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
18 // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 //---------------------------------------------------------------------------------
31 // ********** Configuration toggles ****************************************
36 // Uncomment this one if you are using big endian machines
37 #define CMS_USE_BIG_ENDIAN 1
41 // Uncomment this one if your compiler/machine does NOT support the
43 // #define CMS_DONT_USE_INT64 1
45 // Uncomment this if your compiler doesn't work with fast floor function
46 // #define CMS_DONT_USE_FAST_FLOOR 1
48 // Uncomment this line if you want lcms to use the black point tag in profile,
49 // if commented, lcms will compute the black point by its own.
50 // It is safer to leave it commented out
51 // #define CMS_USE_PROFILE_BLACK_POINT_TAG 1
53 // Uncomment this line if you are compiling as C++ and want a C++ API
54 // #define CMS_USE_CPP_API
56 // Uncomment this line if you need strict CGATS syntax. Makes CGATS files to
57 // require "KEYWORD" on undefined identifiers, keep it comented out unless needed
58 // #define CMS_STRICT_CGATS 1
60 // Uncomment to get rid of the tables for "half" float support
61 // #define CMS_NO_HALF_SUPPORT 1
63 // ********** End of configuration toggles ******************************
68 // Needed for portability (C99 per 7.1.2)
73 #ifndef CMS_USE_CPP_API
80 #define LCMS_VERSION 2050
82 // I will give the chance of redefining basic types for compilers that are not fully C99 compliant
83 #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
86 typedef unsigned char cmsUInt8Number
; // That is guaranteed by the C99 spec
87 typedef signed char cmsInt8Number
; // That is guaranteed by the C99 spec
90 # error "Unable to find 8 bit type, unsupported compiler"
93 // IEEE float storage numbers
94 typedef float cmsFloat32Number
;
95 typedef double cmsFloat64Number
;
98 #if (USHRT_MAX == 65535U)
99 typedef unsigned short cmsUInt16Number
;
100 #elif (UINT_MAX == 65535U)
101 typedef unsigned int cmsUInt16Number
;
103 # error "Unable to find 16 bits unsigned type, unsupported compiler"
106 #if (SHRT_MAX == 32767)
107 typedef short cmsInt16Number
;
108 #elif (INT_MAX == 32767)
109 typedef int cmsInt16Number
;
111 # error "Unable to find 16 bits signed type, unsupported compiler"
115 #if (UINT_MAX == 4294967295U)
116 typedef unsigned int cmsUInt32Number
;
117 #elif (ULONG_MAX == 4294967295U)
118 typedef unsigned long cmsUInt32Number
;
120 # error "Unable to find 32 bit unsigned type, unsupported compiler"
123 #if (INT_MAX == +2147483647)
124 typedef int cmsInt32Number
;
125 #elif (LONG_MAX == +2147483647)
126 typedef long cmsInt32Number
;
128 # error "Unable to find 32 bit signed type, unsupported compiler"
132 #ifndef CMS_DONT_USE_INT64
133 # if (ULONG_MAX == 18446744073709551615U)
134 typedef unsigned long cmsUInt64Number
;
135 # elif (ULLONG_MAX == 18446744073709551615U)
136 typedef unsigned long long cmsUInt64Number
;
138 # define CMS_DONT_USE_INT64 1
140 # if (LONG_MAX == +9223372036854775807)
141 typedef long cmsInt64Number
;
142 # elif (LLONG_MAX == +9223372036854775807)
143 typedef long long cmsInt64Number
;
145 # define CMS_DONT_USE_INT64 1
150 // In the case 64 bit numbers are not supported by the compiler
151 #ifdef CMS_DONT_USE_INT64
152 typedef cmsUInt32Number cmsUInt64Number
[2];
153 typedef cmsInt32Number cmsInt64Number
[2];
157 typedef cmsUInt32Number cmsSignature
;
158 typedef cmsUInt16Number cmsU8Fixed8Number
;
159 typedef cmsInt32Number cmsS15Fixed16Number
;
160 typedef cmsUInt32Number cmsU16Fixed16Number
;
162 // Boolean type, which will be using the native integer
165 // Try to detect windows
166 #if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_)
167 # define CMS_IS_WINDOWS_ 1
171 # define CMS_IS_WINDOWS_ 1
175 # define CMS_IS_WINDOWS_ 1
178 // Try to detect big endian platforms. This list can be endless, so only some checks are performed over here.
179 // you can pass this toggle to the compiler by using -DCMS_USE_BIG_ENDIAN or something similar
181 #if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)
182 # define CMS_USE_BIG_ENDIAN 1
185 #if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc)
186 # define CMS_USE_BIG_ENDIAN 1
189 #if defined(__ppc__) || defined(__s390__) || defined(__s390x__)
190 # define CMS_USE_BIG_ENDIAN 1
193 #ifdef TARGET_CPU_PPC
195 # define CMS_USE_BIG_ENDIAN 1
200 # ifdef __BIG_ENDIAN__
201 # define CMS_USE_BIG_ENDIAN 1
205 // Calling convention -- this is hardly platform and compiler dependent
206 #ifdef CMS_IS_WINDOWS_
207 # if defined(CMS_DLL) || defined(CMS_DLL_BUILD)
209 # define CMSEXPORT __stdcall _export
212 # define CMSEXPORT _stdcall
213 # ifdef CMS_DLL_BUILD
214 # define CMSAPI __declspec(dllexport)
216 # define CMSAPI __declspec(dllimport)
228 // Some common definitions
229 #define cmsMAX_PATH 256
238 // D50 XYZ normalized to Y=1.0
239 #define cmsD50X 0.9642
241 #define cmsD50Z 0.8249
243 // V4 perceptual black
244 #define cmsPERCEPTUAL_BLACK_X 0.00336
245 #define cmsPERCEPTUAL_BLACK_Y 0.0034731
246 #define cmsPERCEPTUAL_BLACK_Z 0.00287
248 // Definitions in ICC spec
249 #define cmsMagicNumber 0x61637370 // 'acsp'
250 #define lcmsSignature 0x6c636d73 // 'lcms'
253 // Base ICC type definitions
255 cmsSigChromaticityType
= 0x6368726D, // 'chrm'
256 cmsSigColorantOrderType
= 0x636C726F, // 'clro'
257 cmsSigColorantTableType
= 0x636C7274, // 'clrt'
258 cmsSigCrdInfoType
= 0x63726469, // 'crdi'
259 cmsSigCurveType
= 0x63757276, // 'curv'
260 cmsSigDataType
= 0x64617461, // 'data'
261 cmsSigDictType
= 0x64696374, // 'dict'
262 cmsSigDateTimeType
= 0x6474696D, // 'dtim'
263 cmsSigDeviceSettingsType
= 0x64657673, // 'devs'
264 cmsSigLut16Type
= 0x6d667432, // 'mft2'
265 cmsSigLut8Type
= 0x6d667431, // 'mft1'
266 cmsSigLutAtoBType
= 0x6d414220, // 'mAB '
267 cmsSigLutBtoAType
= 0x6d424120, // 'mBA '
268 cmsSigMeasurementType
= 0x6D656173, // 'meas'
269 cmsSigMultiLocalizedUnicodeType
= 0x6D6C7563, // 'mluc'
270 cmsSigMultiProcessElementType
= 0x6D706574, // 'mpet'
271 cmsSigNamedColorType
= 0x6E636f6C, // 'ncol' -- DEPRECATED!
272 cmsSigNamedColor2Type
= 0x6E636C32, // 'ncl2'
273 cmsSigParametricCurveType
= 0x70617261, // 'para'
274 cmsSigProfileSequenceDescType
= 0x70736571, // 'pseq'
275 cmsSigProfileSequenceIdType
= 0x70736964, // 'psid'
276 cmsSigResponseCurveSet16Type
= 0x72637332, // 'rcs2'
277 cmsSigS15Fixed16ArrayType
= 0x73663332, // 'sf32'
278 cmsSigScreeningType
= 0x7363726E, // 'scrn'
279 cmsSigSignatureType
= 0x73696720, // 'sig '
280 cmsSigTextType
= 0x74657874, // 'text'
281 cmsSigTextDescriptionType
= 0x64657363, // 'desc'
282 cmsSigU16Fixed16ArrayType
= 0x75663332, // 'uf32'
283 cmsSigUcrBgType
= 0x62666420, // 'bfd '
284 cmsSigUInt16ArrayType
= 0x75693136, // 'ui16'
285 cmsSigUInt32ArrayType
= 0x75693332, // 'ui32'
286 cmsSigUInt64ArrayType
= 0x75693634, // 'ui64'
287 cmsSigUInt8ArrayType
= 0x75693038, // 'ui08'
288 cmsSigVcgtType
= 0x76636774, // 'vcgt'
289 cmsSigViewingConditionsType
= 0x76696577, // 'view'
290 cmsSigXYZType
= 0x58595A20 // 'XYZ '
293 } cmsTagTypeSignature
;
295 // Base ICC tag definitions
297 cmsSigAToB0Tag
= 0x41324230, // 'A2B0'
298 cmsSigAToB1Tag
= 0x41324231, // 'A2B1'
299 cmsSigAToB2Tag
= 0x41324232, // 'A2B2'
300 cmsSigBlueColorantTag
= 0x6258595A, // 'bXYZ'
301 cmsSigBlueMatrixColumnTag
= 0x6258595A, // 'bXYZ'
302 cmsSigBlueTRCTag
= 0x62545243, // 'bTRC'
303 cmsSigBToA0Tag
= 0x42324130, // 'B2A0'
304 cmsSigBToA1Tag
= 0x42324131, // 'B2A1'
305 cmsSigBToA2Tag
= 0x42324132, // 'B2A2'
306 cmsSigCalibrationDateTimeTag
= 0x63616C74, // 'calt'
307 cmsSigCharTargetTag
= 0x74617267, // 'targ'
308 cmsSigChromaticAdaptationTag
= 0x63686164, // 'chad'
309 cmsSigChromaticityTag
= 0x6368726D, // 'chrm'
310 cmsSigColorantOrderTag
= 0x636C726F, // 'clro'
311 cmsSigColorantTableTag
= 0x636C7274, // 'clrt'
312 cmsSigColorantTableOutTag
= 0x636C6F74, // 'clot'
313 cmsSigColorimetricIntentImageStateTag
= 0x63696973, // 'ciis'
314 cmsSigCopyrightTag
= 0x63707274, // 'cprt'
315 cmsSigCrdInfoTag
= 0x63726469, // 'crdi'
316 cmsSigDataTag
= 0x64617461, // 'data'
317 cmsSigDateTimeTag
= 0x6474696D, // 'dtim'
318 cmsSigDeviceMfgDescTag
= 0x646D6E64, // 'dmnd'
319 cmsSigDeviceModelDescTag
= 0x646D6464, // 'dmdd'
320 cmsSigDeviceSettingsTag
= 0x64657673, // 'devs'
321 cmsSigDToB0Tag
= 0x44324230, // 'D2B0'
322 cmsSigDToB1Tag
= 0x44324231, // 'D2B1'
323 cmsSigDToB2Tag
= 0x44324232, // 'D2B2'
324 cmsSigDToB3Tag
= 0x44324233, // 'D2B3'
325 cmsSigBToD0Tag
= 0x42324430, // 'B2D0'
326 cmsSigBToD1Tag
= 0x42324431, // 'B2D1'
327 cmsSigBToD2Tag
= 0x42324432, // 'B2D2'
328 cmsSigBToD3Tag
= 0x42324433, // 'B2D3'
329 cmsSigGamutTag
= 0x67616D74, // 'gamt'
330 cmsSigGrayTRCTag
= 0x6b545243, // 'kTRC'
331 cmsSigGreenColorantTag
= 0x6758595A, // 'gXYZ'
332 cmsSigGreenMatrixColumnTag
= 0x6758595A, // 'gXYZ'
333 cmsSigGreenTRCTag
= 0x67545243, // 'gTRC'
334 cmsSigLuminanceTag
= 0x6C756d69, // 'lumi'
335 cmsSigMeasurementTag
= 0x6D656173, // 'meas'
336 cmsSigMediaBlackPointTag
= 0x626B7074, // 'bkpt'
337 cmsSigMediaWhitePointTag
= 0x77747074, // 'wtpt'
338 cmsSigNamedColorTag
= 0x6E636f6C, // 'ncol' // Deprecated by the ICC
339 cmsSigNamedColor2Tag
= 0x6E636C32, // 'ncl2'
340 cmsSigOutputResponseTag
= 0x72657370, // 'resp'
341 cmsSigPerceptualRenderingIntentGamutTag
= 0x72696730, // 'rig0'
342 cmsSigPreview0Tag
= 0x70726530, // 'pre0'
343 cmsSigPreview1Tag
= 0x70726531, // 'pre1'
344 cmsSigPreview2Tag
= 0x70726532, // 'pre2'
345 cmsSigProfileDescriptionTag
= 0x64657363, // 'desc'
346 cmsSigProfileDescriptionMLTag
= 0x6473636d, // 'dscm'
347 cmsSigProfileSequenceDescTag
= 0x70736571, // 'pseq'
348 cmsSigProfileSequenceIdTag
= 0x70736964, // 'psid'
349 cmsSigPs2CRD0Tag
= 0x70736430, // 'psd0'
350 cmsSigPs2CRD1Tag
= 0x70736431, // 'psd1'
351 cmsSigPs2CRD2Tag
= 0x70736432, // 'psd2'
352 cmsSigPs2CRD3Tag
= 0x70736433, // 'psd3'
353 cmsSigPs2CSATag
= 0x70733273, // 'ps2s'
354 cmsSigPs2RenderingIntentTag
= 0x70733269, // 'ps2i'
355 cmsSigRedColorantTag
= 0x7258595A, // 'rXYZ'
356 cmsSigRedMatrixColumnTag
= 0x7258595A, // 'rXYZ'
357 cmsSigRedTRCTag
= 0x72545243, // 'rTRC'
358 cmsSigSaturationRenderingIntentGamutTag
= 0x72696732, // 'rig2'
359 cmsSigScreeningDescTag
= 0x73637264, // 'scrd'
360 cmsSigScreeningTag
= 0x7363726E, // 'scrn'
361 cmsSigTechnologyTag
= 0x74656368, // 'tech'
362 cmsSigUcrBgTag
= 0x62666420, // 'bfd '
363 cmsSigViewingCondDescTag
= 0x76756564, // 'vued'
364 cmsSigViewingConditionsTag
= 0x76696577, // 'view'
365 cmsSigVcgtTag
= 0x76636774, // 'vcgt'
366 cmsSigMetaTag
= 0x6D657461 // 'meta'
371 // ICC Technology tag
373 cmsSigDigitalCamera
= 0x6463616D, // 'dcam'
374 cmsSigFilmScanner
= 0x6673636E, // 'fscn'
375 cmsSigReflectiveScanner
= 0x7273636E, // 'rscn'
376 cmsSigInkJetPrinter
= 0x696A6574, // 'ijet'
377 cmsSigThermalWaxPrinter
= 0x74776178, // 'twax'
378 cmsSigElectrophotographicPrinter
= 0x6570686F, // 'epho'
379 cmsSigElectrostaticPrinter
= 0x65737461, // 'esta'
380 cmsSigDyeSublimationPrinter
= 0x64737562, // 'dsub'
381 cmsSigPhotographicPaperPrinter
= 0x7270686F, // 'rpho'
382 cmsSigFilmWriter
= 0x6670726E, // 'fprn'
383 cmsSigVideoMonitor
= 0x7669646D, // 'vidm'
384 cmsSigVideoCamera
= 0x76696463, // 'vidc'
385 cmsSigProjectionTelevision
= 0x706A7476, // 'pjtv'
386 cmsSigCRTDisplay
= 0x43525420, // 'CRT '
387 cmsSigPMDisplay
= 0x504D4420, // 'PMD '
388 cmsSigAMDisplay
= 0x414D4420, // 'AMD '
389 cmsSigPhotoCD
= 0x4B504344, // 'KPCD'
390 cmsSigPhotoImageSetter
= 0x696D6773, // 'imgs'
391 cmsSigGravure
= 0x67726176, // 'grav'
392 cmsSigOffsetLithography
= 0x6F666673, // 'offs'
393 cmsSigSilkscreen
= 0x73696C6B, // 'silk'
394 cmsSigFlexography
= 0x666C6578, // 'flex'
395 cmsSigMotionPictureFilmScanner
= 0x6D706673, // 'mpfs'
396 cmsSigMotionPictureFilmRecorder
= 0x6D706672, // 'mpfr'
397 cmsSigDigitalMotionPictureCamera
= 0x646D7063, // 'dmpc'
398 cmsSigDigitalCinemaProjector
= 0x64636A70 // 'dcpj'
400 } cmsTechnologySignature
;
405 cmsSigXYZData
= 0x58595A20, // 'XYZ '
406 cmsSigLabData
= 0x4C616220, // 'Lab '
407 cmsSigLuvData
= 0x4C757620, // 'Luv '
408 cmsSigYCbCrData
= 0x59436272, // 'YCbr'
409 cmsSigYxyData
= 0x59787920, // 'Yxy '
410 cmsSigRgbData
= 0x52474220, // 'RGB '
411 cmsSigGrayData
= 0x47524159, // 'GRAY'
412 cmsSigHsvData
= 0x48535620, // 'HSV '
413 cmsSigHlsData
= 0x484C5320, // 'HLS '
414 cmsSigCmykData
= 0x434D594B, // 'CMYK'
415 cmsSigCmyData
= 0x434D5920, // 'CMY '
416 cmsSigMCH1Data
= 0x4D434831, // 'MCH1'
417 cmsSigMCH2Data
= 0x4D434832, // 'MCH2'
418 cmsSigMCH3Data
= 0x4D434833, // 'MCH3'
419 cmsSigMCH4Data
= 0x4D434834, // 'MCH4'
420 cmsSigMCH5Data
= 0x4D434835, // 'MCH5'
421 cmsSigMCH6Data
= 0x4D434836, // 'MCH6'
422 cmsSigMCH7Data
= 0x4D434837, // 'MCH7'
423 cmsSigMCH8Data
= 0x4D434838, // 'MCH8'
424 cmsSigMCH9Data
= 0x4D434839, // 'MCH9'
425 cmsSigMCHAData
= 0x4D434841, // 'MCHA'
426 cmsSigMCHBData
= 0x4D434842, // 'MCHB'
427 cmsSigMCHCData
= 0x4D434843, // 'MCHC'
428 cmsSigMCHDData
= 0x4D434844, // 'MCHD'
429 cmsSigMCHEData
= 0x4D434845, // 'MCHE'
430 cmsSigMCHFData
= 0x4D434846, // 'MCHF'
431 cmsSigNamedData
= 0x6e6d636c, // 'nmcl'
432 cmsSig1colorData
= 0x31434C52, // '1CLR'
433 cmsSig2colorData
= 0x32434C52, // '2CLR'
434 cmsSig3colorData
= 0x33434C52, // '3CLR'
435 cmsSig4colorData
= 0x34434C52, // '4CLR'
436 cmsSig5colorData
= 0x35434C52, // '5CLR'
437 cmsSig6colorData
= 0x36434C52, // '6CLR'
438 cmsSig7colorData
= 0x37434C52, // '7CLR'
439 cmsSig8colorData
= 0x38434C52, // '8CLR'
440 cmsSig9colorData
= 0x39434C52, // '9CLR'
441 cmsSig10colorData
= 0x41434C52, // 'ACLR'
442 cmsSig11colorData
= 0x42434C52, // 'BCLR'
443 cmsSig12colorData
= 0x43434C52, // 'CCLR'
444 cmsSig13colorData
= 0x44434C52, // 'DCLR'
445 cmsSig14colorData
= 0x45434C52, // 'ECLR'
446 cmsSig15colorData
= 0x46434C52, // 'FCLR'
447 cmsSigLuvKData
= 0x4C75764B // 'LuvK'
449 } cmsColorSpaceSignature
;
453 cmsSigInputClass
= 0x73636E72, // 'scnr'
454 cmsSigDisplayClass
= 0x6D6E7472, // 'mntr'
455 cmsSigOutputClass
= 0x70727472, // 'prtr'
456 cmsSigLinkClass
= 0x6C696E6B, // 'link'
457 cmsSigAbstractClass
= 0x61627374, // 'abst'
458 cmsSigColorSpaceClass
= 0x73706163, // 'spac'
459 cmsSigNamedColorClass
= 0x6e6d636c // 'nmcl'
461 } cmsProfileClassSignature
;
465 cmsSigMacintosh
= 0x4150504C, // 'APPL'
466 cmsSigMicrosoft
= 0x4D534654, // 'MSFT'
467 cmsSigSolaris
= 0x53554E57, // 'SUNW'
468 cmsSigSGI
= 0x53474920, // 'SGI '
469 cmsSigTaligent
= 0x54474E54, // 'TGNT'
470 cmsSigUnices
= 0x2A6E6978 // '*nix' // From argyll -- Not official
472 } cmsPlatformSignature
;
475 #define cmsSigPerceptualReferenceMediumGamut 0x70726d67 //'prmg'
477 // For cmsSigColorimetricIntentImageStateTag
478 #define cmsSigSceneColorimetryEstimates 0x73636F65 //'scoe'
479 #define cmsSigSceneAppearanceEstimates 0x73617065 //'sape'
480 #define cmsSigFocalPlaneColorimetryEstimates 0x66706365 //'fpce'
481 #define cmsSigReflectionHardcopyOriginalColorimetry 0x72686F63 //'rhoc'
482 #define cmsSigReflectionPrintOutputColorimetry 0x72706F63 //'rpoc'
484 // Multi process elements types
486 cmsSigCurveSetElemType
= 0x63767374, //'cvst'
487 cmsSigMatrixElemType
= 0x6D617466, //'matf'
488 cmsSigCLutElemType
= 0x636C7574, //'clut'
490 cmsSigBAcsElemType
= 0x62414353, // 'bACS'
491 cmsSigEAcsElemType
= 0x65414353, // 'eACS'
493 // Custom from here, not in the ICC Spec
494 cmsSigXYZ2LabElemType
= 0x6C327820, // 'l2x '
495 cmsSigLab2XYZElemType
= 0x78326C20, // 'x2l '
496 cmsSigNamedColorElemType
= 0x6E636C20, // 'ncl '
497 cmsSigLabV2toV4
= 0x32203420, // '2 4 '
498 cmsSigLabV4toV2
= 0x34203220, // '4 2 '
501 cmsSigIdentityElemType
= 0x69646E20, // 'idn '
504 cmsSigLab2FloatPCS
= 0x64326C20, // 'd2l '
505 cmsSigFloatPCS2Lab
= 0x6C326420, // 'l2d '
506 cmsSigXYZ2FloatPCS
= 0x64327820, // 'd2x '
507 cmsSigFloatPCS2XYZ
= 0x78326420 // 'x2d '
511 // Types of CurveElements
514 cmsSigFormulaCurveSeg
= 0x70617266, // 'parf'
515 cmsSigSampledCurveSeg
= 0x73616D66, // 'samf'
516 cmsSigSegmentedCurve
= 0x63757266 // 'curf'
518 } cmsCurveSegSignature
;
520 // Used in ResponseCurveType
521 #define cmsSigStatusA 0x53746141 //'StaA'
522 #define cmsSigStatusE 0x53746145 //'StaE'
523 #define cmsSigStatusI 0x53746149 //'StaI'
524 #define cmsSigStatusT 0x53746154 //'StaT'
525 #define cmsSigStatusM 0x5374614D //'StaM'
526 #define cmsSigDN 0x444E2020 //'DN '
527 #define cmsSigDNP 0x444E2050 //'DN P'
528 #define cmsSigDNN 0x444E4E20 //'DNN '
529 #define cmsSigDNNP 0x444E4E50 //'DNNP'
531 // Device attributes, currently defined values correspond to the low 4 bytes
532 // of the 8 byte attribute quantity
533 #define cmsReflective 0
534 #define cmsTransparency 1
538 // Common structures in ICC tags
541 cmsUInt32Number flag
;
542 cmsUInt8Number data
[1];
548 cmsUInt16Number year
;
549 cmsUInt16Number month
;
551 cmsUInt16Number hours
;
552 cmsUInt16Number minutes
;
553 cmsUInt16Number seconds
;
559 cmsS15Fixed16Number X
;
560 cmsS15Fixed16Number Y
;
561 cmsS15Fixed16Number Z
;
563 } cmsEncodedXYZNumber
;
566 // Profile ID as computed by MD5 algorithm
568 cmsUInt8Number ID8
[16];
569 cmsUInt16Number ID16
[8];
570 cmsUInt32Number ID32
[4];
575 // ----------------------------------------------------------------------------------------------
576 // ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe
577 // somebody want to use this info for accessing profile header directly, so here it is.
579 // Profile header -- it is 32-bit aligned, so no issues are expected on alignment
581 cmsUInt32Number size
; // Profile size in bytes
582 cmsSignature cmmId
; // CMM for this profile
583 cmsUInt32Number version
; // Format version number
584 cmsProfileClassSignature deviceClass
; // Type of profile
585 cmsColorSpaceSignature colorSpace
; // Color space of data
586 cmsColorSpaceSignature pcs
; // PCS, XYZ or Lab only
587 cmsDateTimeNumber date
; // Date profile was created
588 cmsSignature magic
; // Magic Number to identify an ICC profile
589 cmsPlatformSignature platform
; // Primary Platform
590 cmsUInt32Number flags
; // Various bit settings
591 cmsSignature manufacturer
; // Device manufacturer
592 cmsUInt32Number model
; // Device model number
593 cmsUInt64Number attributes
; // Device attributes
594 cmsUInt32Number renderingIntent
;// Rendering intent
595 cmsEncodedXYZNumber illuminant
; // Profile illuminant
596 cmsSignature creator
; // Profile creator
597 cmsProfileID profileID
; // Profile ID using MD5
598 cmsInt8Number reserved
[28]; // Reserved for future use
604 cmsTagTypeSignature sig
;
605 cmsInt8Number reserved
[4];
609 // A tag entry in directory
611 cmsTagSignature sig
; // The tag signature
612 cmsUInt32Number offset
; // Start of tag
613 cmsUInt32Number size
; // Size in bytes
617 // ----------------------------------------------------------------------------------------------
619 // Little CMS specific typedefs
621 typedef void* cmsContext
; // Context identifier for multithreaded environments
622 typedef void* cmsHANDLE
; // Generic handle
623 typedef void* cmsHPROFILE
; // Opaque typedefs to hide internals
624 typedef void* cmsHTRANSFORM
;
626 #define cmsMAXCHANNELS 16 // Maximum number of channels in ICC profiles
628 // Format of pixel is defined by one cmsUInt32Number, using bit fields as follows
631 // 3 2 10987 6 5 4 3 2 1 098 7654 321
632 // A O TTTTT U Y F P X S EEE CCCC BBB
634 // A: Floating point -- With this flag we can differentiate 16 bits as float and as int
635 // O: Optimized -- previous optimization already returns the final 8-bit value
637 // F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
638 // P: Planar? 0=Chunky, 1=Planar
639 // X: swap 16 bps endianess?
640 // S: Do swap? ie, BGR, KYMC
642 // C: Channels (Samples per pixel)
643 // B: bytes per sample
644 // Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
646 #define FLOAT_SH(a) ((a) << 22)
647 #define OPTIMIZED_SH(s) ((s) << 21)
648 #define COLORSPACE_SH(s) ((s) << 16)
649 #define SWAPFIRST_SH(s) ((s) << 14)
650 #define FLAVOR_SH(s) ((s) << 13)
651 #define PLANAR_SH(p) ((p) << 12)
652 #define ENDIAN16_SH(e) ((e) << 11)
653 #define DOSWAP_SH(e) ((e) << 10)
654 #define EXTRA_SH(e) ((e) << 7)
655 #define CHANNELS_SH(c) ((c) << 3)
656 #define BYTES_SH(b) (b)
658 // These macros unpack format specifiers into integers
659 #define T_FLOAT(a) (((a)>>22)&1)
660 #define T_OPTIMIZED(o) (((o)>>21)&1)
661 #define T_COLORSPACE(s) (((s)>>16)&31)
662 #define T_SWAPFIRST(s) (((s)>>14)&1)
663 #define T_FLAVOR(s) (((s)>>13)&1)
664 #define T_PLANAR(p) (((p)>>12)&1)
665 #define T_ENDIAN16(e) (((e)>>11)&1)
666 #define T_DOSWAP(e) (((e)>>10)&1)
667 #define T_EXTRA(e) (((e)>>7)&7)
668 #define T_CHANNELS(c) (((c)>>3)&15)
669 #define T_BYTES(b) ((b)&7)
673 #define PT_ANY 0 // Don't check colorspace
674 // 1 & 2 are reserved
680 #define PT_YUV 8 // Lu'v'
683 #define PT_YUVK 11 // Lu'v'K
704 #define PT_LabV2 30 // Identical to PT_Lab, but using the V2 old encoding
706 // Some (not all!) representations
708 #ifndef TYPE_RGB_8 // TYPE_RGB_8 is a very common identifier, so don't include ours
709 // if user has it already defined.
711 #define TYPE_GRAY_8 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
712 #define TYPE_GRAY_8_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
713 #define TYPE_GRAY_16 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
714 #define TYPE_GRAY_16_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
715 #define TYPE_GRAY_16_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
716 #define TYPE_GRAYA_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
717 #define TYPE_GRAYA_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
718 #define TYPE_GRAYA_16_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
719 #define TYPE_GRAYA_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
720 #define TYPE_GRAYA_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
722 #define TYPE_RGB_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
723 #define TYPE_RGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
724 #define TYPE_BGR_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
725 #define TYPE_BGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
726 #define TYPE_RGB_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
727 #define TYPE_RGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
728 #define TYPE_RGB_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
729 #define TYPE_BGR_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
730 #define TYPE_BGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
731 #define TYPE_BGR_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
733 #define TYPE_RGBA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
734 #define TYPE_RGBA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
735 #define TYPE_RGBA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
736 #define TYPE_RGBA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
737 #define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
739 #define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
740 #define TYPE_ARGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))
741 #define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
743 #define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
744 #define TYPE_ABGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
745 #define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
746 #define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
747 #define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
749 #define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
750 #define TYPE_BGRA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))
751 #define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
752 #define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
754 #define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
755 #define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
756 #define TYPE_CMY_16 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
757 #define TYPE_CMY_16_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
758 #define TYPE_CMY_16_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
760 #define TYPE_CMYK_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
761 #define TYPE_CMYKA_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))
762 #define TYPE_CMYK_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
763 #define TYPE_YUVK_8 TYPE_CMYK_8_REV
764 #define TYPE_CMYK_8_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
765 #define TYPE_CMYK_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
766 #define TYPE_CMYK_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
767 #define TYPE_YUVK_16 TYPE_CMYK_16_REV
768 #define TYPE_CMYK_16_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
769 #define TYPE_CMYK_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
771 #define TYPE_KYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
772 #define TYPE_KYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
773 #define TYPE_KYMC_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
775 #define TYPE_KCMY_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
776 #define TYPE_KCMY_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
777 #define TYPE_KCMY_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
778 #define TYPE_KCMY_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
779 #define TYPE_KCMY_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
781 #define TYPE_CMYK5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1))
782 #define TYPE_CMYK5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2))
783 #define TYPE_CMYK5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
784 #define TYPE_KYMC5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
785 #define TYPE_KYMC5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
786 #define TYPE_KYMC5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
787 #define TYPE_CMYK6_8 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1))
788 #define TYPE_CMYK6_8_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
789 #define TYPE_CMYK6_16 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2))
790 #define TYPE_CMYK6_16_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
791 #define TYPE_CMYK6_16_SE (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
792 #define TYPE_CMYK7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1))
793 #define TYPE_CMYK7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2))
794 #define TYPE_CMYK7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
795 #define TYPE_KYMC7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
796 #define TYPE_KYMC7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
797 #define TYPE_KYMC7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
798 #define TYPE_CMYK8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1))
799 #define TYPE_CMYK8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2))
800 #define TYPE_CMYK8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
801 #define TYPE_KYMC8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
802 #define TYPE_KYMC8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
803 #define TYPE_KYMC8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
804 #define TYPE_CMYK9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1))
805 #define TYPE_CMYK9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2))
806 #define TYPE_CMYK9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
807 #define TYPE_KYMC9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
808 #define TYPE_KYMC9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
809 #define TYPE_KYMC9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
810 #define TYPE_CMYK10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1))
811 #define TYPE_CMYK10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2))
812 #define TYPE_CMYK10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
813 #define TYPE_KYMC10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
814 #define TYPE_KYMC10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
815 #define TYPE_KYMC10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
816 #define TYPE_CMYK11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1))
817 #define TYPE_CMYK11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2))
818 #define TYPE_CMYK11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
819 #define TYPE_KYMC11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
820 #define TYPE_KYMC11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
821 #define TYPE_KYMC11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
822 #define TYPE_CMYK12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1))
823 #define TYPE_CMYK12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2))
824 #define TYPE_CMYK12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
825 #define TYPE_KYMC12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
826 #define TYPE_KYMC12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
827 #define TYPE_KYMC12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
830 #define TYPE_XYZ_16 (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
831 #define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
832 #define TYPE_LabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1))
834 #define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
835 #define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
836 #define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
837 #define TYPE_LabV2_16 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2))
838 #define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
841 #define TYPE_YCbCr_8 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
842 #define TYPE_YCbCr_8_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
843 #define TYPE_YCbCr_16 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
844 #define TYPE_YCbCr_16_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
845 #define TYPE_YCbCr_16_SE (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
848 #define TYPE_YUV_8 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
849 #define TYPE_YUV_8_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
850 #define TYPE_YUV_16 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
851 #define TYPE_YUV_16_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
852 #define TYPE_YUV_16_SE (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
855 #define TYPE_HLS_8 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
856 #define TYPE_HLS_8_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
857 #define TYPE_HLS_16 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
858 #define TYPE_HLS_16_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
859 #define TYPE_HLS_16_SE (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
862 #define TYPE_HSV_8 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
863 #define TYPE_HSV_8_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
864 #define TYPE_HSV_16 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
865 #define TYPE_HSV_16_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
866 #define TYPE_HSV_16_SE (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
868 // Named color index. Only 16 bits allowed (don't check colorspace)
869 #define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2))
872 #define TYPE_XYZ_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4))
873 #define TYPE_Lab_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4))
874 #define TYPE_LabA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
875 #define TYPE_GRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4))
876 #define TYPE_RGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4))
878 #define TYPE_RGBA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
879 #define TYPE_ARGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1))
880 #define TYPE_BGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
881 #define TYPE_BGRA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
882 #define TYPE_ABGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
884 #define TYPE_CMYK_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4))
886 // Floating point formatters.
887 // NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield
888 #define TYPE_XYZ_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
889 #define TYPE_Lab_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
890 #define TYPE_GRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
891 #define TYPE_RGB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
892 #define TYPE_BGR_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1))
893 #define TYPE_CMYK_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
895 // IEEE 754-2008 "half"
896 #define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
897 #define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
898 #define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
899 #define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
901 #define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
902 #define TYPE_ARGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
903 #define TYPE_BGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
904 #define TYPE_BGRA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
905 #define TYPE_ABGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
959 // Illuminant types for structs below
960 #define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000
961 #define cmsILLUMINANT_TYPE_D50 0x0000001
962 #define cmsILLUMINANT_TYPE_D65 0x0000002
963 #define cmsILLUMINANT_TYPE_D93 0x0000003
964 #define cmsILLUMINANT_TYPE_F2 0x0000004
965 #define cmsILLUMINANT_TYPE_D55 0x0000005
966 #define cmsILLUMINANT_TYPE_A 0x0000006
967 #define cmsILLUMINANT_TYPE_E 0x0000007
968 #define cmsILLUMINANT_TYPE_F8 0x0000008
971 cmsUInt32Number Observer
; // 0 = unknown, 1=CIE 1931, 2=CIE 1964
972 cmsCIEXYZ Backing
; // Value of backing
973 cmsUInt32Number Geometry
; // 0=unknown, 1=45/0, 0/45 2=0d, d/0
974 cmsFloat64Number Flare
; // 0..1.0
975 cmsUInt32Number IlluminantType
;
977 } cmsICCMeasurementConditions
;
980 cmsCIEXYZ IlluminantXYZ
; // Not the same struct as CAM02,
981 cmsCIEXYZ SurroundXYZ
; // This is for storing the tag
982 cmsUInt32Number IlluminantType
; // viewing condition
984 } cmsICCViewingConditions
;
986 // Support of non-standard functions --------------------------------------------------------------------------------------
988 CMSAPI
int CMSEXPORT
cmsstrcasecmp(const char* s1
, const char* s2
);
989 CMSAPI
long int CMSEXPORT
cmsfilelength(FILE* f
);
991 // Plug-In registering ---------------------------------------------------------------------------------------------------
993 CMSAPI cmsBool CMSEXPORT
cmsPlugin(void* Plugin
);
994 CMSAPI cmsBool CMSEXPORT
cmsPluginTHR(cmsContext ContextID
, void* Plugin
);
995 CMSAPI
void CMSEXPORT
cmsUnregisterPlugins(void);
997 // Error logging ----------------------------------------------------------------------------------------------------------
999 // There is no error handling at all. When a function fails, it returns proper value.
1000 // For example, all create functions does return NULL on failure. Other may return FALSE.
1001 // It may be interesting, for the developer, to know why the function is failing.
1002 // for that reason, lcms2 does offer a logging function. This function will get
1003 // an ENGLISH string with some clues on what is going wrong. You can show this
1004 // info to the end user if you wish, or just create some sort of log on disk.
1005 // The logging function should NOT terminate the program, as this obviously can leave
1006 // unfreed resources. It is the programmer's responsibility to check each function
1007 // return code to make sure it didn't fail.
1009 #define cmsERROR_UNDEFINED 0
1010 #define cmsERROR_FILE 1
1011 #define cmsERROR_RANGE 2
1012 #define cmsERROR_INTERNAL 3
1013 #define cmsERROR_NULL 4
1014 #define cmsERROR_READ 5
1015 #define cmsERROR_SEEK 6
1016 #define cmsERROR_WRITE 7
1017 #define cmsERROR_UNKNOWN_EXTENSION 8
1018 #define cmsERROR_COLORSPACE_CHECK 9
1019 #define cmsERROR_ALREADY_DEFINED 10
1020 #define cmsERROR_BAD_SIGNATURE 11
1021 #define cmsERROR_CORRUPTION_DETECTED 12
1022 #define cmsERROR_NOT_SUITABLE 13
1024 // Error logger is called with the ContextID when a message is raised. This gives the
1025 // chance to know which thread is responsible of the warning and any environment associated
1026 // with it. Non-multithreading applications may safely ignore this parameter.
1027 // Note that under certain special circumstances, ContextID may be NULL.
1028 typedef void (* cmsLogErrorHandlerFunction
)(cmsContext ContextID
, cmsUInt32Number ErrorCode
, const char *Text
);
1030 // Allows user to set any specific logger
1031 CMSAPI
void CMSEXPORT
cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn
);
1033 // Conversions --------------------------------------------------------------------------------------------------------------
1035 // Returns pointers to constant structs
1036 CMSAPI
const cmsCIEXYZ
* CMSEXPORT
cmsD50_XYZ(void);
1037 CMSAPI
const cmsCIExyY
* CMSEXPORT
cmsD50_xyY(void);
1039 // Colorimetric space conversions
1040 CMSAPI
void CMSEXPORT
cmsXYZ2xyY(cmsCIExyY
* Dest
, const cmsCIEXYZ
* Source
);
1041 CMSAPI
void CMSEXPORT
cmsxyY2XYZ(cmsCIEXYZ
* Dest
, const cmsCIExyY
* Source
);
1042 CMSAPI
void CMSEXPORT
cmsXYZ2Lab(const cmsCIEXYZ
* WhitePoint
, cmsCIELab
* Lab
, const cmsCIEXYZ
* xyz
);
1043 CMSAPI
void CMSEXPORT
cmsLab2XYZ(const cmsCIEXYZ
* WhitePoint
, cmsCIEXYZ
* xyz
, const cmsCIELab
* Lab
);
1044 CMSAPI
void CMSEXPORT
cmsLab2LCh(cmsCIELCh
*LCh
, const cmsCIELab
* Lab
);
1045 CMSAPI
void CMSEXPORT
cmsLCh2Lab(cmsCIELab
* Lab
, const cmsCIELCh
* LCh
);
1047 // Encoding /Decoding on PCS
1048 CMSAPI
void CMSEXPORT
cmsLabEncoded2Float(cmsCIELab
* Lab
, const cmsUInt16Number wLab
[3]);
1049 CMSAPI
void CMSEXPORT
cmsLabEncoded2FloatV2(cmsCIELab
* Lab
, const cmsUInt16Number wLab
[3]);
1050 CMSAPI
void CMSEXPORT
cmsFloat2LabEncoded(cmsUInt16Number wLab
[3], const cmsCIELab
* Lab
);
1051 CMSAPI
void CMSEXPORT
cmsFloat2LabEncodedV2(cmsUInt16Number wLab
[3], const cmsCIELab
* Lab
);
1052 CMSAPI
void CMSEXPORT
cmsXYZEncoded2Float(cmsCIEXYZ
* fxyz
, const cmsUInt16Number XYZ
[3]);
1053 CMSAPI
void CMSEXPORT
cmsFloat2XYZEncoded(cmsUInt16Number XYZ
[3], const cmsCIEXYZ
* fXYZ
);
1056 CMSAPI cmsFloat64Number CMSEXPORT
cmsDeltaE(const cmsCIELab
* Lab1
, const cmsCIELab
* Lab2
);
1057 CMSAPI cmsFloat64Number CMSEXPORT
cmsCIE94DeltaE(const cmsCIELab
* Lab1
, const cmsCIELab
* Lab2
);
1058 CMSAPI cmsFloat64Number CMSEXPORT
cmsBFDdeltaE(const cmsCIELab
* Lab1
, const cmsCIELab
* Lab2
);
1059 CMSAPI cmsFloat64Number CMSEXPORT
cmsCMCdeltaE(const cmsCIELab
* Lab1
, const cmsCIELab
* Lab2
, cmsFloat64Number l
, cmsFloat64Number c
);
1060 CMSAPI cmsFloat64Number CMSEXPORT
cmsCIE2000DeltaE(const cmsCIELab
* Lab1
, const cmsCIELab
* Lab2
, cmsFloat64Number Kl
, cmsFloat64Number Kc
, cmsFloat64Number Kh
);
1062 // Temperature <-> Chromaticity (Black body)
1063 CMSAPI cmsBool CMSEXPORT
cmsWhitePointFromTemp(cmsCIExyY
* WhitePoint
, cmsFloat64Number TempK
);
1064 CMSAPI cmsBool CMSEXPORT
cmsTempFromWhitePoint(cmsFloat64Number
* TempK
, const cmsCIExyY
* WhitePoint
);
1066 // Chromatic adaptation
1067 CMSAPI cmsBool CMSEXPORT
cmsAdaptToIlluminant(cmsCIEXYZ
* Result
, const cmsCIEXYZ
* SourceWhitePt
,
1068 const cmsCIEXYZ
* Illuminant
,
1069 const cmsCIEXYZ
* Value
);
1071 // CIECAM02 ---------------------------------------------------------------------------------------------------
1073 // Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing
1074 // conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag
1075 // cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions.
1078 #define AVG_SURROUND 1
1079 #define DIM_SURROUND 2
1080 #define DARK_SURROUND 3
1081 #define CUTSHEET_SURROUND 4
1083 #define D_CALCULATE (-1)
1086 cmsCIEXYZ whitePoint
;
1087 cmsFloat64Number Yb
;
1088 cmsFloat64Number La
;
1090 cmsFloat64Number D_value
;
1092 } cmsViewingConditions
;
1094 CMSAPI cmsHANDLE CMSEXPORT
cmsCIECAM02Init(cmsContext ContextID
, const cmsViewingConditions
* pVC
);
1095 CMSAPI
void CMSEXPORT
cmsCIECAM02Done(cmsHANDLE hModel
);
1096 CMSAPI
void CMSEXPORT
cmsCIECAM02Forward(cmsHANDLE hModel
, const cmsCIEXYZ
* pIn
, cmsJCh
* pOut
);
1097 CMSAPI
void CMSEXPORT
cmsCIECAM02Reverse(cmsHANDLE hModel
, const cmsJCh
* pIn
, cmsCIEXYZ
* pOut
);
1100 // Tone curves -----------------------------------------------------------------------------------------
1102 // This describes a curve segment. For a table of supported types, see the manual. User can increase the number of
1103 // available types by using a proper plug-in. Parametric segments allow 10 parameters at most
1106 cmsFloat32Number x0
, x1
; // Domain; for x0 < x <= x1
1107 cmsInt32Number Type
; // Parametric type, Type == 0 means sampled segment. Negative values are reserved
1108 cmsFloat64Number Params
[10]; // Parameters if Type != 0
1109 cmsUInt32Number nGridPoints
; // Number of grid points if Type == 0
1110 cmsFloat32Number
* SampledPoints
; // Points to an array of floats if Type == 0
1114 // The internal representation is none of your business.
1115 typedef struct _cms_curve_struct cmsToneCurve
;
1117 CMSAPI cmsToneCurve
* CMSEXPORT
cmsBuildSegmentedToneCurve(cmsContext ContextID
, cmsInt32Number nSegments
, const cmsCurveSegment Segments
[]);
1118 CMSAPI cmsToneCurve
* CMSEXPORT
cmsBuildParametricToneCurve(cmsContext ContextID
, cmsInt32Number Type
, const cmsFloat64Number Params
[]);
1119 CMSAPI cmsToneCurve
* CMSEXPORT
cmsBuildGamma(cmsContext ContextID
, cmsFloat64Number Gamma
);
1120 CMSAPI cmsToneCurve
* CMSEXPORT
cmsBuildTabulatedToneCurve16(cmsContext ContextID
, cmsInt32Number nEntries
, const cmsUInt16Number values
[]);
1121 CMSAPI cmsToneCurve
* CMSEXPORT
cmsBuildTabulatedToneCurveFloat(cmsContext ContextID
, cmsUInt32Number nEntries
, const cmsFloat32Number values
[]);
1122 CMSAPI
void CMSEXPORT
cmsFreeToneCurve(cmsToneCurve
* Curve
);
1123 CMSAPI
void CMSEXPORT
cmsFreeToneCurveTriple(cmsToneCurve
* Curve
[3]);
1124 CMSAPI cmsToneCurve
* CMSEXPORT
cmsDupToneCurve(const cmsToneCurve
* Src
);
1125 CMSAPI cmsToneCurve
* CMSEXPORT
cmsReverseToneCurve(const cmsToneCurve
* InGamma
);
1126 CMSAPI cmsToneCurve
* CMSEXPORT
cmsReverseToneCurveEx(cmsInt32Number nResultSamples
, const cmsToneCurve
* InGamma
);
1127 CMSAPI cmsToneCurve
* CMSEXPORT
cmsJoinToneCurve(cmsContext ContextID
, const cmsToneCurve
* X
, const cmsToneCurve
* Y
, cmsUInt32Number nPoints
);
1128 CMSAPI cmsBool CMSEXPORT
cmsSmoothToneCurve(cmsToneCurve
* Tab
, cmsFloat64Number lambda
);
1129 CMSAPI cmsFloat32Number CMSEXPORT
cmsEvalToneCurveFloat(const cmsToneCurve
* Curve
, cmsFloat32Number v
);
1130 CMSAPI cmsUInt16Number CMSEXPORT
cmsEvalToneCurve16(const cmsToneCurve
* Curve
, cmsUInt16Number v
);
1131 CMSAPI cmsBool CMSEXPORT
cmsIsToneCurveMultisegment(const cmsToneCurve
* InGamma
);
1132 CMSAPI cmsBool CMSEXPORT
cmsIsToneCurveLinear(const cmsToneCurve
* Curve
);
1133 CMSAPI cmsBool CMSEXPORT
cmsIsToneCurveMonotonic(const cmsToneCurve
* t
);
1134 CMSAPI cmsBool CMSEXPORT
cmsIsToneCurveDescending(const cmsToneCurve
* t
);
1135 CMSAPI cmsInt32Number CMSEXPORT
cmsGetToneCurveParametricType(const cmsToneCurve
* t
);
1136 CMSAPI cmsFloat64Number CMSEXPORT
cmsEstimateGamma(const cmsToneCurve
* t
, cmsFloat64Number Precision
);
1138 // Tone curve tabular estimation
1139 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve
* t
);
1140 CMSAPI
const cmsUInt16Number
* CMSEXPORT
cmsGetToneCurveEstimatedTable(const cmsToneCurve
* t
);
1143 // Implements pipelines of multi-processing elements -------------------------------------------------------------
1145 // Nothing to see here, move along
1146 typedef struct _cmsPipeline_struct cmsPipeline
;
1147 typedef struct _cmsStage_struct cmsStage
;
1149 // Those are hi-level pipelines
1150 CMSAPI cmsPipeline
* CMSEXPORT
cmsPipelineAlloc(cmsContext ContextID
, cmsUInt32Number InputChannels
, cmsUInt32Number OutputChannels
);
1151 CMSAPI
void CMSEXPORT
cmsPipelineFree(cmsPipeline
* lut
);
1152 CMSAPI cmsPipeline
* CMSEXPORT
cmsPipelineDup(const cmsPipeline
* Orig
);
1154 CMSAPI cmsContext CMSEXPORT
cmsGetPipelineContextID(const cmsPipeline
* lut
);
1155 CMSAPI cmsUInt32Number CMSEXPORT
cmsPipelineInputChannels(const cmsPipeline
* lut
);
1156 CMSAPI cmsUInt32Number CMSEXPORT
cmsPipelineOutputChannels(const cmsPipeline
* lut
);
1158 CMSAPI cmsUInt32Number CMSEXPORT
cmsPipelineStageCount(const cmsPipeline
* lut
);
1159 CMSAPI cmsStage
* CMSEXPORT
cmsPipelineGetPtrToFirstStage(const cmsPipeline
* lut
);
1160 CMSAPI cmsStage
* CMSEXPORT
cmsPipelineGetPtrToLastStage(const cmsPipeline
* lut
);
1162 CMSAPI
void CMSEXPORT
cmsPipelineEval16(const cmsUInt16Number In
[], cmsUInt16Number Out
[], const cmsPipeline
* lut
);
1163 CMSAPI
void CMSEXPORT
cmsPipelineEvalFloat(const cmsFloat32Number In
[], cmsFloat32Number Out
[], const cmsPipeline
* lut
);
1164 CMSAPI cmsBool CMSEXPORT
cmsPipelineEvalReverseFloat(cmsFloat32Number Target
[], cmsFloat32Number Result
[], cmsFloat32Number Hint
[], const cmsPipeline
* lut
);
1165 CMSAPI cmsBool CMSEXPORT
cmsPipelineCat(cmsPipeline
* l1
, const cmsPipeline
* l2
);
1166 CMSAPI cmsBool CMSEXPORT
cmsPipelineSetSaveAs8bitsFlag(cmsPipeline
* lut
, cmsBool On
);
1168 // Where to place/locate the stages in the pipeline chain
1169 typedef enum { cmsAT_BEGIN
, cmsAT_END
} cmsStageLoc
;
1171 CMSAPI
int CMSEXPORT
cmsPipelineInsertStage(cmsPipeline
* lut
, cmsStageLoc loc
, cmsStage
* mpe
);
1172 CMSAPI
void CMSEXPORT
cmsPipelineUnlinkStage(cmsPipeline
* lut
, cmsStageLoc loc
, cmsStage
** mpe
);
1174 // This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements
1175 // that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and
1176 // then a list of expected types followed with a list of double pointers to Stage elements. If
1177 // the function founds a match with current pipeline, it fills the pointers and returns TRUE
1178 // if not, returns FALSE without touching anything.
1179 CMSAPI cmsBool CMSEXPORT
cmsPipelineCheckAndRetreiveStages(const cmsPipeline
* Lut
, cmsUInt32Number n
, ...);
1181 // Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode
1182 // matrices with far more precision that CLUTS
1183 CMSAPI cmsStage
* CMSEXPORT
cmsStageAllocIdentity(cmsContext ContextID
, cmsUInt32Number nChannels
);
1184 CMSAPI cmsStage
* CMSEXPORT
cmsStageAllocToneCurves(cmsContext ContextID
, cmsUInt32Number nChannels
, cmsToneCurve
* const Curves
[]);
1185 CMSAPI cmsStage
* CMSEXPORT
cmsStageAllocMatrix(cmsContext ContextID
, cmsUInt32Number Rows
, cmsUInt32Number Cols
, const cmsFloat64Number
* Matrix
, const cmsFloat64Number
* Offset
);
1187 CMSAPI cmsStage
* CMSEXPORT
cmsStageAllocCLut16bit(cmsContext ContextID
, cmsUInt32Number nGridPoints
, cmsUInt32Number inputChan
, cmsUInt32Number outputChan
, const cmsUInt16Number
* Table
);
1188 CMSAPI cmsStage
* CMSEXPORT
cmsStageAllocCLutFloat(cmsContext ContextID
, cmsUInt32Number nGridPoints
, cmsUInt32Number inputChan
, cmsUInt32Number outputChan
, const cmsFloat32Number
* Table
);
1190 CMSAPI cmsStage
* CMSEXPORT
cmsStageAllocCLut16bitGranular(cmsContext ContextID
, const cmsUInt32Number clutPoints
[], cmsUInt32Number inputChan
, cmsUInt32Number outputChan
, const cmsUInt16Number
* Table
);
1191 CMSAPI cmsStage
* CMSEXPORT
cmsStageAllocCLutFloatGranular(cmsContext ContextID
, const cmsUInt32Number clutPoints
[], cmsUInt32Number inputChan
, cmsUInt32Number outputChan
, const cmsFloat32Number
* Table
);
1193 CMSAPI cmsStage
* CMSEXPORT
cmsStageDup(cmsStage
* mpe
);
1194 CMSAPI
void CMSEXPORT
cmsStageFree(cmsStage
* mpe
);
1195 CMSAPI cmsStage
* CMSEXPORT
cmsStageNext(const cmsStage
* mpe
);
1197 CMSAPI cmsUInt32Number CMSEXPORT
cmsStageInputChannels(const cmsStage
* mpe
);
1198 CMSAPI cmsUInt32Number CMSEXPORT
cmsStageOutputChannels(const cmsStage
* mpe
);
1199 CMSAPI cmsStageSignature CMSEXPORT
cmsStageType(const cmsStage
* mpe
);
1200 CMSAPI
void* CMSEXPORT
cmsStageData(const cmsStage
* mpe
);
1203 typedef cmsInt32Number (* cmsSAMPLER16
) (register const cmsUInt16Number In
[],
1204 register cmsUInt16Number Out
[],
1205 register void * Cargo
);
1207 typedef cmsInt32Number (* cmsSAMPLERFLOAT
)(register const cmsFloat32Number In
[],
1208 register cmsFloat32Number Out
[],
1209 register void * Cargo
);
1211 // Use this flag to prevent changes being written to destination
1212 #define SAMPLER_INSPECT 0x01000000
1215 CMSAPI cmsBool CMSEXPORT
cmsStageSampleCLut16bit(cmsStage
* mpe
, cmsSAMPLER16 Sampler
, void* Cargo
, cmsUInt32Number dwFlags
);
1216 CMSAPI cmsBool CMSEXPORT
cmsStageSampleCLutFloat(cmsStage
* mpe
, cmsSAMPLERFLOAT Sampler
, void* Cargo
, cmsUInt32Number dwFlags
);
1219 CMSAPI cmsBool CMSEXPORT
cmsSliceSpace16(cmsUInt32Number nInputs
, const cmsUInt32Number clutPoints
[],
1220 cmsSAMPLER16 Sampler
, void * Cargo
);
1222 CMSAPI cmsBool CMSEXPORT
cmsSliceSpaceFloat(cmsUInt32Number nInputs
, const cmsUInt32Number clutPoints
[],
1223 cmsSAMPLERFLOAT Sampler
, void * Cargo
);
1225 // Multilocalized Unicode management ---------------------------------------------------------------------------------------
1227 typedef struct _cms_MLU_struct cmsMLU
;
1229 #define cmsNoLanguage "\0\0"
1230 #define cmsNoCountry "\0\0"
1232 CMSAPI cmsMLU
* CMSEXPORT
cmsMLUalloc(cmsContext ContextID
, cmsUInt32Number nItems
);
1233 CMSAPI
void CMSEXPORT
cmsMLUfree(cmsMLU
* mlu
);
1234 CMSAPI cmsMLU
* CMSEXPORT
cmsMLUdup(const cmsMLU
* mlu
);
1236 CMSAPI cmsBool CMSEXPORT
cmsMLUsetASCII(cmsMLU
* mlu
,
1237 const char LanguageCode
[3], const char CountryCode
[3],
1238 const char* ASCIIString
);
1239 CMSAPI cmsBool CMSEXPORT
cmsMLUsetWide(cmsMLU
* mlu
,
1240 const char LanguageCode
[3], const char CountryCode
[3],
1241 const wchar_t* WideString
);
1243 CMSAPI cmsUInt32Number CMSEXPORT
cmsMLUgetASCII(const cmsMLU
* mlu
,
1244 const char LanguageCode
[3], const char CountryCode
[3],
1245 char* Buffer
, cmsUInt32Number BufferSize
);
1247 CMSAPI cmsUInt32Number CMSEXPORT
cmsMLUgetWide(const cmsMLU
* mlu
,
1248 const char LanguageCode
[3], const char CountryCode
[3],
1249 wchar_t* Buffer
, cmsUInt32Number BufferSize
);
1251 CMSAPI cmsBool CMSEXPORT
cmsMLUgetTranslation(const cmsMLU
* mlu
,
1252 const char LanguageCode
[3], const char CountryCode
[3],
1253 char ObtainedLanguage
[3], char ObtainedCountry
[3]);
1255 CMSAPI cmsUInt32Number CMSEXPORT
cmsMLUtranslationsCount(const cmsMLU
* mlu
);
1257 CMSAPI cmsBool CMSEXPORT
cmsMLUtranslationsCodes(const cmsMLU
* mlu
,
1258 cmsUInt32Number idx
,
1259 char LanguageCode
[3],
1260 char CountryCode
[3]);
1262 // Undercolorremoval & black generation -------------------------------------------------------------------------------------
1271 // Screening ----------------------------------------------------------------------------------------------------------------
1273 #define cmsPRINTER_DEFAULT_SCREENS 0x0001
1274 #define cmsFREQUENCE_UNITS_LINES_CM 0x0000
1275 #define cmsFREQUENCE_UNITS_LINES_INCH 0x0002
1277 #define cmsSPOT_UNKNOWN 0
1278 #define cmsSPOT_PRINTER_DEFAULT 1
1279 #define cmsSPOT_ROUND 2
1280 #define cmsSPOT_DIAMOND 3
1281 #define cmsSPOT_ELLIPSE 4
1282 #define cmsSPOT_LINE 5
1283 #define cmsSPOT_SQUARE 6
1284 #define cmsSPOT_CROSS 7
1287 cmsFloat64Number Frequency
;
1288 cmsFloat64Number ScreenAngle
;
1289 cmsUInt32Number SpotShape
;
1291 } cmsScreeningChannel
;
1294 cmsUInt32Number Flag
;
1295 cmsUInt32Number nChannels
;
1296 cmsScreeningChannel Channels
[cmsMAXCHANNELS
];
1301 // Named color -----------------------------------------------------------------------------------------------------------------
1303 typedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST
;
1305 CMSAPI cmsNAMEDCOLORLIST
* CMSEXPORT
cmsAllocNamedColorList(cmsContext ContextID
,
1307 cmsUInt32Number ColorantCount
,
1308 const char* Prefix
, const char* Suffix
);
1310 CMSAPI
void CMSEXPORT
cmsFreeNamedColorList(cmsNAMEDCOLORLIST
* v
);
1311 CMSAPI cmsNAMEDCOLORLIST
* CMSEXPORT
cmsDupNamedColorList(const cmsNAMEDCOLORLIST
* v
);
1312 CMSAPI cmsBool CMSEXPORT
cmsAppendNamedColor(cmsNAMEDCOLORLIST
* v
, const char* Name
,
1313 cmsUInt16Number PCS
[3],
1314 cmsUInt16Number Colorant
[cmsMAXCHANNELS
]);
1316 CMSAPI cmsUInt32Number CMSEXPORT
cmsNamedColorCount(const cmsNAMEDCOLORLIST
* v
);
1317 CMSAPI cmsInt32Number CMSEXPORT
cmsNamedColorIndex(const cmsNAMEDCOLORLIST
* v
, const char* Name
);
1319 CMSAPI cmsBool CMSEXPORT
cmsNamedColorInfo(const cmsNAMEDCOLORLIST
* NamedColorList
, cmsUInt32Number nColor
,
1323 cmsUInt16Number
* PCS
,
1324 cmsUInt16Number
* Colorant
);
1326 // Retrieve named color list from transform
1327 CMSAPI cmsNAMEDCOLORLIST
* CMSEXPORT
cmsGetNamedColorList(cmsHTRANSFORM xform
);
1329 // Profile sequence -----------------------------------------------------------------------------------------------------
1331 // Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others
1332 // come from Profile Sequence Identifier Tag
1335 cmsSignature deviceMfg
;
1336 cmsSignature deviceModel
;
1337 cmsUInt64Number attributes
;
1338 cmsTechnologySignature technology
;
1339 cmsProfileID ProfileID
;
1340 cmsMLU
* Manufacturer
;
1342 cmsMLU
* Description
;
1349 cmsContext ContextID
;
1354 CMSAPI cmsSEQ
* CMSEXPORT
cmsAllocProfileSequenceDescription(cmsContext ContextID
, cmsUInt32Number n
);
1355 CMSAPI cmsSEQ
* CMSEXPORT
cmsDupProfileSequenceDescription(const cmsSEQ
* pseq
);
1356 CMSAPI
void CMSEXPORT
cmsFreeProfileSequenceDescription(cmsSEQ
* pseq
);
1358 // Dictionaries --------------------------------------------------------------------------------------------------------
1360 typedef struct _cmsDICTentry_struct
{
1362 struct _cmsDICTentry_struct
* Next
;
1364 cmsMLU
*DisplayName
;
1365 cmsMLU
*DisplayValue
;
1371 CMSAPI cmsHANDLE CMSEXPORT
cmsDictAlloc(cmsContext ContextID
);
1372 CMSAPI
void CMSEXPORT
cmsDictFree(cmsHANDLE hDict
);
1373 CMSAPI cmsHANDLE CMSEXPORT
cmsDictDup(cmsHANDLE hDict
);
1375 CMSAPI cmsBool CMSEXPORT
cmsDictAddEntry(cmsHANDLE hDict
, const wchar_t* Name
, const wchar_t* Value
, const cmsMLU
*DisplayName
, const cmsMLU
*DisplayValue
);
1376 CMSAPI
const cmsDICTentry
* CMSEXPORT
cmsDictGetEntryList(cmsHANDLE hDict
);
1377 CMSAPI
const cmsDICTentry
* CMSEXPORT
cmsDictNextEntry(const cmsDICTentry
* e
);
1379 // Access to Profile data ----------------------------------------------------------------------------------------------
1380 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateProfilePlaceholder(cmsContext ContextID
);
1382 CMSAPI cmsContext CMSEXPORT
cmsGetProfileContextID(cmsHPROFILE hProfile
);
1383 CMSAPI cmsInt32Number CMSEXPORT
cmsGetTagCount(cmsHPROFILE hProfile
);
1384 CMSAPI cmsTagSignature CMSEXPORT
cmsGetTagSignature(cmsHPROFILE hProfile
, cmsUInt32Number n
);
1385 CMSAPI cmsBool CMSEXPORT
cmsIsTag(cmsHPROFILE hProfile
, cmsTagSignature sig
);
1387 // Read and write pre-formatted data
1388 CMSAPI
void* CMSEXPORT
cmsReadTag(cmsHPROFILE hProfile
, cmsTagSignature sig
);
1389 CMSAPI cmsBool CMSEXPORT
cmsWriteTag(cmsHPROFILE hProfile
, cmsTagSignature sig
, const void* data
);
1390 CMSAPI cmsBool CMSEXPORT
cmsLinkTag(cmsHPROFILE hProfile
, cmsTagSignature sig
, cmsTagSignature dest
);
1391 CMSAPI cmsTagSignature CMSEXPORT
cmsTagLinkedTo(cmsHPROFILE hProfile
, cmsTagSignature sig
);
1393 // Read and write raw data
1394 CMSAPI cmsInt32Number CMSEXPORT
cmsReadRawTag(cmsHPROFILE hProfile
, cmsTagSignature sig
, void* Buffer
, cmsUInt32Number BufferSize
);
1395 CMSAPI cmsBool CMSEXPORT
cmsWriteRawTag(cmsHPROFILE hProfile
, cmsTagSignature sig
, const void* data
, cmsUInt32Number Size
);
1397 // Access header data
1398 #define cmsEmbeddedProfileFalse 0x00000000
1399 #define cmsEmbeddedProfileTrue 0x00000001
1400 #define cmsUseAnywhere 0x00000000
1401 #define cmsUseWithEmbeddedDataOnly 0x00000002
1403 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetHeaderFlags(cmsHPROFILE hProfile
);
1404 CMSAPI
void CMSEXPORT
cmsGetHeaderAttributes(cmsHPROFILE hProfile
, cmsUInt64Number
* Flags
);
1405 CMSAPI
void CMSEXPORT
cmsGetHeaderProfileID(cmsHPROFILE hProfile
, cmsUInt8Number
* ProfileID
);
1406 CMSAPI cmsBool CMSEXPORT
cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile
, struct tm
*Dest
);
1407 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile
);
1409 CMSAPI
void CMSEXPORT
cmsSetHeaderFlags(cmsHPROFILE hProfile
, cmsUInt32Number Flags
);
1410 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetHeaderManufacturer(cmsHPROFILE hProfile
);
1411 CMSAPI
void CMSEXPORT
cmsSetHeaderManufacturer(cmsHPROFILE hProfile
, cmsUInt32Number manufacturer
);
1412 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetHeaderCreator(cmsHPROFILE hProfile
);
1413 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetHeaderModel(cmsHPROFILE hProfile
);
1414 CMSAPI
void CMSEXPORT
cmsSetHeaderModel(cmsHPROFILE hProfile
, cmsUInt32Number model
);
1415 CMSAPI
void CMSEXPORT
cmsSetHeaderAttributes(cmsHPROFILE hProfile
, cmsUInt64Number Flags
);
1416 CMSAPI
void CMSEXPORT
cmsSetHeaderProfileID(cmsHPROFILE hProfile
, cmsUInt8Number
* ProfileID
);
1417 CMSAPI
void CMSEXPORT
cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile
, cmsUInt32Number RenderingIntent
);
1419 CMSAPI cmsColorSpaceSignature
1420 CMSEXPORT
cmsGetPCS(cmsHPROFILE hProfile
);
1421 CMSAPI
void CMSEXPORT
cmsSetPCS(cmsHPROFILE hProfile
, cmsColorSpaceSignature pcs
);
1422 CMSAPI cmsColorSpaceSignature
1423 CMSEXPORT
cmsGetColorSpace(cmsHPROFILE hProfile
);
1424 CMSAPI
void CMSEXPORT
cmsSetColorSpace(cmsHPROFILE hProfile
, cmsColorSpaceSignature sig
);
1425 CMSAPI cmsProfileClassSignature
1426 CMSEXPORT
cmsGetDeviceClass(cmsHPROFILE hProfile
);
1427 CMSAPI
void CMSEXPORT
cmsSetDeviceClass(cmsHPROFILE hProfile
, cmsProfileClassSignature sig
);
1428 CMSAPI
void CMSEXPORT
cmsSetProfileVersion(cmsHPROFILE hProfile
, cmsFloat64Number Version
);
1429 CMSAPI cmsFloat64Number CMSEXPORT
cmsGetProfileVersion(cmsHPROFILE hProfile
);
1431 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetEncodedICCversion(cmsHPROFILE hProfile
);
1432 CMSAPI
void CMSEXPORT
cmsSetEncodedICCversion(cmsHPROFILE hProfile
, cmsUInt32Number Version
);
1434 // How profiles may be used
1435 #define LCMS_USED_AS_INPUT 0
1436 #define LCMS_USED_AS_OUTPUT 1
1437 #define LCMS_USED_AS_PROOF 2
1439 CMSAPI cmsBool CMSEXPORT
cmsIsIntentSupported(cmsHPROFILE hProfile
, cmsUInt32Number Intent
, cmsUInt32Number UsedDirection
);
1440 CMSAPI cmsBool CMSEXPORT
cmsIsMatrixShaper(cmsHPROFILE hProfile
);
1441 CMSAPI cmsBool CMSEXPORT
cmsIsCLUT(cmsHPROFILE hProfile
, cmsUInt32Number Intent
, cmsUInt32Number UsedDirection
);
1443 // Translate form/to our notation to ICC
1444 CMSAPI cmsColorSpaceSignature CMSEXPORT
_cmsICCcolorSpace(int OurNotation
);
1445 CMSAPI
int CMSEXPORT
_cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace
);
1447 CMSAPI cmsUInt32Number CMSEXPORT
cmsChannelsOf(cmsColorSpaceSignature ColorSpace
);
1449 // Build a suitable formatter for the colorspace of this profile
1450 CMSAPI cmsUInt32Number CMSEXPORT
cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile
, cmsUInt32Number nBytes
, cmsBool lIsFloat
);
1451 CMSAPI cmsUInt32Number CMSEXPORT
cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile
, cmsUInt32Number nBytes
, cmsBool lIsFloat
);
1456 cmsInfoDescription
= 0,
1457 cmsInfoManufacturer
= 1,
1459 cmsInfoCopyright
= 3
1462 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetProfileInfo(cmsHPROFILE hProfile
, cmsInfoType Info
,
1463 const char LanguageCode
[3], const char CountryCode
[3],
1464 wchar_t* Buffer
, cmsUInt32Number BufferSize
);
1466 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetProfileInfoASCII(cmsHPROFILE hProfile
, cmsInfoType Info
,
1467 const char LanguageCode
[3], const char CountryCode
[3],
1468 char* Buffer
, cmsUInt32Number BufferSize
);
1470 // IO handlers ----------------------------------------------------------------------------------------------------------
1472 typedef struct _cms_io_handler cmsIOHANDLER
;
1474 CMSAPI cmsIOHANDLER
* CMSEXPORT
cmsOpenIOhandlerFromFile(cmsContext ContextID
, const char* FileName
, const char* AccessMode
);
1475 CMSAPI cmsIOHANDLER
* CMSEXPORT
cmsOpenIOhandlerFromStream(cmsContext ContextID
, FILE* Stream
);
1476 CMSAPI cmsIOHANDLER
* CMSEXPORT
cmsOpenIOhandlerFromMem(cmsContext ContextID
, void *Buffer
, cmsUInt32Number size
, const char* AccessMode
);
1477 CMSAPI cmsIOHANDLER
* CMSEXPORT
cmsOpenIOhandlerFromNULL(cmsContext ContextID
);
1478 CMSAPI cmsBool CMSEXPORT
cmsCloseIOhandler(cmsIOHANDLER
* io
);
1480 // MD5 message digest --------------------------------------------------------------------------------------------------
1482 CMSAPI cmsBool CMSEXPORT
cmsMD5computeID(cmsHPROFILE hProfile
);
1484 // Profile high level funtions ------------------------------------------------------------------------------------------
1486 CMSAPI cmsHPROFILE CMSEXPORT
cmsOpenProfileFromFile(const char *ICCProfile
, const char *sAccess
);
1487 CMSAPI cmsHPROFILE CMSEXPORT
cmsOpenProfileFromFileTHR(cmsContext ContextID
, const char *ICCProfile
, const char *sAccess
);
1488 CMSAPI cmsHPROFILE CMSEXPORT
cmsOpenProfileFromStream(FILE* ICCProfile
, const char* sAccess
);
1489 CMSAPI cmsHPROFILE CMSEXPORT
cmsOpenProfileFromStreamTHR(cmsContext ContextID
, FILE* ICCProfile
, const char* sAccess
);
1490 CMSAPI cmsHPROFILE CMSEXPORT
cmsOpenProfileFromMem(const void * MemPtr
, cmsUInt32Number dwSize
);
1491 CMSAPI cmsHPROFILE CMSEXPORT
cmsOpenProfileFromMemTHR(cmsContext ContextID
, const void * MemPtr
, cmsUInt32Number dwSize
);
1492 CMSAPI cmsHPROFILE CMSEXPORT
cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID
, cmsIOHANDLER
* io
);
1493 CMSAPI cmsBool CMSEXPORT
cmsCloseProfile(cmsHPROFILE hProfile
);
1495 CMSAPI cmsBool CMSEXPORT
cmsSaveProfileToFile(cmsHPROFILE hProfile
, const char* FileName
);
1496 CMSAPI cmsBool CMSEXPORT
cmsSaveProfileToStream(cmsHPROFILE hProfile
, FILE* Stream
);
1497 CMSAPI cmsBool CMSEXPORT
cmsSaveProfileToMem(cmsHPROFILE hProfile
, void *MemPtr
, cmsUInt32Number
* BytesNeeded
);
1498 CMSAPI cmsUInt32Number CMSEXPORT
cmsSaveProfileToIOhandler(cmsHPROFILE hProfile
, cmsIOHANDLER
* io
);
1500 // Predefined virtual profiles ------------------------------------------------------------------------------------------
1502 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateRGBProfileTHR(cmsContext ContextID
,
1503 const cmsCIExyY
* WhitePoint
,
1504 const cmsCIExyYTRIPLE
* Primaries
,
1505 cmsToneCurve
* const TransferFunction
[3]);
1507 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateRGBProfile(const cmsCIExyY
* WhitePoint
,
1508 const cmsCIExyYTRIPLE
* Primaries
,
1509 cmsToneCurve
* const TransferFunction
[3]);
1511 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateGrayProfileTHR(cmsContext ContextID
,
1512 const cmsCIExyY
* WhitePoint
,
1513 const cmsToneCurve
* TransferFunction
);
1515 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateGrayProfile(const cmsCIExyY
* WhitePoint
,
1516 const cmsToneCurve
* TransferFunction
);
1518 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID
,
1519 cmsColorSpaceSignature ColorSpace
,
1520 cmsToneCurve
* const TransferFunctions
[]);
1522 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace
,
1523 cmsToneCurve
* const TransferFunctions
[]);
1525 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID
,
1526 cmsColorSpaceSignature ColorSpace
, cmsFloat64Number Limit
);
1528 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace
, cmsFloat64Number Limit
);
1531 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateLab2ProfileTHR(cmsContext ContextID
, const cmsCIExyY
* WhitePoint
);
1532 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateLab2Profile(const cmsCIExyY
* WhitePoint
);
1533 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateLab4ProfileTHR(cmsContext ContextID
, const cmsCIExyY
* WhitePoint
);
1534 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateLab4Profile(const cmsCIExyY
* WhitePoint
);
1536 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateXYZProfileTHR(cmsContext ContextID
);
1537 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateXYZProfile(void);
1539 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreate_sRGBProfileTHR(cmsContext ContextID
);
1540 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreate_sRGBProfile(void);
1542 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID
,
1544 cmsFloat64Number Bright
,
1545 cmsFloat64Number Contrast
,
1546 cmsFloat64Number Hue
,
1547 cmsFloat64Number Saturation
,
1551 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateBCHSWabstractProfile(int nLUTPoints
,
1552 cmsFloat64Number Bright
,
1553 cmsFloat64Number Contrast
,
1554 cmsFloat64Number Hue
,
1555 cmsFloat64Number Saturation
,
1559 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateNULLProfileTHR(cmsContext ContextID
);
1560 CMSAPI cmsHPROFILE CMSEXPORT
cmsCreateNULLProfile(void);
1562 // Converts a transform to a devicelink profile
1563 CMSAPI cmsHPROFILE CMSEXPORT
cmsTransform2DeviceLink(cmsHTRANSFORM hTransform
, cmsFloat64Number Version
, cmsUInt32Number dwFlags
);
1565 // Intents ----------------------------------------------------------------------------------------------
1568 #define INTENT_PERCEPTUAL 0
1569 #define INTENT_RELATIVE_COLORIMETRIC 1
1570 #define INTENT_SATURATION 2
1571 #define INTENT_ABSOLUTE_COLORIMETRIC 3
1574 #define INTENT_PRESERVE_K_ONLY_PERCEPTUAL 10
1575 #define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC 11
1576 #define INTENT_PRESERVE_K_ONLY_SATURATION 12
1577 #define INTENT_PRESERVE_K_PLANE_PERCEPTUAL 13
1578 #define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14
1579 #define INTENT_PRESERVE_K_PLANE_SATURATION 15
1581 // Call with NULL as parameters to get the intent count
1582 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetSupportedIntents(cmsUInt32Number nMax
, cmsUInt32Number
* Codes
, char** Descriptions
);
1586 #define cmsFLAGS_NOCACHE 0x0040 // Inhibit 1-pixel cache
1587 #define cmsFLAGS_NOOPTIMIZE 0x0100 // Inhibit optimizations
1588 #define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway
1591 #define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm
1592 #define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing
1595 #define cmsFLAGS_BLACKPOINTCOMPENSATION 0x2000
1596 #define cmsFLAGS_NOWHITEONWHITEFIXUP 0x0004 // Don't fix scum dot
1597 #define cmsFLAGS_HIGHRESPRECALC 0x0400 // Use more memory to give better accurancy
1598 #define cmsFLAGS_LOWRESPRECALC 0x0800 // Use less memory to minimize resouces
1600 // For devicelink creation
1601 #define cmsFLAGS_8BITS_DEVICELINK 0x0008 // Create 8 bits devicelinks
1602 #define cmsFLAGS_GUESSDEVICECLASS 0x0020 // Guess device class (for transform2devicelink)
1603 #define cmsFLAGS_KEEP_SEQUENCE 0x0080 // Keep profile sequence for devicelink creation
1605 // Specific to a particular optimizations
1606 #define cmsFLAGS_FORCE_CLUT 0x0002 // Force CLUT optimization
1607 #define cmsFLAGS_CLUT_POST_LINEARIZATION 0x0001 // create postlinearization tables if possible
1608 #define cmsFLAGS_CLUT_PRE_LINEARIZATION 0x0010 // create prelinearization tables if possible
1610 // Fine-tune control over number of gridpoints
1611 #define cmsFLAGS_GRIDPOINTS(n) (((n) & 0xFF) << 16)
1614 #define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000
1616 // Transforms ---------------------------------------------------------------------------------------------------
1618 CMSAPI cmsHTRANSFORM CMSEXPORT
cmsCreateTransformTHR(cmsContext ContextID
,
1620 cmsUInt32Number InputFormat
,
1622 cmsUInt32Number OutputFormat
,
1623 cmsUInt32Number Intent
,
1624 cmsUInt32Number dwFlags
);
1626 CMSAPI cmsHTRANSFORM CMSEXPORT
cmsCreateTransform(cmsHPROFILE Input
,
1627 cmsUInt32Number InputFormat
,
1629 cmsUInt32Number OutputFormat
,
1630 cmsUInt32Number Intent
,
1631 cmsUInt32Number dwFlags
);
1633 CMSAPI cmsHTRANSFORM CMSEXPORT
cmsCreateProofingTransformTHR(cmsContext ContextID
,
1635 cmsUInt32Number InputFormat
,
1637 cmsUInt32Number OutputFormat
,
1638 cmsHPROFILE Proofing
,
1639 cmsUInt32Number Intent
,
1640 cmsUInt32Number ProofingIntent
,
1641 cmsUInt32Number dwFlags
);
1643 CMSAPI cmsHTRANSFORM CMSEXPORT
cmsCreateProofingTransform(cmsHPROFILE Input
,
1644 cmsUInt32Number InputFormat
,
1646 cmsUInt32Number OutputFormat
,
1647 cmsHPROFILE Proofing
,
1648 cmsUInt32Number Intent
,
1649 cmsUInt32Number ProofingIntent
,
1650 cmsUInt32Number dwFlags
);
1652 CMSAPI cmsHTRANSFORM CMSEXPORT
cmsCreateMultiprofileTransformTHR(cmsContext ContextID
,
1653 cmsHPROFILE hProfiles
[],
1654 cmsUInt32Number nProfiles
,
1655 cmsUInt32Number InputFormat
,
1656 cmsUInt32Number OutputFormat
,
1657 cmsUInt32Number Intent
,
1658 cmsUInt32Number dwFlags
);
1661 CMSAPI cmsHTRANSFORM CMSEXPORT
cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles
[],
1662 cmsUInt32Number nProfiles
,
1663 cmsUInt32Number InputFormat
,
1664 cmsUInt32Number OutputFormat
,
1665 cmsUInt32Number Intent
,
1666 cmsUInt32Number dwFlags
);
1669 CMSAPI cmsHTRANSFORM CMSEXPORT
cmsCreateExtendedTransform(cmsContext ContextID
,
1670 cmsUInt32Number nProfiles
, cmsHPROFILE hProfiles
[],
1672 cmsUInt32Number Intents
[],
1673 cmsFloat64Number AdaptationStates
[],
1674 cmsHPROFILE hGamutProfile
,
1675 cmsUInt32Number nGamutPCSposition
,
1676 cmsUInt32Number InputFormat
,
1677 cmsUInt32Number OutputFormat
,
1678 cmsUInt32Number dwFlags
);
1680 CMSAPI
void CMSEXPORT
cmsDeleteTransform(cmsHTRANSFORM hTransform
);
1682 CMSAPI
void CMSEXPORT
cmsDoTransform(cmsHTRANSFORM Transform
,
1683 const void * InputBuffer
,
1684 void * OutputBuffer
,
1685 cmsUInt32Number Size
);
1687 CMSAPI
void CMSEXPORT
cmsDoTransformStride(cmsHTRANSFORM Transform
,
1688 const void * InputBuffer
,
1689 void * OutputBuffer
,
1690 cmsUInt32Number Size
,
1691 cmsUInt32Number Stride
);
1694 CMSAPI
void CMSEXPORT
cmsSetAlarmCodes(cmsUInt16Number NewAlarm
[cmsMAXCHANNELS
]);
1695 CMSAPI
void CMSEXPORT
cmsGetAlarmCodes(cmsUInt16Number NewAlarm
[cmsMAXCHANNELS
]);
1697 // Adaptation state for absolute colorimetric intent
1698 CMSAPI cmsFloat64Number CMSEXPORT
cmsSetAdaptationState(cmsFloat64Number d
);
1700 // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed
1701 CMSAPI cmsContext CMSEXPORT
cmsGetTransformContextID(cmsHTRANSFORM hTransform
);
1703 // Grab the input/output formats
1704 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetTransformInputFormat(cmsHTRANSFORM hTransform
);
1705 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform
);
1707 // For backwards compatibility
1708 CMSAPI cmsBool CMSEXPORT
cmsChangeBuffersFormat(cmsHTRANSFORM hTransform
,
1709 cmsUInt32Number InputFormat
,
1710 cmsUInt32Number OutputFormat
);
1714 // PostScript ColorRenderingDictionary and ColorSpaceArray ----------------------------------------------------
1716 typedef enum { cmsPS_RESOURCE_CSA
, cmsPS_RESOURCE_CRD
} cmsPSResourceType
;
1718 // lcms2 unified method to access postscript color resources
1719 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetPostScriptColorResource(cmsContext ContextID
,
1720 cmsPSResourceType Type
,
1721 cmsHPROFILE hProfile
,
1722 cmsUInt32Number Intent
,
1723 cmsUInt32Number dwFlags
,
1726 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetPostScriptCSA(cmsContext ContextID
, cmsHPROFILE hProfile
, cmsUInt32Number Intent
, cmsUInt32Number dwFlags
, void* Buffer
, cmsUInt32Number dwBufferLen
);
1727 CMSAPI cmsUInt32Number CMSEXPORT
cmsGetPostScriptCRD(cmsContext ContextID
, cmsHPROFILE hProfile
, cmsUInt32Number Intent
, cmsUInt32Number dwFlags
, void* Buffer
, cmsUInt32Number dwBufferLen
);
1730 // IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
1732 CMSAPI cmsHANDLE CMSEXPORT
cmsIT8Alloc(cmsContext ContextID
);
1733 CMSAPI
void CMSEXPORT
cmsIT8Free(cmsHANDLE hIT8
);
1736 CMSAPI cmsUInt32Number CMSEXPORT
cmsIT8TableCount(cmsHANDLE hIT8
);
1737 CMSAPI cmsInt32Number CMSEXPORT
cmsIT8SetTable(cmsHANDLE hIT8
, cmsUInt32Number nTable
);
1740 CMSAPI cmsHANDLE CMSEXPORT
cmsIT8LoadFromFile(cmsContext ContextID
, const char* cFileName
);
1741 CMSAPI cmsHANDLE CMSEXPORT
cmsIT8LoadFromMem(cmsContext ContextID
, void *Ptr
, cmsUInt32Number len
);
1742 // CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io);
1744 CMSAPI cmsBool CMSEXPORT
cmsIT8SaveToFile(cmsHANDLE hIT8
, const char* cFileName
);
1745 CMSAPI cmsBool CMSEXPORT
cmsIT8SaveToMem(cmsHANDLE hIT8
, void *MemPtr
, cmsUInt32Number
* BytesNeeded
);
1748 CMSAPI
const char* CMSEXPORT
cmsIT8GetSheetType(cmsHANDLE hIT8
);
1749 CMSAPI cmsBool CMSEXPORT
cmsIT8SetSheetType(cmsHANDLE hIT8
, const char* Type
);
1751 CMSAPI cmsBool CMSEXPORT
cmsIT8SetComment(cmsHANDLE hIT8
, const char* cComment
);
1753 CMSAPI cmsBool CMSEXPORT
cmsIT8SetPropertyStr(cmsHANDLE hIT8
, const char* cProp
, const char *Str
);
1754 CMSAPI cmsBool CMSEXPORT
cmsIT8SetPropertyDbl(cmsHANDLE hIT8
, const char* cProp
, cmsFloat64Number Val
);
1755 CMSAPI cmsBool CMSEXPORT
cmsIT8SetPropertyHex(cmsHANDLE hIT8
, const char* cProp
, cmsUInt32Number Val
);
1756 CMSAPI cmsBool CMSEXPORT
cmsIT8SetPropertyMulti(cmsHANDLE hIT8
, const char* Key
, const char* SubKey
, const char *Buffer
);
1757 CMSAPI cmsBool CMSEXPORT
cmsIT8SetPropertyUncooked(cmsHANDLE hIT8
, const char* Key
, const char* Buffer
);
1760 CMSAPI
const char* CMSEXPORT
cmsIT8GetProperty(cmsHANDLE hIT8
, const char* cProp
);
1761 CMSAPI cmsFloat64Number CMSEXPORT
cmsIT8GetPropertyDbl(cmsHANDLE hIT8
, const char* cProp
);
1762 CMSAPI
const char* CMSEXPORT
cmsIT8GetPropertyMulti(cmsHANDLE hIT8
, const char* Key
, const char *SubKey
);
1763 CMSAPI cmsUInt32Number CMSEXPORT
cmsIT8EnumProperties(cmsHANDLE hIT8
, char ***PropertyNames
);
1764 CMSAPI cmsUInt32Number CMSEXPORT
cmsIT8EnumPropertyMulti(cmsHANDLE hIT8
, const char* cProp
, const char ***SubpropertyNames
);
1767 CMSAPI
const char* CMSEXPORT
cmsIT8GetDataRowCol(cmsHANDLE hIT8
, int row
, int col
);
1768 CMSAPI cmsFloat64Number CMSEXPORT
cmsIT8GetDataRowColDbl(cmsHANDLE hIT8
, int row
, int col
);
1770 CMSAPI cmsBool CMSEXPORT
cmsIT8SetDataRowCol(cmsHANDLE hIT8
, int row
, int col
,
1773 CMSAPI cmsBool CMSEXPORT
cmsIT8SetDataRowColDbl(cmsHANDLE hIT8
, int row
, int col
,
1774 cmsFloat64Number Val
);
1776 CMSAPI
const char* CMSEXPORT
cmsIT8GetData(cmsHANDLE hIT8
, const char* cPatch
, const char* cSample
);
1779 CMSAPI cmsFloat64Number CMSEXPORT
cmsIT8GetDataDbl(cmsHANDLE hIT8
, const char* cPatch
, const char* cSample
);
1781 CMSAPI cmsBool CMSEXPORT
cmsIT8SetData(cmsHANDLE hIT8
, const char* cPatch
,
1782 const char* cSample
,
1785 CMSAPI cmsBool CMSEXPORT
cmsIT8SetDataDbl(cmsHANDLE hIT8
, const char* cPatch
,
1786 const char* cSample
,
1787 cmsFloat64Number Val
);
1789 CMSAPI
int CMSEXPORT
cmsIT8FindDataFormat(cmsHANDLE hIT8
, const char* cSample
);
1790 CMSAPI cmsBool CMSEXPORT
cmsIT8SetDataFormat(cmsHANDLE hIT8
, int n
, const char *Sample
);
1791 CMSAPI
int CMSEXPORT
cmsIT8EnumDataFormat(cmsHANDLE hIT8
, char ***SampleNames
);
1793 CMSAPI
const char* CMSEXPORT
cmsIT8GetPatchName(cmsHANDLE hIT8
, int nPatch
, char* buffer
);
1794 CMSAPI
int CMSEXPORT
cmsIT8GetPatchByName(cmsHANDLE hIT8
, const char *cPatch
);
1796 // The LABEL extension
1797 CMSAPI
int CMSEXPORT
cmsIT8SetTableByLabel(cmsHANDLE hIT8
, const char* cSet
, const char* cField
, const char* ExpectedType
);
1799 CMSAPI cmsBool CMSEXPORT
cmsIT8SetIndexColumn(cmsHANDLE hIT8
, const char* cSample
);
1801 // Formatter for double
1802 CMSAPI
void CMSEXPORT
cmsIT8DefineDblFormat(cmsHANDLE hIT8
, const char* Formatter
);
1804 // Gamut boundary description routines ------------------------------------------------------------------------------
1806 CMSAPI cmsHANDLE CMSEXPORT
cmsGBDAlloc(cmsContext ContextID
);
1807 CMSAPI
void CMSEXPORT
cmsGBDFree(cmsHANDLE hGBD
);
1808 CMSAPI cmsBool CMSEXPORT
cmsGDBAddPoint(cmsHANDLE hGBD
, const cmsCIELab
* Lab
);
1809 CMSAPI cmsBool CMSEXPORT
cmsGDBCompute(cmsHANDLE hGDB
, cmsUInt32Number dwFlags
);
1810 CMSAPI cmsBool CMSEXPORT
cmsGDBCheckPoint(cmsHANDLE hGBD
, const cmsCIELab
* Lab
);
1812 // Feature detection ----------------------------------------------------------------------------------------------
1814 // Estimate the black point
1815 CMSAPI cmsBool CMSEXPORT
cmsDetectBlackPoint(cmsCIEXYZ
* BlackPoint
, cmsHPROFILE hProfile
, cmsUInt32Number Intent
, cmsUInt32Number dwFlags
);
1816 CMSAPI cmsBool CMSEXPORT
cmsDetectDestinationBlackPoint(cmsCIEXYZ
* BlackPoint
, cmsHPROFILE hProfile
, cmsUInt32Number Intent
, cmsUInt32Number dwFlags
);
1818 // Estimate total area coverage
1819 CMSAPI cmsFloat64Number CMSEXPORT
cmsDetectTAC(cmsHPROFILE hProfile
);
1822 // Poor man's gamut mapping
1823 CMSAPI cmsBool CMSEXPORT
cmsDesaturateLab(cmsCIELab
* Lab
,
1824 double amax
, double amin
,
1825 double bmax
, double bmin
);
1827 #ifndef CMS_USE_CPP_API