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// Version 2.9rc3
56//
57
58#ifndef _lcms2_H
59
60// ********** Configuration toggles ****************************************
61
62// Uncomment this one if you are using big endian machines
63// #define CMS_USE_BIG_ENDIAN 1
64
65// Uncomment this one if your compiler/machine does NOT support the
66// "long long" type.
67// #define CMS_DONT_USE_INT64 1
68
69// Uncomment this if your compiler doesn't work with fast floor function
70// #define CMS_DONT_USE_FAST_FLOOR 1
71
72// Uncomment this line if you want lcms to use the black point tag in profile,
73// if commented, lcms will compute the black point by its own.
74// It is safer to leave it commented out
75// #define CMS_USE_PROFILE_BLACK_POINT_TAG 1
76
77// Uncomment this line if you are compiling as C++ and want a C++ API
78// #define CMS_USE_CPP_API
79
80// Uncomment this line if you need strict CGATS syntax. Makes CGATS files to
81// require "KEYWORD" on undefined identifiers, keep it commented out unless needed
82// #define CMS_STRICT_CGATS 1
83
84// Uncomment to get rid of the tables for "half" float support
85// #define CMS_NO_HALF_SUPPORT 1
86
87// Uncomment to get rid of pthreads/windows dependency
88// #define CMS_NO_PTHREADS 1
89
90// Uncomment this for special windows mutex initialization (see lcms2_internal.h)
91// #define CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT
92
93// ********** End of configuration toggles ******************************
94
95// Needed for streams
96#include <stdio.h>
97
98// Needed for portability (C99 per 7.1.2)
99#include <limits.h>
100#include <time.h>
101#include <stddef.h>
102
103#ifndef CMS_USE_CPP_API
104# ifdef __cplusplus
105extern "C" {
106# endif
107#endif
108
109// Version/release
110#define LCMS_VERSION 2090
111
112// I will give the chance of redefining basic types for compilers that are not fully C99 compliant
113#ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
114
115// Base types
116typedef unsigned char cmsUInt8Number; // That is guaranteed by the C99 spec
117typedef signed char cmsInt8Number; // That is guaranteed by the C99 spec
118
119#if CHAR_BIT != 8
120# error "Unable to find 8 bit type, unsupported compiler"
121#endif
122
123// IEEE float storage numbers
124typedef float cmsFloat32Number;
125typedef double cmsFloat64Number;
126
127// 16-bit base types
128#if (USHRT_MAX == 65535U)
129 typedef unsigned short cmsUInt16Number;
130#elif (UINT_MAX == 65535U)
131 typedef unsigned int cmsUInt16Number;
132#else
133# error "Unable to find 16 bits unsigned type, unsupported compiler"
134#endif
135
136#if (SHRT_MAX == 32767)
137 typedef short cmsInt16Number;
138#elif (INT_MAX == 32767)
139 typedef int cmsInt16Number;
140#else
141# error "Unable to find 16 bits signed type, unsupported compiler"
142#endif
143
144// 32-bit base type
145#if (UINT_MAX == 4294967295U)
146 typedef unsigned int cmsUInt32Number;
147#elif (ULONG_MAX == 4294967295U)
148 typedef unsigned long cmsUInt32Number;
149#else
150# error "Unable to find 32 bit unsigned type, unsupported compiler"
151#endif
152
153#if (INT_MAX == +2147483647)
154 typedef int cmsInt32Number;
155#elif (LONG_MAX == +2147483647)
156 typedef long cmsInt32Number;
157#else
158# error "Unable to find 32 bit signed type, unsupported compiler"
159#endif
160
161// 64-bit base types
162#ifndef CMS_DONT_USE_INT64
163# if (ULONG_MAX == 18446744073709551615U)
164 typedef unsigned long cmsUInt64Number;
165# elif (ULLONG_MAX == 18446744073709551615U)
166 typedef unsigned long long cmsUInt64Number;
167# else
168# define CMS_DONT_USE_INT64 1
169# endif
170# if (LONG_MAX == +9223372036854775807)
171 typedef long cmsInt64Number;
172# elif (LLONG_MAX == +9223372036854775807)
173 typedef long long cmsInt64Number;
174# else
175# define CMS_DONT_USE_INT64 1
176# endif
177#endif
178#endif
179
180// In the case 64 bit numbers are not supported by the compiler
181#ifdef CMS_DONT_USE_INT64
182 typedef cmsUInt32Number cmsUInt64Number[2];
183 typedef cmsInt32Number cmsInt64Number[2];
184#endif
185
186// Derivative types
187typedef cmsUInt32Number cmsSignature;
188typedef cmsUInt16Number cmsU8Fixed8Number;
189typedef cmsInt32Number cmsS15Fixed16Number;
190typedef cmsUInt32Number cmsU16Fixed16Number;
191
192// Boolean type, which will be using the native integer
193typedef int cmsBool;
194
195// Try to detect windows
196#if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_)
197# define CMS_IS_WINDOWS_ 1
198#endif
199
200#ifdef _MSC_VER
201# define CMS_IS_WINDOWS_ 1
202#endif
203
204#ifdef __BORLANDC__
205# define CMS_IS_WINDOWS_ 1
206#endif
207
208// Try to detect big endian platforms. This list can be endless, so primarily rely on the configure script
209// on Unix-like systems, and allow it to be set on the compiler command line using
210// -DCMS_USE_BIG_ENDIAN or something similar
211#ifdef CMS_USE_BIG_ENDIAN // set at compiler command line takes overall precedence
212
213# if CMS_USE_BIG_ENDIAN == 0
214# undef CMS_USE_BIG_ENDIAN
215# endif
216
217#else // CMS_USE_BIG_ENDIAN
218
219# ifdef WORDS_BIGENDIAN // set by configure (or explicitly on compiler command line)
220# define CMS_USE_BIG_ENDIAN 1
221# else // WORDS_BIGENDIAN
222// Fall back to platform/compiler specific tests
223# if defined(__sgi__) || defined(__sgi) || defined(sparc)
224# define CMS_USE_BIG_ENDIAN 1
225# endif
226
227# if defined(__s390__) || defined(__s390x__)
228# define CMS_USE_BIG_ENDIAN 1
229# endif
230
231# ifdef macintosh
232# ifdef __BIG_ENDIAN__
233# define CMS_USE_BIG_ENDIAN 1
234# endif
235# ifdef __LITTLE_ENDIAN__
236# undef CMS_USE_BIG_ENDIAN
237# endif
238# endif
239# endif // WORDS_BIGENDIAN
240
241# if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__)
242# define CMS_USE_BIG_ENDIAN 1
243# endif
244
245#endif // CMS_USE_BIG_ENDIAN
246
247
248// Calling convention -- this is hardly platform and compiler dependent
249#ifdef CMS_IS_WINDOWS_
250# if defined(CMS_DLL) || defined(CMS_DLL_BUILD)
251# ifdef __BORLANDC__
252# define CMSEXPORT __stdcall _export
253# define CMSAPI
254# else
255# define CMSEXPORT __stdcall
256# ifdef CMS_DLL_BUILD
257# define CMSAPI __declspec(dllexport)
258# else
259# define CMSAPI __declspec(dllimport)
260# endif
261# endif
262# else
263# define CMSEXPORT
264# define CMSAPI
265# endif
266#else // not Windows
267# ifdef HAVE_FUNC_ATTRIBUTE_VISIBILITY
268# define CMSEXPORT
269# define CMSAPI __attribute__((visibility("default")))
270# else
271# define CMSEXPORT
272# define CMSAPI
273# endif
274#endif // CMS_IS_WINDOWS_
275
276#ifdef HasTHREADS
277# if HasTHREADS == 1
278# undef CMS_NO_PTHREADS
279# else
280# define CMS_NO_PTHREADS 1
281# endif
282#endif
283
284// Some common definitions
285#define cmsMAX_PATH 256
286
287#ifndef FALSE
288# define FALSE 0
289#endif
290#ifndef TRUE
291# define TRUE 1
292#endif
293
294// D50 XYZ normalized to Y=1.0
295#define cmsD50X 0.9642
296#define cmsD50Y 1.0
297#define cmsD50Z 0.8249
298
299// V4 perceptual black
300#define cmsPERCEPTUAL_BLACK_X 0.00336
301#define cmsPERCEPTUAL_BLACK_Y 0.0034731
302#define cmsPERCEPTUAL_BLACK_Z 0.00287
303
304// Definitions in ICC spec
305#define cmsMagicNumber 0x61637370 // 'acsp'
306#define lcmsSignature 0x6c636d73 // 'lcms'
307
308
309// Base ICC type definitions
310typedef enum {
311 cmsSigChromaticityType = 0x6368726D, // 'chrm'
312 cmsSigColorantOrderType = 0x636C726F, // 'clro'
313 cmsSigColorantTableType = 0x636C7274, // 'clrt'
314 cmsSigCrdInfoType = 0x63726469, // 'crdi'
315 cmsSigCurveType = 0x63757276, // 'curv'
316 cmsSigDataType = 0x64617461, // 'data'
317 cmsSigDictType = 0x64696374, // 'dict'
318 cmsSigDateTimeType = 0x6474696D, // 'dtim'
319 cmsSigDeviceSettingsType = 0x64657673, // 'devs'
320 cmsSigLut16Type = 0x6d667432, // 'mft2'
321 cmsSigLut8Type = 0x6d667431, // 'mft1'
322 cmsSigLutAtoBType = 0x6d414220, // 'mAB '
323 cmsSigLutBtoAType = 0x6d424120, // 'mBA '
324 cmsSigMeasurementType = 0x6D656173, // 'meas'
325 cmsSigMultiLocalizedUnicodeType = 0x6D6C7563, // 'mluc'
326 cmsSigMultiProcessElementType = 0x6D706574, // 'mpet'
327 cmsSigNamedColorType = 0x6E636f6C, // 'ncol' -- DEPRECATED!
328 cmsSigNamedColor2Type = 0x6E636C32, // 'ncl2'
329 cmsSigParametricCurveType = 0x70617261, // 'para'
330 cmsSigProfileSequenceDescType = 0x70736571, // 'pseq'
331 cmsSigProfileSequenceIdType = 0x70736964, // 'psid'
332 cmsSigResponseCurveSet16Type = 0x72637332, // 'rcs2'
333 cmsSigS15Fixed16ArrayType = 0x73663332, // 'sf32'
334 cmsSigScreeningType = 0x7363726E, // 'scrn'
335 cmsSigSignatureType = 0x73696720, // 'sig '
336 cmsSigTextType = 0x74657874, // 'text'
337 cmsSigTextDescriptionType = 0x64657363, // 'desc'
338 cmsSigU16Fixed16ArrayType = 0x75663332, // 'uf32'
339 cmsSigUcrBgType = 0x62666420, // 'bfd '
340 cmsSigUInt16ArrayType = 0x75693136, // 'ui16'
341 cmsSigUInt32ArrayType = 0x75693332, // 'ui32'
342 cmsSigUInt64ArrayType = 0x75693634, // 'ui64'
343 cmsSigUInt8ArrayType = 0x75693038, // 'ui08'
344 cmsSigVcgtType = 0x76636774, // 'vcgt'
345 cmsSigViewingConditionsType = 0x76696577, // 'view'
346 cmsSigXYZType = 0x58595A20 // 'XYZ '
347
348
349} cmsTagTypeSignature;
350
351// Base ICC tag definitions
352typedef enum {
353 cmsSigAToB0Tag = 0x41324230, // 'A2B0'
354 cmsSigAToB1Tag = 0x41324231, // 'A2B1'
355 cmsSigAToB2Tag = 0x41324232, // 'A2B2'
356 cmsSigBlueColorantTag = 0x6258595A, // 'bXYZ'
357 cmsSigBlueMatrixColumnTag = 0x6258595A, // 'bXYZ'
358 cmsSigBlueTRCTag = 0x62545243, // 'bTRC'
359 cmsSigBToA0Tag = 0x42324130, // 'B2A0'
360 cmsSigBToA1Tag = 0x42324131, // 'B2A1'
361 cmsSigBToA2Tag = 0x42324132, // 'B2A2'
362 cmsSigCalibrationDateTimeTag = 0x63616C74, // 'calt'
363 cmsSigCharTargetTag = 0x74617267, // 'targ'
364 cmsSigChromaticAdaptationTag = 0x63686164, // 'chad'
365 cmsSigChromaticityTag = 0x6368726D, // 'chrm'
366 cmsSigColorantOrderTag = 0x636C726F, // 'clro'
367 cmsSigColorantTableTag = 0x636C7274, // 'clrt'
368 cmsSigColorantTableOutTag = 0x636C6F74, // 'clot'
369 cmsSigColorimetricIntentImageStateTag = 0x63696973, // 'ciis'
370 cmsSigCopyrightTag = 0x63707274, // 'cprt'
371 cmsSigCrdInfoTag = 0x63726469, // 'crdi'
372 cmsSigDataTag = 0x64617461, // 'data'
373 cmsSigDateTimeTag = 0x6474696D, // 'dtim'
374 cmsSigDeviceMfgDescTag = 0x646D6E64, // 'dmnd'
375 cmsSigDeviceModelDescTag = 0x646D6464, // 'dmdd'
376 cmsSigDeviceSettingsTag = 0x64657673, // 'devs'
377 cmsSigDToB0Tag = 0x44324230, // 'D2B0'
378 cmsSigDToB1Tag = 0x44324231, // 'D2B1'
379 cmsSigDToB2Tag = 0x44324232, // 'D2B2'
380 cmsSigDToB3Tag = 0x44324233, // 'D2B3'
381 cmsSigBToD0Tag = 0x42324430, // 'B2D0'
382 cmsSigBToD1Tag = 0x42324431, // 'B2D1'
383 cmsSigBToD2Tag = 0x42324432, // 'B2D2'
384 cmsSigBToD3Tag = 0x42324433, // 'B2D3'
385 cmsSigGamutTag = 0x67616D74, // 'gamt'
386 cmsSigGrayTRCTag = 0x6b545243, // 'kTRC'
387 cmsSigGreenColorantTag = 0x6758595A, // 'gXYZ'
388 cmsSigGreenMatrixColumnTag = 0x6758595A, // 'gXYZ'
389 cmsSigGreenTRCTag = 0x67545243, // 'gTRC'
390 cmsSigLuminanceTag = 0x6C756d69, // 'lumi'
391 cmsSigMeasurementTag = 0x6D656173, // 'meas'
392 cmsSigMediaBlackPointTag = 0x626B7074, // 'bkpt'
393 cmsSigMediaWhitePointTag = 0x77747074, // 'wtpt'
394 cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' // Deprecated by the ICC
395 cmsSigNamedColor2Tag = 0x6E636C32, // 'ncl2'
396 cmsSigOutputResponseTag = 0x72657370, // 'resp'
397 cmsSigPerceptualRenderingIntentGamutTag = 0x72696730, // 'rig0'
398 cmsSigPreview0Tag = 0x70726530, // 'pre0'
399 cmsSigPreview1Tag = 0x70726531, // 'pre1'
400 cmsSigPreview2Tag = 0x70726532, // 'pre2'
401 cmsSigProfileDescriptionTag = 0x64657363, // 'desc'
402 cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm'
403 cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq'
404 cmsSigProfileSequenceIdTag = 0x70736964, // 'psid'
405 cmsSigPs2CRD0Tag = 0x70736430, // 'psd0'
406 cmsSigPs2CRD1Tag = 0x70736431, // 'psd1'
407 cmsSigPs2CRD2Tag = 0x70736432, // 'psd2'
408 cmsSigPs2CRD3Tag = 0x70736433, // 'psd3'
409 cmsSigPs2CSATag = 0x70733273, // 'ps2s'
410 cmsSigPs2RenderingIntentTag = 0x70733269, // 'ps2i'
411 cmsSigRedColorantTag = 0x7258595A, // 'rXYZ'
412 cmsSigRedMatrixColumnTag = 0x7258595A, // 'rXYZ'
413 cmsSigRedTRCTag = 0x72545243, // 'rTRC'
414 cmsSigSaturationRenderingIntentGamutTag = 0x72696732, // 'rig2'
415 cmsSigScreeningDescTag = 0x73637264, // 'scrd'
416 cmsSigScreeningTag = 0x7363726E, // 'scrn'
417 cmsSigTechnologyTag = 0x74656368, // 'tech'
418 cmsSigUcrBgTag = 0x62666420, // 'bfd '
419 cmsSigViewingCondDescTag = 0x76756564, // 'vued'
420 cmsSigViewingConditionsTag = 0x76696577, // 'view'
421 cmsSigVcgtTag = 0x76636774, // 'vcgt'
422 cmsSigMetaTag = 0x6D657461, // 'meta'
423 cmsSigArgyllArtsTag = 0x61727473 // 'arts'
424
425} cmsTagSignature;
426
427
428// ICC Technology tag
429typedef enum {
430 cmsSigDigitalCamera = 0x6463616D, // 'dcam'
431 cmsSigFilmScanner = 0x6673636E, // 'fscn'
432 cmsSigReflectiveScanner = 0x7273636E, // 'rscn'
433 cmsSigInkJetPrinter = 0x696A6574, // 'ijet'
434 cmsSigThermalWaxPrinter = 0x74776178, // 'twax'
435 cmsSigElectrophotographicPrinter = 0x6570686F, // 'epho'
436 cmsSigElectrostaticPrinter = 0x65737461, // 'esta'
437 cmsSigDyeSublimationPrinter = 0x64737562, // 'dsub'
438 cmsSigPhotographicPaperPrinter = 0x7270686F, // 'rpho'
439 cmsSigFilmWriter = 0x6670726E, // 'fprn'
440 cmsSigVideoMonitor = 0x7669646D, // 'vidm'
441 cmsSigVideoCamera = 0x76696463, // 'vidc'
442 cmsSigProjectionTelevision = 0x706A7476, // 'pjtv'
443 cmsSigCRTDisplay = 0x43525420, // 'CRT '
444 cmsSigPMDisplay = 0x504D4420, // 'PMD '
445 cmsSigAMDisplay = 0x414D4420, // 'AMD '
446 cmsSigPhotoCD = 0x4B504344, // 'KPCD'
447 cmsSigPhotoImageSetter = 0x696D6773, // 'imgs'
448 cmsSigGravure = 0x67726176, // 'grav'
449 cmsSigOffsetLithography = 0x6F666673, // 'offs'
450 cmsSigSilkscreen = 0x73696C6B, // 'silk'
451 cmsSigFlexography = 0x666C6578, // 'flex'
452 cmsSigMotionPictureFilmScanner = 0x6D706673, // 'mpfs'
453 cmsSigMotionPictureFilmRecorder = 0x6D706672, // 'mpfr'
454 cmsSigDigitalMotionPictureCamera = 0x646D7063, // 'dmpc'
455 cmsSigDigitalCinemaProjector = 0x64636A70 // 'dcpj'
456
457} cmsTechnologySignature;
458
459
460// ICC Color spaces
461typedef enum {
462 cmsSigXYZData = 0x58595A20, // 'XYZ '
463 cmsSigLabData = 0x4C616220, // 'Lab '
464 cmsSigLuvData = 0x4C757620, // 'Luv '
465 cmsSigYCbCrData = 0x59436272, // 'YCbr'
466 cmsSigYxyData = 0x59787920, // 'Yxy '
467 cmsSigRgbData = 0x52474220, // 'RGB '
468 cmsSigGrayData = 0x47524159, // 'GRAY'
469 cmsSigHsvData = 0x48535620, // 'HSV '
470 cmsSigHlsData = 0x484C5320, // 'HLS '
471 cmsSigCmykData = 0x434D594B, // 'CMYK'
472 cmsSigCmyData = 0x434D5920, // 'CMY '
473 cmsSigMCH1Data = 0x4D434831, // 'MCH1'
474 cmsSigMCH2Data = 0x4D434832, // 'MCH2'
475 cmsSigMCH3Data = 0x4D434833, // 'MCH3'
476 cmsSigMCH4Data = 0x4D434834, // 'MCH4'
477 cmsSigMCH5Data = 0x4D434835, // 'MCH5'
478 cmsSigMCH6Data = 0x4D434836, // 'MCH6'
479 cmsSigMCH7Data = 0x4D434837, // 'MCH7'
480 cmsSigMCH8Data = 0x4D434838, // 'MCH8'
481 cmsSigMCH9Data = 0x4D434839, // 'MCH9'
482 cmsSigMCHAData = 0x4D434841, // 'MCHA'
483 cmsSigMCHBData = 0x4D434842, // 'MCHB'
484 cmsSigMCHCData = 0x4D434843, // 'MCHC'
485 cmsSigMCHDData = 0x4D434844, // 'MCHD'
486 cmsSigMCHEData = 0x4D434845, // 'MCHE'
487 cmsSigMCHFData = 0x4D434846, // 'MCHF'
488 cmsSigNamedData = 0x6e6d636c, // 'nmcl'
489 cmsSig1colorData = 0x31434C52, // '1CLR'
490 cmsSig2colorData = 0x32434C52, // '2CLR'
491 cmsSig3colorData = 0x33434C52, // '3CLR'
492 cmsSig4colorData = 0x34434C52, // '4CLR'
493 cmsSig5colorData = 0x35434C52, // '5CLR'
494 cmsSig6colorData = 0x36434C52, // '6CLR'
495 cmsSig7colorData = 0x37434C52, // '7CLR'
496 cmsSig8colorData = 0x38434C52, // '8CLR'
497 cmsSig9colorData = 0x39434C52, // '9CLR'
498 cmsSig10colorData = 0x41434C52, // 'ACLR'
499 cmsSig11colorData = 0x42434C52, // 'BCLR'
500 cmsSig12colorData = 0x43434C52, // 'CCLR'
501 cmsSig13colorData = 0x44434C52, // 'DCLR'
502 cmsSig14colorData = 0x45434C52, // 'ECLR'
503 cmsSig15colorData = 0x46434C52, // 'FCLR'
504 cmsSigLuvKData = 0x4C75764B // 'LuvK'
505
506} cmsColorSpaceSignature;
507
508// ICC Profile Class
509typedef enum {
510 cmsSigInputClass = 0x73636E72, // 'scnr'
511 cmsSigDisplayClass = 0x6D6E7472, // 'mntr'
512 cmsSigOutputClass = 0x70727472, // 'prtr'
513 cmsSigLinkClass = 0x6C696E6B, // 'link'
514 cmsSigAbstractClass = 0x61627374, // 'abst'
515 cmsSigColorSpaceClass = 0x73706163, // 'spac'
516 cmsSigNamedColorClass = 0x6e6d636c // 'nmcl'
517
518} cmsProfileClassSignature;
519
520// ICC Platforms
521typedef enum {
522 cmsSigMacintosh = 0x4150504C, // 'APPL'
523 cmsSigMicrosoft = 0x4D534654, // 'MSFT'
524 cmsSigSolaris = 0x53554E57, // 'SUNW'
525 cmsSigSGI = 0x53474920, // 'SGI '
526 cmsSigTaligent = 0x54474E54, // 'TGNT'
527 cmsSigUnices = 0x2A6E6978 // '*nix' // From argyll -- Not official
528
529} cmsPlatformSignature;
530
531// Reference gamut
532#define cmsSigPerceptualReferenceMediumGamut 0x70726d67 //'prmg'
533
534// For cmsSigColorimetricIntentImageStateTag
535#define cmsSigSceneColorimetryEstimates 0x73636F65 //'scoe'
536#define cmsSigSceneAppearanceEstimates 0x73617065 //'sape'
537#define cmsSigFocalPlaneColorimetryEstimates 0x66706365 //'fpce'
538#define cmsSigReflectionHardcopyOriginalColorimetry 0x72686F63 //'rhoc'
539#define cmsSigReflectionPrintOutputColorimetry 0x72706F63 //'rpoc'
540
541// Multi process elements types
542typedef enum {
543 cmsSigCurveSetElemType = 0x63767374, //'cvst'
544 cmsSigMatrixElemType = 0x6D617466, //'matf'
545 cmsSigCLutElemType = 0x636C7574, //'clut'
546
547 cmsSigBAcsElemType = 0x62414353, // 'bACS'
548 cmsSigEAcsElemType = 0x65414353, // 'eACS'
549
550 // Custom from here, not in the ICC Spec
551 cmsSigXYZ2LabElemType = 0x6C327820, // 'l2x '
552 cmsSigLab2XYZElemType = 0x78326C20, // 'x2l '
553 cmsSigNamedColorElemType = 0x6E636C20, // 'ncl '
554 cmsSigLabV2toV4 = 0x32203420, // '2 4 '
555 cmsSigLabV4toV2 = 0x34203220, // '4 2 '
556
557 // Identities
558 cmsSigIdentityElemType = 0x69646E20, // 'idn '
559
560 // Float to floatPCS
561 cmsSigLab2FloatPCS = 0x64326C20, // 'd2l '
562 cmsSigFloatPCS2Lab = 0x6C326420, // 'l2d '
563 cmsSigXYZ2FloatPCS = 0x64327820, // 'd2x '
564 cmsSigFloatPCS2XYZ = 0x78326420, // 'x2d '
565 cmsSigClipNegativesElemType = 0x636c7020 // 'clp '
566
567} cmsStageSignature;
568
569// Types of CurveElements
570typedef enum {
571
572 cmsSigFormulaCurveSeg = 0x70617266, // 'parf'
573 cmsSigSampledCurveSeg = 0x73616D66, // 'samf'
574 cmsSigSegmentedCurve = 0x63757266 // 'curf'
575
576} cmsCurveSegSignature;
577
578// Used in ResponseCurveType
579#define cmsSigStatusA 0x53746141 //'StaA'
580#define cmsSigStatusE 0x53746145 //'StaE'
581#define cmsSigStatusI 0x53746149 //'StaI'
582#define cmsSigStatusT 0x53746154 //'StaT'
583#define cmsSigStatusM 0x5374614D //'StaM'
584#define cmsSigDN 0x444E2020 //'DN '
585#define cmsSigDNP 0x444E2050 //'DN P'
586#define cmsSigDNN 0x444E4E20 //'DNN '
587#define cmsSigDNNP 0x444E4E50 //'DNNP'
588
589// Device attributes, currently defined values correspond to the low 4 bytes
590// of the 8 byte attribute quantity
591#define cmsReflective 0
592#define cmsTransparency 1
593#define cmsGlossy 0
594#define cmsMatte 2
595
596// Common structures in ICC tags
597typedef struct {
598 cmsUInt32Number len;
599 cmsUInt32Number flag;
600 cmsUInt8Number data[1];
601
602} cmsICCData;
603
604// ICC date time
605typedef struct {
606 cmsUInt16Number year;
607 cmsUInt16Number month;
608 cmsUInt16Number day;
609 cmsUInt16Number hours;
610 cmsUInt16Number minutes;
611 cmsUInt16Number seconds;
612
613} cmsDateTimeNumber;
614
615// ICC XYZ
616typedef struct {
617 cmsS15Fixed16Number X;
618 cmsS15Fixed16Number Y;
619 cmsS15Fixed16Number Z;
620
621} cmsEncodedXYZNumber;
622
623
624// Profile ID as computed by MD5 algorithm
625typedef union {
626 cmsUInt8Number ID8[16];
627 cmsUInt16Number ID16[8];
628 cmsUInt32Number ID32[4];
629
630} cmsProfileID;
631
632
633// ----------------------------------------------------------------------------------------------
634// ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe
635// somebody want to use this info for accessing profile header directly, so here it is.
636
637// Profile header -- it is 32-bit aligned, so no issues are expected on alignment
638typedef struct {
639 cmsUInt32Number size; // Profile size in bytes
640 cmsSignature cmmId; // CMM for this profile
641 cmsUInt32Number version; // Format version number
642 cmsProfileClassSignature deviceClass; // Type of profile
643 cmsColorSpaceSignature colorSpace; // Color space of data
644 cmsColorSpaceSignature pcs; // PCS, XYZ or Lab only
645 cmsDateTimeNumber date; // Date profile was created
646 cmsSignature magic; // Magic Number to identify an ICC profile
647 cmsPlatformSignature platform; // Primary Platform
648 cmsUInt32Number flags; // Various bit settings
649 cmsSignature manufacturer; // Device manufacturer
650 cmsUInt32Number model; // Device model number
651 cmsUInt64Number attributes; // Device attributes
652 cmsUInt32Number renderingIntent;// Rendering intent
653 cmsEncodedXYZNumber illuminant; // Profile illuminant
654 cmsSignature creator; // Profile creator
655 cmsProfileID profileID; // Profile ID using MD5
656 cmsInt8Number reserved[28]; // Reserved for future use
657
658} cmsICCHeader;
659
660// ICC base tag
661typedef struct {
662 cmsTagTypeSignature sig;
663 cmsInt8Number reserved[4];
664
665} cmsTagBase;
666
667// A tag entry in directory
668typedef struct {
669 cmsTagSignature sig; // The tag signature
670 cmsUInt32Number offset; // Start of tag
671 cmsUInt32Number size; // Size in bytes
672
673} cmsTagEntry;
674
675// ----------------------------------------------------------------------------------------------
676
677// Little CMS specific typedefs
678
679typedef void* cmsHANDLE ; // Generic handle
680typedef void* cmsHPROFILE; // Opaque typedefs to hide internals
681typedef void* cmsHTRANSFORM;
682
683#define cmsMAXCHANNELS 16 // Maximum number of channels in ICC profiles
684
685// Format of pixel is defined by one cmsUInt32Number, using bit fields as follows
686//
687// 2 1 0
688// 3 2 10987 6 5 4 3 2 1 098 7654 321
689// A O TTTTT U Y F P X S EEE CCCC BBB
690//
691// A: Floating point -- With this flag we can differentiate 16 bits as float and as int
692// O: Optimized -- previous optimization already returns the final 8-bit value
693// T: Pixeltype
694// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
695// P: Planar? 0=Chunky, 1=Planar
696// X: swap 16 bps endianness?
697// S: Do swap? ie, BGR, KYMC
698// E: Extra samples
699// C: Channels (Samples per pixel)
700// B: bytes per sample
701// Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
702
703#define FLOAT_SH(a) ((a) << 22)
704#define OPTIMIZED_SH(s) ((s) << 21)
705#define COLORSPACE_SH(s) ((s) << 16)
706#define SWAPFIRST_SH(s) ((s) << 14)
707#define FLAVOR_SH(s) ((s) << 13)
708#define PLANAR_SH(p) ((p) << 12)
709#define ENDIAN16_SH(e) ((e) << 11)
710#define DOSWAP_SH(e) ((e) << 10)
711#define EXTRA_SH(e) ((e) << 7)
712#define CHANNELS_SH(c) ((c) << 3)
713#define BYTES_SH(b) (b)
714
715// These macros unpack format specifiers into integers
716#define T_FLOAT(a) (((a)>>22)&1)
717#define T_OPTIMIZED(o) (((o)>>21)&1)
718#define T_COLORSPACE(s) (((s)>>16)&31)
719#define T_SWAPFIRST(s) (((s)>>14)&1)
720#define T_FLAVOR(s) (((s)>>13)&1)
721#define T_PLANAR(p) (((p)>>12)&1)
722#define T_ENDIAN16(e) (((e)>>11)&1)
723#define T_DOSWAP(e) (((e)>>10)&1)
724#define T_EXTRA(e) (((e)>>7)&7)
725#define T_CHANNELS(c) (((c)>>3)&15)
726#define T_BYTES(b) ((b)&7)
727
728
729// Pixel types
730#define PT_ANY 0 // Don't check colorspace
731 // 1 & 2 are reserved
732#define PT_GRAY 3
733#define PT_RGB 4
734#define PT_CMY 5
735#define PT_CMYK 6
736#define PT_YCbCr 7
737#define PT_YUV 8 // Lu'v'
738#define PT_XYZ 9
739#define PT_Lab 10
740#define PT_YUVK 11 // Lu'v'K
741#define PT_HSV 12
742#define PT_HLS 13
743#define PT_Yxy 14
744
745#define PT_MCH1 15
746#define PT_MCH2 16
747#define PT_MCH3 17
748#define PT_MCH4 18
749#define PT_MCH5 19
750#define PT_MCH6 20
751#define PT_MCH7 21
752#define PT_MCH8 22
753#define PT_MCH9 23
754#define PT_MCH10 24
755#define PT_MCH11 25
756#define PT_MCH12 26
757#define PT_MCH13 27
758#define PT_MCH14 28
759#define PT_MCH15 29
760
761#define PT_LabV2 30 // Identical to PT_Lab, but using the V2 old encoding
762
763// Some (not all!) representations
764
765#ifndef TYPE_RGB_8 // TYPE_RGB_8 is a very common identifier, so don't include ours
766 // if user has it already defined.
767
768#define TYPE_GRAY_8 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
769#define TYPE_GRAY_8_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
770#define TYPE_GRAY_16 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
771#define TYPE_GRAY_16_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
772#define TYPE_GRAY_16_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
773#define TYPE_GRAYA_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
774#define TYPE_GRAYA_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
775#define TYPE_GRAYA_16_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
776#define TYPE_GRAYA_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
777#define TYPE_GRAYA_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
778
779#define TYPE_RGB_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
780#define TYPE_RGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
781#define TYPE_BGR_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
782#define TYPE_BGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
783#define TYPE_RGB_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
784#define TYPE_RGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
785#define TYPE_RGB_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
786#define TYPE_BGR_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
787#define TYPE_BGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
788#define TYPE_BGR_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
789
790#define TYPE_RGBA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
791#define TYPE_RGBA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
792#define TYPE_RGBA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
793#define TYPE_RGBA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
794#define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
795
796#define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
797#define TYPE_ARGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))
798#define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
799
800#define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
801#define TYPE_ABGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
802#define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
803#define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
804#define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
805
806#define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
807#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))
808#define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
809#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))
810
811#define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
812#define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
813#define TYPE_CMY_16 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
814#define TYPE_CMY_16_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
815#define TYPE_CMY_16_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
816
817#define TYPE_CMYK_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
818#define TYPE_CMYKA_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))
819#define TYPE_CMYK_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
820#define TYPE_YUVK_8 TYPE_CMYK_8_REV
821#define TYPE_CMYK_8_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
822#define TYPE_CMYK_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
823#define TYPE_CMYK_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
824#define TYPE_YUVK_16 TYPE_CMYK_16_REV
825#define TYPE_CMYK_16_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
826#define TYPE_CMYK_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
827
828#define TYPE_KYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
829#define TYPE_KYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
830#define TYPE_KYMC_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
831
832#define TYPE_KCMY_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
833#define TYPE_KCMY_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
834#define TYPE_KCMY_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
835#define TYPE_KCMY_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
836#define TYPE_KCMY_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
837
838#define TYPE_CMYK5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1))
839#define TYPE_CMYK5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2))
840#define TYPE_CMYK5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
841#define TYPE_KYMC5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
842#define TYPE_KYMC5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
843#define TYPE_KYMC5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
844#define TYPE_CMYK6_8 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1))
845#define TYPE_CMYK6_8_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
846#define TYPE_CMYK6_16 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2))
847#define TYPE_CMYK6_16_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
848#define TYPE_CMYK6_16_SE (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
849#define TYPE_CMYK7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1))
850#define TYPE_CMYK7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2))
851#define TYPE_CMYK7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
852#define TYPE_KYMC7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
853#define TYPE_KYMC7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
854#define TYPE_KYMC7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
855#define TYPE_CMYK8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1))
856#define TYPE_CMYK8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2))
857#define TYPE_CMYK8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
858#define TYPE_KYMC8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
859#define TYPE_KYMC8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
860#define TYPE_KYMC8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
861#define TYPE_CMYK9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1))
862#define TYPE_CMYK9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2))
863#define TYPE_CMYK9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
864#define TYPE_KYMC9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
865#define TYPE_KYMC9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
866#define TYPE_KYMC9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
867#define TYPE_CMYK10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1))
868#define TYPE_CMYK10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2))
869#define TYPE_CMYK10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
870#define TYPE_KYMC10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
871#define TYPE_KYMC10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
872#define TYPE_KYMC10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
873#define TYPE_CMYK11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1))
874#define TYPE_CMYK11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2))
875#define TYPE_CMYK11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
876#define TYPE_KYMC11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
877#define TYPE_KYMC11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
878#define TYPE_KYMC11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
879#define TYPE_CMYK12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1))
880#define TYPE_CMYK12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2))
881#define TYPE_CMYK12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
882#define TYPE_KYMC12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
883#define TYPE_KYMC12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
884#define TYPE_KYMC12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
885
886// Colorimetric
887#define TYPE_XYZ_16 (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
888#define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
889#define TYPE_LabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1))
890
891#define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
892#define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
893#define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
894#define TYPE_LabV2_16 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2))
895#define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
896
897// YCbCr
898#define TYPE_YCbCr_8 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
899#define TYPE_YCbCr_8_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
900#define TYPE_YCbCr_16 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
901#define TYPE_YCbCr_16_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
902#define TYPE_YCbCr_16_SE (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
903
904// YUV
905#define TYPE_YUV_8 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
906#define TYPE_YUV_8_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
907#define TYPE_YUV_16 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
908#define TYPE_YUV_16_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
909#define TYPE_YUV_16_SE (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
910
911// HLS
912#define TYPE_HLS_8 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
913#define TYPE_HLS_8_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
914#define TYPE_HLS_16 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
915#define TYPE_HLS_16_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
916#define TYPE_HLS_16_SE (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
917
918// HSV
919#define TYPE_HSV_8 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
920#define TYPE_HSV_8_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
921#define TYPE_HSV_16 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
922#define TYPE_HSV_16_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
923#define TYPE_HSV_16_SE (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
924
925// Named color index. Only 16 bits allowed (don't check colorspace)
926#define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2))
927
928// Float formatters.
929#define TYPE_XYZ_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4))
930#define TYPE_Lab_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4))
931#define TYPE_LabA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
932#define TYPE_GRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4))
933#define TYPE_RGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4))
934
935#define TYPE_RGBA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
936#define TYPE_ARGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1))
937#define TYPE_BGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
938#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))
939#define TYPE_ABGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
940
941#define TYPE_CMYK_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4))
942
943// Floating point formatters.
944// NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield
945#define TYPE_XYZ_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
946#define TYPE_Lab_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
947#define TYPE_GRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
948#define TYPE_RGB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
949#define TYPE_BGR_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1))
950#define TYPE_CMYK_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
951
952// IEEE 754-2008 "half"
953#define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
954#define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
955#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
956#define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
957
958#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
959#define TYPE_ARGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
960#define TYPE_BGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
961#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))
962#define TYPE_ABGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
963
964#endif
965
966// Colorspaces
967typedef struct {
968 cmsFloat64Number X;
969 cmsFloat64Number Y;
970 cmsFloat64Number Z;
971
972 } cmsCIEXYZ;
973
974typedef struct {
975 cmsFloat64Number x;
976 cmsFloat64Number y;
977 cmsFloat64Number Y;
978
979 } cmsCIExyY;
980
981typedef struct {
982 cmsFloat64Number L;
983 cmsFloat64Number a;
984 cmsFloat64Number b;
985
986 } cmsCIELab;
987
988typedef struct {
989 cmsFloat64Number L;
990 cmsFloat64Number C;
991 cmsFloat64Number h;
992
993 } cmsCIELCh;
994
995typedef struct {
996 cmsFloat64Number J;
997 cmsFloat64Number C;
998 cmsFloat64Number h;
999
1000 } cmsJCh;
1001
1002typedef struct {
1003 cmsCIEXYZ Red;
1004 cmsCIEXYZ Green;
1005 cmsCIEXYZ Blue;
1006
1007 } cmsCIEXYZTRIPLE;
1008
1009typedef struct {
1010 cmsCIExyY Red;
1011 cmsCIExyY Green;
1012 cmsCIExyY Blue;
1013
1014 } cmsCIExyYTRIPLE;
1015
1016// Illuminant types for structs below
1017#define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000
1018#define cmsILLUMINANT_TYPE_D50 0x0000001
1019#define cmsILLUMINANT_TYPE_D65 0x0000002
1020#define cmsILLUMINANT_TYPE_D93 0x0000003
1021#define cmsILLUMINANT_TYPE_F2 0x0000004
1022#define cmsILLUMINANT_TYPE_D55 0x0000005
1023#define cmsILLUMINANT_TYPE_A 0x0000006
1024#define cmsILLUMINANT_TYPE_E 0x0000007
1025#define cmsILLUMINANT_TYPE_F8 0x0000008
1026
1027typedef struct {
1028 cmsUInt32Number Observer; // 0 = unknown, 1=CIE 1931, 2=CIE 1964
1029 cmsCIEXYZ Backing; // Value of backing
1030 cmsUInt32Number Geometry; // 0=unknown, 1=45/0, 0/45 2=0d, d/0
1031 cmsFloat64Number Flare; // 0..1.0
1032 cmsUInt32Number IlluminantType;
1033
1034 } cmsICCMeasurementConditions;
1035
1036typedef struct {
1037 cmsCIEXYZ IlluminantXYZ; // Not the same struct as CAM02,
1038 cmsCIEXYZ SurroundXYZ; // This is for storing the tag
1039 cmsUInt32Number IlluminantType; // viewing condition
1040
1041 } cmsICCViewingConditions;
1042
1043// Get LittleCMS version (for shared objects) -----------------------------------------------------------------------------
1044
1045CMSAPI int CMSEXPORT cmsGetEncodedCMMversion(void);
1046
1047// Support of non-standard functions --------------------------------------------------------------------------------------
1048
1049CMSAPI int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2);
1050CMSAPI long int CMSEXPORT cmsfilelength(FILE* f);
1051
1052
1053// Context handling --------------------------------------------------------------------------------------------------------
1054
1055// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility
1056// though using the global context is not recommended. Proper context handling makes lcms more thread-safe.
1057
1058typedef struct _cmsContext_struct* cmsContext;
1059
1060CMSAPI cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData);
1061CMSAPI void CMSEXPORT cmsDeleteContext(cmsContext ContexID);
1062CMSAPI cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData);
1063CMSAPI void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID);
1064
1065// Plug-In registering --------------------------------------------------------------------------------------------------
1066
1067CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin);
1068CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin);
1069CMSAPI void CMSEXPORT cmsUnregisterPlugins(void);
1070CMSAPI void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID);
1071
1072// Error logging ----------------------------------------------------------------------------------------------------------
1073
1074// There is no error handling at all. When a function fails, it returns proper value.
1075// For example, all create functions does return NULL on failure. Other may return FALSE.
1076// It may be interesting, for the developer, to know why the function is failing.
1077// for that reason, lcms2 does offer a logging function. This function will get
1078// an ENGLISH string with some clues on what is going wrong. You can show this
1079// info to the end user if you wish, or just create some sort of log on disk.
1080// The logging function should NOT terminate the program, as this obviously can leave
1081// unfreed resources. It is the programmer's responsibility to check each function
1082// return code to make sure it didn't fail.
1083
1084#define cmsERROR_UNDEFINED 0
1085#define cmsERROR_FILE 1
1086#define cmsERROR_RANGE 2
1087#define cmsERROR_INTERNAL 3
1088#define cmsERROR_NULL 4
1089#define cmsERROR_READ 5
1090#define cmsERROR_SEEK 6
1091#define cmsERROR_WRITE 7
1092#define cmsERROR_UNKNOWN_EXTENSION 8
1093#define cmsERROR_COLORSPACE_CHECK 9
1094#define cmsERROR_ALREADY_DEFINED 10
1095#define cmsERROR_BAD_SIGNATURE 11
1096#define cmsERROR_CORRUPTION_DETECTED 12
1097#define cmsERROR_NOT_SUITABLE 13
1098
1099// Error logger is called with the ContextID when a message is raised. This gives the
1100// chance to know which thread is responsible of the warning and any environment associated
1101// with it. Non-multithreading applications may safely ignore this parameter.
1102// Note that under certain special circumstances, ContextID may be NULL.
1103typedef void (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);
1104
1105// Allows user to set any specific logger
1106CMSAPI void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn);
1107CMSAPI void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn);
1108
1109// Conversions --------------------------------------------------------------------------------------------------------------
1110
1111// Returns pointers to constant structs
1112CMSAPI const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void);
1113CMSAPI const cmsCIExyY* CMSEXPORT cmsD50_xyY(void);
1114
1115// Colorimetric space conversions
1116CMSAPI void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source);
1117CMSAPI void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source);
1118CMSAPI void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz);
1119CMSAPI void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab);
1120CMSAPI void CMSEXPORT cmsLab2LCh(cmsCIELCh*LCh, const cmsCIELab* Lab);
1121CMSAPI void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh);
1122
1123// Encoding /Decoding on PCS
1124CMSAPI void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);
1125CMSAPI void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);
1126CMSAPI void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* Lab);
1127CMSAPI void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* Lab);
1128CMSAPI void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fxyz, const cmsUInt16Number XYZ[3]);
1129CMSAPI void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ);
1130
1131// DeltaE metrics
1132CMSAPI cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
1133CMSAPI cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
1134CMSAPI cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
1135CMSAPI cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c);
1136CMSAPI cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh);
1137
1138// Temperature <-> Chromaticity (Black body)
1139CMSAPI cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK);
1140CMSAPI cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint);
1141
1142// Chromatic adaptation
1143CMSAPI cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt,
1144 const cmsCIEXYZ* Illuminant,
1145 const cmsCIEXYZ* Value);
1146
1147// CIECAM02 ---------------------------------------------------------------------------------------------------
1148
1149// Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing
1150// conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag
1151// cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions.
1152
1153
1154#define AVG_SURROUND 1
1155#define DIM_SURROUND 2
1156#define DARK_SURROUND 3
1157#define CUTSHEET_SURROUND 4
1158
1159#define D_CALCULATE (-1)
1160
1161typedef struct {
1162 cmsCIEXYZ whitePoint;
1163 cmsFloat64Number Yb;
1164 cmsFloat64Number La;
1165 cmsUInt32Number surround;
1166 cmsFloat64Number D_value;
1167
1168 } cmsViewingConditions;
1169
1170CMSAPI cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC);
1171CMSAPI void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel);
1172CMSAPI void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut);
1173CMSAPI void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut);
1174
1175
1176// Tone curves -----------------------------------------------------------------------------------------
1177
1178// This describes a curve segment. For a table of supported types, see the manual. User can increase the number of
1179// available types by using a proper plug-in. Parametric segments allow 10 parameters at most
1180
1181typedef struct {
1182 cmsFloat32Number x0, x1; // Domain; for x0 < x <= x1
1183 cmsInt32Number Type; // Parametric type, Type == 0 means sampled segment. Negative values are reserved
1184 cmsFloat64Number Params[10]; // Parameters if Type != 0
1185 cmsUInt32Number nGridPoints; // Number of grid points if Type == 0
1186 cmsFloat32Number* SampledPoints; // Points to an array of floats if Type == 0
1187
1188} cmsCurveSegment;
1189
1190// The internal representation is none of your business.
1191typedef struct _cms_curve_struct cmsToneCurve;
1192
1193CMSAPI cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsUInt32Number nSegments, const cmsCurveSegment Segments[]);
1194CMSAPI cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]);
1195CMSAPI cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma);
1196CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsUInt32Number nEntries, const cmsUInt16Number values[]);
1197CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]);
1198CMSAPI void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve);
1199CMSAPI void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]);
1200CMSAPI cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* Src);
1201CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma);
1202CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsUInt32Number nResultSamples, const cmsToneCurve* InGamma);
1203CMSAPI cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X, const cmsToneCurve* Y, cmsUInt32Number nPoints);
1204CMSAPI cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda);
1205CMSAPI cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v);
1206CMSAPI cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v);
1207CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* InGamma);
1208CMSAPI cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve);
1209CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t);
1210CMSAPI cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t);
1211CMSAPI cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t);
1212CMSAPI cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision);
1213
1214// Tone curve tabular estimation
1215CMSAPI cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t);
1216CMSAPI const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t);
1217
1218
1219// Implements pipelines of multi-processing elements -------------------------------------------------------------
1220
1221// Nothing to see here, move along
1222typedef struct _cmsPipeline_struct cmsPipeline;
1223typedef struct _cmsStage_struct cmsStage;
1224
1225// Those are hi-level pipelines
1226CMSAPI cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels);
1227CMSAPI void CMSEXPORT cmsPipelineFree(cmsPipeline* lut);
1228CMSAPI cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig);
1229
1230CMSAPI cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut);
1231CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut);
1232CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut);
1233
1234CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut);
1235CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut);
1236CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut);
1237
1238CMSAPI void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut);
1239CMSAPI void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut);
1240CMSAPI cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut);
1241CMSAPI cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2);
1242CMSAPI cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On);
1243
1244// Where to place/locate the stages in the pipeline chain
1245typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc;
1246
1247CMSAPI cmsBool CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
1248CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe);
1249
1250// This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements
1251// that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and
1252// then a list of expected types followed with a list of double pointers to Stage elements. If
1253// the function founds a match with current pipeline, it fills the pointers and returns TRUE
1254// if not, returns FALSE without touching anything.
1255CMSAPI cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...);
1256
1257// Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode
1258// matrices with far more precision that CLUTS
1259CMSAPI cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels);
1260CMSAPI cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]);
1261CMSAPI cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset);
1262
1263CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);
1264CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);
1265
1266CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);
1267CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);
1268
1269CMSAPI cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe);
1270CMSAPI void CMSEXPORT cmsStageFree(cmsStage* mpe);
1271CMSAPI cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe);
1272
1273CMSAPI cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe);
1274CMSAPI cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe);
1275CMSAPI cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe);
1276CMSAPI void* CMSEXPORT cmsStageData(const cmsStage* mpe);
1277
1278// Sampling
1279typedef cmsInt32Number (* cmsSAMPLER16) (register const cmsUInt16Number In[],
1280 register cmsUInt16Number Out[],
1281 register void * Cargo);
1282
1283typedef cmsInt32Number (* cmsSAMPLERFLOAT)(register const cmsFloat32Number In[],
1284 register cmsFloat32Number Out[],
1285 register void * Cargo);
1286
1287// Use this flag to prevent changes being written to destination
1288#define SAMPLER_INSPECT 0x01000000
1289
1290// For CLUT only
1291CMSAPI cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags);
1292CMSAPI cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags);
1293
1294// Slicers
1295CMSAPI cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
1296 cmsSAMPLER16 Sampler, void * Cargo);
1297
1298CMSAPI cmsBool CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
1299 cmsSAMPLERFLOAT Sampler, void * Cargo);
1300
1301// Multilocalized Unicode management ---------------------------------------------------------------------------------------
1302
1303typedef struct _cms_MLU_struct cmsMLU;
1304
1305#define cmsNoLanguage "\0\0"
1306#define cmsNoCountry "\0\0"
1307
1308CMSAPI cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems);
1309CMSAPI void CMSEXPORT cmsMLUfree(cmsMLU* mlu);
1310CMSAPI cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu);
1311
1312CMSAPI cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu,
1313 const char LanguageCode[3], const char CountryCode[3],
1314 const char* ASCIIString);
1315CMSAPI cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu,
1316 const char LanguageCode[3], const char CountryCode[3],
1317 const wchar_t* WideString);
1318
1319CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,
1320 const char LanguageCode[3], const char CountryCode[3],
1321 char* Buffer, cmsUInt32Number BufferSize);
1322
1323CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu,
1324 const char LanguageCode[3], const char CountryCode[3],
1325 wchar_t* Buffer, cmsUInt32Number BufferSize);
1326
1327CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu,
1328 const char LanguageCode[3], const char CountryCode[3],
1329 char ObtainedLanguage[3], char ObtainedCountry[3]);
1330
1331CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu);
1332
1333CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
1334 cmsUInt32Number idx,
1335 char LanguageCode[3],
1336 char CountryCode[3]);
1337
1338// Undercolorremoval & black generation -------------------------------------------------------------------------------------
1339
1340typedef struct {
1341 cmsToneCurve* Ucr;
1342 cmsToneCurve* Bg;
1343 cmsMLU* Desc;
1344
1345} cmsUcrBg;
1346
1347// Screening ----------------------------------------------------------------------------------------------------------------
1348
1349#define cmsPRINTER_DEFAULT_SCREENS 0x0001
1350#define cmsFREQUENCE_UNITS_LINES_CM 0x0000
1351#define cmsFREQUENCE_UNITS_LINES_INCH 0x0002
1352
1353#define cmsSPOT_UNKNOWN 0
1354#define cmsSPOT_PRINTER_DEFAULT 1
1355#define cmsSPOT_ROUND 2
1356#define cmsSPOT_DIAMOND 3
1357#define cmsSPOT_ELLIPSE 4
1358#define cmsSPOT_LINE 5
1359#define cmsSPOT_SQUARE 6
1360#define cmsSPOT_CROSS 7
1361
1362typedef struct {
1363 cmsFloat64Number Frequency;
1364 cmsFloat64Number ScreenAngle;
1365 cmsUInt32Number SpotShape;
1366
1367} cmsScreeningChannel;
1368
1369typedef struct {
1370 cmsUInt32Number Flag;
1371 cmsUInt32Number nChannels;
1372 cmsScreeningChannel Channels[cmsMAXCHANNELS];
1373
1374} cmsScreening;
1375
1376
1377// Named color -----------------------------------------------------------------------------------------------------------------
1378
1379typedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST;
1380
1381CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID,
1382 cmsUInt32Number n,
1383 cmsUInt32Number ColorantCount,
1384 const char* Prefix, const char* Suffix);
1385
1386CMSAPI void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v);
1387CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v);
1388CMSAPI cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* v, const char* Name,
1389 cmsUInt16Number PCS[3],
1390 cmsUInt16Number Colorant[cmsMAXCHANNELS]);
1391
1392CMSAPI cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* v);
1393CMSAPI cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* v, const char* Name);
1394
1395CMSAPI cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor,
1396 char* Name,
1397 char* Prefix,
1398 char* Suffix,
1399 cmsUInt16Number* PCS,
1400 cmsUInt16Number* Colorant);
1401
1402// Retrieve named color list from transform
1403CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform);
1404
1405// Profile sequence -----------------------------------------------------------------------------------------------------
1406
1407// Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others
1408// come from Profile Sequence Identifier Tag
1409typedef struct {
1410
1411 cmsSignature deviceMfg;
1412 cmsSignature deviceModel;
1413 cmsUInt64Number attributes;
1414 cmsTechnologySignature technology;
1415 cmsProfileID ProfileID;
1416 cmsMLU* Manufacturer;
1417 cmsMLU* Model;
1418 cmsMLU* Description;
1419
1420} cmsPSEQDESC;
1421
1422typedef struct {
1423
1424 cmsUInt32Number n;
1425 cmsContext ContextID;
1426 cmsPSEQDESC* seq;
1427
1428} cmsSEQ;
1429
1430CMSAPI cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n);
1431CMSAPI cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq);
1432CMSAPI void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq);
1433
1434// Dictionaries --------------------------------------------------------------------------------------------------------
1435
1436typedef struct _cmsDICTentry_struct {
1437
1438 struct _cmsDICTentry_struct* Next;
1439
1440 cmsMLU *DisplayName;
1441 cmsMLU *DisplayValue;
1442 wchar_t* Name;
1443 wchar_t* Value;
1444
1445} cmsDICTentry;
1446
1447CMSAPI cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID);
1448CMSAPI void CMSEXPORT cmsDictFree(cmsHANDLE hDict);
1449CMSAPI cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict);
1450
1451CMSAPI cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue);
1452CMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict);
1453CMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e);
1454
1455// Access to Profile data ----------------------------------------------------------------------------------------------
1456CMSAPI cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID);
1457
1458CMSAPI cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile);
1459CMSAPI cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile);
1460CMSAPI cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n);
1461CMSAPI cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig);
1462
1463// Read and write pre-formatted data
1464CMSAPI void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig);
1465CMSAPI cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data);
1466CMSAPI cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest);
1467CMSAPI cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig);
1468
1469// Read and write raw data
1470CMSAPI cmsUInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize);
1471CMSAPI cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size);
1472
1473// Access header data
1474#define cmsEmbeddedProfileFalse 0x00000000
1475#define cmsEmbeddedProfileTrue 0x00000001
1476#define cmsUseAnywhere 0x00000000
1477#define cmsUseWithEmbeddedDataOnly 0x00000002
1478
1479CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile);
1480CMSAPI void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags);
1481CMSAPI void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);
1482CMSAPI cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest);
1483CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile);
1484
1485CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags);
1486CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile);
1487CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer);
1488CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile);
1489CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile);
1490CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model);
1491CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags);
1492CMSAPI void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);
1493CMSAPI void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent);
1494
1495CMSAPI cmsColorSpaceSignature
1496 CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
1497CMSAPI void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs);
1498CMSAPI cmsColorSpaceSignature
1499 CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
1500CMSAPI void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig);
1501CMSAPI cmsProfileClassSignature
1502 CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);
1503CMSAPI void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig);
1504CMSAPI void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version);
1505CMSAPI cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile);
1506
1507CMSAPI cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile);
1508CMSAPI void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version);
1509
1510// How profiles may be used
1511#define LCMS_USED_AS_INPUT 0
1512#define LCMS_USED_AS_OUTPUT 1
1513#define LCMS_USED_AS_PROOF 2
1514
1515CMSAPI cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);
1516CMSAPI cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile);
1517CMSAPI cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);
1518
1519// Translate form/to our notation to ICC
1520CMSAPI cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation);
1521CMSAPI int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace);
1522
1523CMSAPI cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace);
1524
1525// Build a suitable formatter for the colorspace of this profile. nBytes=1 means 8 bits, nBytes=2 means 16 bits.
1526CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
1527CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
1528
1529
1530// Localized info
1531typedef enum {
1532 cmsInfoDescription = 0,
1533 cmsInfoManufacturer = 1,
1534 cmsInfoModel = 2,
1535 cmsInfoCopyright = 3
1536} cmsInfoType;
1537
1538CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info,
1539 const char LanguageCode[3], const char CountryCode[3],
1540 wchar_t* Buffer, cmsUInt32Number BufferSize);
1541
1542CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info,
1543 const char LanguageCode[3], const char CountryCode[3],
1544 char* Buffer, cmsUInt32Number BufferSize);
1545
1546// IO handlers ----------------------------------------------------------------------------------------------------------
1547
1548typedef struct _cms_io_handler cmsIOHANDLER;
1549
1550CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode);
1551CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream);
1552CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode);
1553CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID);
1554CMSAPI cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile);
1555CMSAPI cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io);
1556
1557// MD5 message digest --------------------------------------------------------------------------------------------------
1558
1559CMSAPI cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile);
1560
1561// Profile high level functions ------------------------------------------------------------------------------------------
1562
1563CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
1564CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *ICCProfile, const char *sAccess);
1565CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess);
1566CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char* sAccess);
1567CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void * MemPtr, cmsUInt32Number dwSize);
1568CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void * MemPtr, cmsUInt32Number dwSize);
1569CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io);
1570CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write);
1571CMSAPI cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
1572
1573CMSAPI cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName);
1574CMSAPI cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream);
1575CMSAPI cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded);
1576CMSAPI cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io);
1577
1578// Predefined virtual profiles ------------------------------------------------------------------------------------------
1579
1580CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,
1581 const cmsCIExyY* WhitePoint,
1582 const cmsCIExyYTRIPLE* Primaries,
1583 cmsToneCurve* const TransferFunction[3]);
1584
1585CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint,
1586 const cmsCIExyYTRIPLE* Primaries,
1587 cmsToneCurve* const TransferFunction[3]);
1588
1589CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,
1590 const cmsCIExyY* WhitePoint,
1591 const cmsToneCurve* TransferFunction);
1592
1593CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint,
1594 const cmsToneCurve* TransferFunction);
1595
1596CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,
1597 cmsColorSpaceSignature ColorSpace,
1598 cmsToneCurve* const TransferFunctions[]);
1599
1600CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace,
1601 cmsToneCurve* const TransferFunctions[]);
1602
1603CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,
1604 cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);
1605
1606CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);
1607
1608
1609CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);
1610CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint);
1611CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);
1612CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint);
1613
1614CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID);
1615CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void);
1616
1617CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID);
1618CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void);
1619
1620CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
1621 cmsUInt32Number nLUTPoints,
1622 cmsFloat64Number Bright,
1623 cmsFloat64Number Contrast,
1624 cmsFloat64Number Hue,
1625 cmsFloat64Number Saturation,
1626 cmsUInt32Number TempSrc,
1627 cmsUInt32Number TempDest);
1628
1629CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(cmsUInt32Number nLUTPoints,
1630 cmsFloat64Number Bright,
1631 cmsFloat64Number Contrast,
1632 cmsFloat64Number Hue,
1633 cmsFloat64Number Saturation,
1634 cmsUInt32Number TempSrc,
1635 cmsUInt32Number TempDest);
1636
1637CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID);
1638CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void);
1639
1640// Converts a transform to a devicelink profile
1641CMSAPI cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags);
1642
1643// Intents ----------------------------------------------------------------------------------------------
1644
1645// ICC Intents
1646#define INTENT_PERCEPTUAL 0
1647#define INTENT_RELATIVE_COLORIMETRIC 1
1648#define INTENT_SATURATION 2
1649#define INTENT_ABSOLUTE_COLORIMETRIC 3
1650
1651// Non-ICC intents
1652#define INTENT_PRESERVE_K_ONLY_PERCEPTUAL 10
1653#define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC 11
1654#define INTENT_PRESERVE_K_ONLY_SATURATION 12
1655#define INTENT_PRESERVE_K_PLANE_PERCEPTUAL 13
1656#define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14
1657#define INTENT_PRESERVE_K_PLANE_SATURATION 15
1658
1659// Call with NULL as parameters to get the intent count
1660CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);
1661CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);
1662
1663// Flags
1664
1665#define cmsFLAGS_NOCACHE 0x0040 // Inhibit 1-pixel cache
1666#define cmsFLAGS_NOOPTIMIZE 0x0100 // Inhibit optimizations
1667#define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway
1668
1669// Proofing flags
1670#define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm
1671#define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing
1672
1673// Misc
1674#define cmsFLAGS_BLACKPOINTCOMPENSATION 0x2000
1675#define cmsFLAGS_NOWHITEONWHITEFIXUP 0x0004 // Don't fix scum dot
1676#define cmsFLAGS_HIGHRESPRECALC 0x0400 // Use more memory to give better accurancy
1677#define cmsFLAGS_LOWRESPRECALC 0x0800 // Use less memory to minimize resources
1678
1679// For devicelink creation
1680#define cmsFLAGS_8BITS_DEVICELINK 0x0008 // Create 8 bits devicelinks
1681#define cmsFLAGS_GUESSDEVICECLASS 0x0020 // Guess device class (for transform2devicelink)
1682#define cmsFLAGS_KEEP_SEQUENCE 0x0080 // Keep profile sequence for devicelink creation
1683
1684// Specific to a particular optimizations
1685#define cmsFLAGS_FORCE_CLUT 0x0002 // Force CLUT optimization
1686#define cmsFLAGS_CLUT_POST_LINEARIZATION 0x0001 // create postlinearization tables if possible
1687#define cmsFLAGS_CLUT_PRE_LINEARIZATION 0x0010 // create prelinearization tables if possible
1688
1689// Specific to unbounded mode
1690#define cmsFLAGS_NONEGATIVES 0x8000 // Prevent negative numbers in floating point transforms
1691
1692// Copy alpha channels when transforming
1693#define cmsFLAGS_COPY_ALPHA 0x04000000 // Alpha channels are copied on cmsDoTransform()
1694
1695// Fine-tune control over number of gridpoints
1696#define cmsFLAGS_GRIDPOINTS(n) (((n) & 0xFF) << 16)
1697
1698// CRD special
1699#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000
1700
1701// Transforms ---------------------------------------------------------------------------------------------------
1702
1703CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID,
1704 cmsHPROFILE Input,
1705 cmsUInt32Number InputFormat,
1706 cmsHPROFILE Output,
1707 cmsUInt32Number OutputFormat,
1708 cmsUInt32Number Intent,
1709 cmsUInt32Number dwFlags);
1710
1711CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
1712 cmsUInt32Number InputFormat,
1713 cmsHPROFILE Output,
1714 cmsUInt32Number OutputFormat,
1715 cmsUInt32Number Intent,
1716 cmsUInt32Number dwFlags);
1717
1718CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,
1719 cmsHPROFILE Input,
1720 cmsUInt32Number InputFormat,
1721 cmsHPROFILE Output,
1722 cmsUInt32Number OutputFormat,
1723 cmsHPROFILE Proofing,
1724 cmsUInt32Number Intent,
1725 cmsUInt32Number ProofingIntent,
1726 cmsUInt32Number dwFlags);
1727
1728CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,
1729 cmsUInt32Number InputFormat,
1730 cmsHPROFILE Output,
1731 cmsUInt32Number OutputFormat,
1732 cmsHPROFILE Proofing,
1733 cmsUInt32Number Intent,
1734 cmsUInt32Number ProofingIntent,
1735 cmsUInt32Number dwFlags);
1736
1737CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,
1738 cmsHPROFILE hProfiles[],
1739 cmsUInt32Number nProfiles,
1740 cmsUInt32Number InputFormat,
1741 cmsUInt32Number OutputFormat,
1742 cmsUInt32Number Intent,
1743 cmsUInt32Number dwFlags);
1744
1745
1746CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
1747 cmsUInt32Number nProfiles,
1748 cmsUInt32Number InputFormat,
1749 cmsUInt32Number OutputFormat,
1750 cmsUInt32Number Intent,
1751 cmsUInt32Number dwFlags);
1752
1753
1754CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
1755 cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
1756 cmsBool BPC[],
1757 cmsUInt32Number Intents[],
1758 cmsFloat64Number AdaptationStates[],
1759 cmsHPROFILE hGamutProfile,
1760 cmsUInt32Number nGamutPCSposition,
1761 cmsUInt32Number InputFormat,
1762 cmsUInt32Number OutputFormat,
1763 cmsUInt32Number dwFlags);
1764
1765CMSAPI void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);
1766
1767CMSAPI void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
1768 const void * InputBuffer,
1769 void * OutputBuffer,
1770 cmsUInt32Number Size);
1771
1772CMSAPI void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, // Deprecated
1773 const void * InputBuffer,
1774 void * OutputBuffer,
1775 cmsUInt32Number Size,
1776 cmsUInt32Number Stride);
1777
1778CMSAPI void CMSEXPORT cmsDoTransformLineStride(cmsHTRANSFORM Transform,
1779 const void* InputBuffer,
1780 void* OutputBuffer,
1781 cmsUInt32Number PixelsPerLine,
1782 cmsUInt32Number LineCount,
1783 cmsUInt32Number BytesPerLineIn,
1784 cmsUInt32Number BytesPerLineOut,
1785 cmsUInt32Number BytesPerPlaneIn,
1786 cmsUInt32Number BytesPerPlaneOut);
1787
1788
1789CMSAPI void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);
1790CMSAPI void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);
1791
1792
1793CMSAPI void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID,
1794 const cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);
1795CMSAPI void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID,
1796 cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);
1797
1798
1799
1800// Adaptation state for absolute colorimetric intent
1801CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d);
1802CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d);
1803
1804
1805
1806// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed
1807CMSAPI cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform);
1808
1809// Grab the input/output formats
1810CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform);
1811CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform);
1812
1813// For backwards compatibility
1814CMSAPI cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,
1815 cmsUInt32Number InputFormat,
1816 cmsUInt32Number OutputFormat);
1817
1818
1819
1820// PostScript ColorRenderingDictionary and ColorSpaceArray ----------------------------------------------------
1821
1822typedef enum { cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD } cmsPSResourceType;
1823
1824// lcms2 unified method to access postscript color resources
1825CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,
1826 cmsPSResourceType Type,
1827 cmsHPROFILE hProfile,
1828 cmsUInt32Number Intent,
1829 cmsUInt32Number dwFlags,
1830 cmsIOHANDLER* io);
1831
1832CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);
1833CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);
1834
1835
1836// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
1837
1838CMSAPI cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID);
1839CMSAPI void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8);
1840
1841// Tables
1842CMSAPI cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8);
1843CMSAPI cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE hIT8, cmsUInt32Number nTable);
1844
1845// Persistence
1846CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName);
1847CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, const void *Ptr, cmsUInt32Number len);
1848// CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io);
1849
1850CMSAPI cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName);
1851CMSAPI cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded);
1852
1853// Properties
1854CMSAPI const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8);
1855CMSAPI cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type);
1856
1857CMSAPI cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* cComment);
1858
1859CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str);
1860CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val);
1861CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val);
1862CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer);
1863CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer);
1864
1865
1866CMSAPI const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp);
1867CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp);
1868CMSAPI const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey);
1869CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames);
1870CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames);
1871
1872// Datasets
1873CMSAPI const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col);
1874CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col);
1875
1876CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col,
1877 const char* Val);
1878
1879CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col,
1880 cmsFloat64Number Val);
1881
1882CMSAPI const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample);
1883
1884
1885CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample);
1886
1887CMSAPI cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch,
1888 const char* cSample,
1889 const char *Val);
1890
1891CMSAPI cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch,
1892 const char* cSample,
1893 cmsFloat64Number Val);
1894
1895CMSAPI int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample);
1896CMSAPI cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, const char *Sample);
1897CMSAPI int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames);
1898
1899CMSAPI const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer);
1900CMSAPI int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch);
1901
1902// The LABEL extension
1903CMSAPI int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
1904
1905CMSAPI cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample);
1906
1907// Formatter for double
1908CMSAPI void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter);
1909
1910// Gamut boundary description routines ------------------------------------------------------------------------------
1911
1912CMSAPI cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID);
1913CMSAPI void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD);
1914CMSAPI cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);
1915CMSAPI cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGDB, cmsUInt32Number dwFlags);
1916CMSAPI cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);
1917
1918// Feature detection ----------------------------------------------------------------------------------------------
1919
1920// Estimate the black point
1921CMSAPI cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);
1922CMSAPI cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);
1923
1924// Estimate total area coverage
1925CMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile);
1926
1927
1928// Poor man's gamut mapping
1929CMSAPI cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,
1930 double amax, double amin,
1931 double bmax, double bmin);
1932
1933#ifndef CMS_USE_CPP_API
1934# ifdef __cplusplus
1935 }
1936# endif
1937#endif
1938
1939#define _lcms2_H
1940#endif
1941