2
Little cms - profiler construction set
3
Copyright (C) 1998-2001 Marti Maria <marti@littlecms.com>
5
THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
6
EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
7
WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
9
IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
10
INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
11
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
12
WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
13
LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
16
This file is free software; you can redistribute it and/or modify it
17
under the terms of the GNU General Public License as published by
18
the Free Software Foundation; either version 2 of the License, or
19
(at your option) any later version.
21
This program is distributed in the hope that it will be useful, but
22
WITHOUT ANY WARRANTY; without even the implied warranty of
23
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24
General Public License for more details.
26
You should have received a copy of the GNU General Public License
27
along with this program; if not, write to the Free Software
28
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
30
As a special exception to the GNU General Public License, if you
31
distribute this file as part of a program that contains a
32
configuration script generated by Autoconf, you may include it under
33
the same distribution terms that you use for the rest of that program.
61
# define stricmp strcasecmp
66
#define max(a,b) ((a) > (b)?(a):(b))
69
// See B.K.O #148930: compile with lcms v.1.17
70
#if (LCMS_VERSION > 116)
71
typedef LCMSBOOL BOOL;
75
/* Matrix operations - arbitrary size ----------------------------------------------------- */
85
LPMATN cdecl MATNalloc(int Rows, int Cols);
86
void cdecl MATNfree (LPMATN mat);
87
LPMATN cdecl MATNmult(LPMATN a1, LPMATN a2);
88
double cdecl MATNcross(LPMATN a);
89
void cdecl MATNscalar (LPMATN a, double scl, LPMATN b);
90
LPMATN cdecl MATNtranspose (LPMATN a);
91
BOOL cdecl MATNsolve(LPMATN a, LPMATN b);
94
/* IT8.7 / CGATS.17-200x handling -------------------------------------------------------- */
96
#define cmsxIT8_ROWS 12
97
#define cmsxIT8_COLS 22
98
#define cmsxIT8_GRAYCOLS 24
99
#define cmsxIT8_NORMAL_PATCHES (cmsxIT8_ROWS*cmsxIT8_COLS + cmsxIT8_GRAYCOLS)
100
#define cmsxIT8_CUSTOM_PATCHES 10
101
#define cmsxIT8_TOTAL_PATCHES (cmsxIT8_NORMAL_PATCHES + cmsxIT8_CUSTOM_PATCHES)
104
LCMSHANDLE cdecl cmsxIT8Alloc(void);
105
void cdecl cmsxIT8Free(LCMSHANDLE cmsxIT8);
106
LCMSHANDLE cdecl cmsxIT8LoadFromFile(const char* cFileName);
107
LCMSHANDLE cdecl cmsxIT8LoadFromMem(void *Ptr, size_t len);
108
BOOL cdecl cmsxIT8SaveToFile(LCMSHANDLE cmsxIT8, const char* cFileName);
109
const char* cdecl cmsxIT8GetSheetType(LCMSHANDLE hIT8);
110
BOOL cdecl cmsxIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
111
const char* cdecl cmsxIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
112
BOOL cdecl cmsxIT8SetProperty(LCMSHANDLE hcmsxIT8, const char* cProp, const char *Str);
113
BOOL cdecl cmsxIT8SetPropertyDbl(LCMSHANDLE hcmsxIT8, const char* cProp, double Val);
114
const char* cdecl cmsxIT8GetProperty(LCMSHANDLE hcmsxIT8, const char* cProp);
115
double cdecl cmsxIT8GetPropertyDbl(LCMSHANDLE hcmsxIT8, const char* cProp);
116
int cdecl cmsxIT8EnumProperties(LCMSHANDLE cmsxIT8, char ***PropertyNames);
117
int cdecl cmsxIT8EnumDataFormat(LCMSHANDLE cmsxIT8, char ***SampleNames);
118
BOOL cdecl cmsxIT8SetDataFormat(LCMSHANDLE cmsxIT8, int n, const char *Sample);
119
BOOL cdecl cmsxIT8GetDataSetByPos(LCMSHANDLE IT8, int col, int row, char* Val, int ValBufferLen);
120
BOOL cdecl cmsxIT8GetDataSet(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, char* Val, int ValBuffLen);
121
BOOL cdecl cmsxIT8GetDataSetDbl(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, double* v);
122
BOOL cdecl cmsxIT8SetDataSet(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, char *Val);
123
BOOL cdecl cmsxIT8SetDataSetDbl(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, double Val);
124
const char *cdecl cmsxIT8GenericPatchName(int nPatch, char* buffer);
127
/* Patch collections (measurement lists) -------------------------------------------------- */
129
#define PATCH_HAS_Lab 0x00000001
130
#define PATCH_HAS_XYZ 0x00000002
131
#define PATCH_HAS_RGB 0x00000004
132
#define PATCH_HAS_CMY 0x00000008
133
#define PATCH_HAS_CMYK 0x00000010
134
#define PATCH_HAS_HEXACRM 0x00000020
135
#define PATCH_HAS_STD_Lab 0x00010000
136
#define PATCH_HAS_STD_XYZ 0x00020000
137
#define PATCH_HAS_XYZ_PROOF 0x00100000
138
#define PATCH_HAS_MEAN_DE 0x01000000
139
#define PATCH_HAS_STD_DE 0x02000000
140
#define PATCH_HAS_CHISQ 0x04000000
143
#define MAXPATCHNAMELEN 20
145
/* A patch in memory */
150
DWORD dwFlags; /* Is quite possible to have colorant in only */
151
/* some patches of sheet, so mark each entry with */
152
/* the values it has. */
154
char Name[MAXPATCHNAMELEN];
156
cmsCIELab Lab; /* The tristimulus values of target */
159
cmsCIEXYZ XYZProof; /* The absolute XYZ value returned by profile */
160
/* (gamut constrained to device) */
162
union { /* The possible colorants. Only one space is */
163
/* allowed...obviously only one set of */
164
/* device-dependent values per patch does make sense. */
168
double Hexa[MAXCHANNELS];
172
double dEStd; /* Standard deviation */
173
double ChiSq; /* Chi-square parameter (mean of STD of colorants) */
174
double dEMean; /* Mean dE */
176
} PATCH, FAR* LPPATCH;
180
/* A set of patches is simply an array of bools, TRUE if the patch */
181
/* belong to the set, false otherwise. */
183
typedef BOOL* SETOFPATCHES;
185
/* This struct holds whole Patches collection */
187
typedef struct _measurement
192
SETOFPATCHES Allowed;
194
} MEASUREMENT,FAR *LPMEASUREMENT;
197
void cdecl cmsxPCollFreeMeasurements(LPMEASUREMENT m);
198
SETOFPATCHES cdecl cmsxPCollBuildSet(LPMEASUREMENT m, BOOL lDefault);
200
BOOL cdecl cmsxPCollBuildMeasurement(LPMEASUREMENT m, const char *ReferenceSheet,
201
const char *MeasurementSheet, DWORD dwNeededSamplesType);
203
int cdecl cmsxPCollCountSet(LPMEASUREMENT m, SETOFPATCHES Set);
204
BOOL cdecl cmsxPCollValidatePatches(LPMEASUREMENT m, DWORD dwFlags);
206
BOOL cdecl cmsxPCollLoadFromSheet(LPMEASUREMENT m, LCMSHANDLE hSheet);
207
BOOL cdecl cmsxPCollSaveToSheet(LPMEASUREMENT m, LCMSHANDLE it8);
209
LPPATCH cdecl cmsxPCollGetPatch(LPMEASUREMENT m, int n);
210
LPPATCH cdecl cmsxPCollGetPatchByName(LPMEASUREMENT m, const char* Name, int* lpPos);
211
LPPATCH cdecl cmsxPCollGetPatchByPos(LPMEASUREMENT m, int row, int col);
212
LPPATCH cdecl cmsxPCollAddPatchRGB(LPMEASUREMENT m, const char *Name,
213
double r, double g, double b,
214
LPcmsCIEXYZ XYZ, LPcmsCIELab Lab);
216
void cdecl cmsxPCollLinearizePatches(LPMEASUREMENT m, SETOFPATCHES Valids, LPGAMMATABLE Gamma[3]);
218
/* Extraction utilities */
220
/* Collect "need" patches of the specific kind, return the number of collected (that */
221
/* could be less if set of patches is exhausted) */
223
void cdecl cmsxPCollPatchesGS(LPMEASUREMENT m, SETOFPATCHES Result);
225
int cdecl cmsxPCollPatchesNearRGB(LPMEASUREMENT m, SETOFPATCHES Valids,
226
double r, double g, double b, int need, SETOFPATCHES Result);
228
int cdecl cmsxPCollPatchesNearNeutral(LPMEASUREMENT m, SETOFPATCHES Valids,
229
int need, SETOFPATCHES Result);
231
int cdecl cmsxPCollPatchesNearPrimary(LPMEASUREMENT m, SETOFPATCHES Valids,
232
int nChannel, int need, SETOFPATCHES Result);
234
int cdecl cmsxPCollPatchesInLabCube(LPMEASUREMENT m, SETOFPATCHES Valids,
235
double Lmin, double LMax, double a, double b, SETOFPATCHES Result);
237
int cdecl cmsxPCollPatchesInGamutLUT(LPMEASUREMENT m, SETOFPATCHES Valids,
238
LPLUT Gamut, SETOFPATCHES Result);
240
/* Find important values */
242
LPPATCH cdecl cmsxPCollFindWhite(LPMEASUREMENT m, SETOFPATCHES Valids, double* Distance);
243
LPPATCH cdecl cmsxPCollFindBlack(LPMEASUREMENT m, SETOFPATCHES Valids, double* Distance);
244
LPPATCH cdecl cmsxPCollFindPrimary(LPMEASUREMENT m, SETOFPATCHES Valids, int Channel, double* Distance);
246
/* Multiple linear regression stuff ---------------------------------------- */
249
/* A measurement of error */
254
double SSE; /* The error sum of squares */
255
double MSE; /* The error mean sum of squares */
256
double SSR; /* The regression sum of squares */
257
double MSR; /* The regression mean sum of squares */
258
double SSTO; /* Total sum of squares */
259
double F; /* The Fisher-F value (MSR / MSE) */
260
double R2; /* Proportion of variability explained by the regression */
261
/* (root is Pearson correlation coefficient) */
263
double R2adj; /* The adjusted coefficient of multiple determination. */
264
/* R2-adjusted or R2adj. This is calculated as */
265
/* R2adj = 1 - (1-R2)(N-n-1)/(N-1) */
266
/* and used as multiple correlation coefficient */
267
/* (really, it should be square root) */
269
} MLRSTATISTICS, FAR* LPMLRSTATISTICS;
272
int cdecl cmsxRegressionCreateMatrix(LPMEASUREMENT m, SETOFPATCHES Allowed, int nterms,
274
LPMATN* lpMat, LPMLRSTATISTICS Stat);
276
BOOL cdecl cmsxRegressionRGB2Lab(double r, double g, double b,
277
LPMATN tfm, LPcmsCIELab Lab);
279
BOOL cdecl cmsxRegressionRGB2XYZ(double r, double g, double b,
280
LPMATN tfm, LPcmsCIEXYZ XYZ);
282
BOOL cdecl cmsxRegressionInterpolatorRGB(LPMEASUREMENT m,
285
BOOL lUseLocalPatches,
286
int MinPatchesToCollect,
287
double r, double g, double b,
291
/* Levenberg-Marquardt ---------------------------------------------------------------------- */
293
LCMSHANDLE cdecl cmsxLevenbergMarquardtInit(LPSAMPLEDCURVE x, LPSAMPLEDCURVE y, double sig,
295
void (*funcs)(double, double[], double*, double[], int));
297
double cdecl cmsxLevenbergMarquardtAlamda(LCMSHANDLE hMRQ);
298
double cdecl cmsxLevenbergMarquardtChiSq(LCMSHANDLE hMRQ);
299
BOOL cdecl cmsxLevenbergMarquardtIterate(LCMSHANDLE hMRQ);
300
BOOL cdecl cmsxLevenbergMarquardtFree(LCMSHANDLE hMRQ);
303
/* Convex hull geometric routines ------------------------------------------------------------ */
305
LCMSHANDLE cdecl cmsxHullInit(void);
306
void cdecl cmsxHullDone(LCMSHANDLE hHull);
307
BOOL cdecl cmsxHullAddPoint(LCMSHANDLE hHull, int x, int y, int z);
308
BOOL cdecl cmsxHullComputeHull(LCMSHANDLE hHull);
309
char cdecl cmsxHullCheckpoint(LCMSHANDLE hHull, int x, int y, int z);
310
BOOL cdecl cmsxHullDumpVRML(LCMSHANDLE hHull, const char* fname);
313
/* Linearization ---------------------------------------------------------------------------- */
316
#define MEDIUM_REFLECTIVE_D50 0 /* Used for scanner targets */
317
#define MEDIUM_TRANSMISSIVE 1 /* Used for monitors & projectors */
319
void cdecl cmsxComputeLinearizationTables(LPMEASUREMENT m, int ColorSpace,
320
LPGAMMATABLE Lin[3], int nResultingPoints, int Medium);
322
void cdecl cmsxCompleteLabOfPatches(LPMEASUREMENT m, SETOFPATCHES Valids, int Medium);
323
LPGAMMATABLE cdecl cmsxEstimateGamma(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
325
void cdecl cmsxApplyLinearizationTable(double In[3], LPGAMMATABLE Gamma[3], double Out[3]);
326
void cdecl cmsxApplyLinearizationGamma(WORD In[3], LPGAMMATABLE Gamma[3], WORD Out[3]);
328
/* Support routines ---------------------------------------------------------------------- */
330
double cdecl _cmsxSaturate65535To255(double d);
331
double cdecl _cmsxSaturate255To65535(double d);
332
void cdecl _cmsxClampXYZ100(LPcmsCIEXYZ xyz);
334
/* Matrix shaper profiler API ------------------------------------------------------------- */
337
BOOL cdecl cmsxComputeMatrixShaper(const char* ReferenceSheet,
338
const char* MeasurementSheet,
340
LPGAMMATABLE TransferCurves[3],
341
LPcmsCIEXYZ WhitePoint,
342
LPcmsCIEXYZ BlackPoint,
343
LPcmsCIExyYTRIPLE Primaries);
346
/* Common to all profilers ------------------------------------------------------------------- */
350
typedef int (* cmsxGAUGER)(const char *Label, int nMin, int nMax, int Pos);
351
typedef int (* cmsxPRINTF)(const char *Frm, ...);
357
char ReferenceSheet[MAX_PATH];
358
char MeasurementSheet[MAX_PATH];
359
char OutputProfileFile[MAX_PATH];
362
char Description[MAX_STR];
363
char Manufacturer[MAX_STR];
365
char Copyright[MAX_STR];
372
cmsCIEXYZ WhitePoint; /* Black point in 0.xxx notation */
373
cmsCIEXYZ BlackPoint; /* Black point in 0.xxx notation */
374
cmsCIExyYTRIPLE Primaries; /* The primaries */
375
LPGAMMATABLE Gamma[3]; /* Gamma curves */
378
cmsHPROFILE hProfile; /* handle to profile */
380
icProfileClassSignature DeviceClass;
381
icColorSpaceSignature ColorSpace;
383
int PCSType; /* PT_XYZ or PT_Lab */
384
int CLUTPoints; /* Final CLUT resolution */
385
int ProfileVerbosityLevel; /* 0=minimum, 1=additional, 2=Verbose, 3=Any suitable */
389
MEASUREMENT m; /* Contains list of available patches */
394
LCMSHANDLE hRGBHull; /* Contains bobbin of valid RGB values */
397
BOOL lUseCIECAM97s; /* Use CIECAM97s for chromatic adaptation? */
399
cmsViewingConditions device; /* Viewing condition of source */
400
cmsViewingConditions PCS; /* Viewing condition of PCS */
402
LCMSHANDLE hDevice; /* CIECAM97s models used for adaptation */
403
LCMSHANDLE hPCS; /* and viewing conditions */
405
} PROFILERCOMMONDATA,FAR* LPPROFILERCOMMONDATA;
408
/* Shared routines */
410
BOOL cdecl cmsxEmbedCharTarget(LPPROFILERCOMMONDATA hdr);
411
BOOL cdecl cmsxEmbedMatrixShaper(LPPROFILERCOMMONDATA hdr);
412
BOOL cdecl cmsxEmbedTextualInfo(LPPROFILERCOMMONDATA hdr);
414
int cdecl cmsxFindOptimumNumOfTerms(LPPROFILERCOMMONDATA hdr, int nMaxTerms, BOOL* lAllOk);
415
void cdecl cmsxChromaticAdaptationAndNormalization(LPPROFILERCOMMONDATA hdr, LPcmsCIEXYZ xyz, BOOL lReverse);
416
void cdecl cmsxInitPCSViewingConditions(LPPROFILERCOMMONDATA hdr);
417
void cdecl cmsxComputeGamutHull(LPPROFILERCOMMONDATA hdr);
418
BOOL cdecl cmsxChoosePCS(LPPROFILERCOMMONDATA hdr);
420
/* Monitor profiler API ------------------------------------------------------------------- */
425
PROFILERCOMMONDATA hdr;
427
LPGAMMATABLE Prelinearization[3]; /* Canonic gamma */
428
LPGAMMATABLE ReverseTables[3]; /* Reverse (direct) gamma */
429
LPGAMMATABLE PreLab[3];
430
LPGAMMATABLE PreLabRev[3];
432
MAT3 PrimariesMatrix;
433
MAT3 PrimariesMatrixRev;
435
} MONITORPROFILERDATA,FAR* LPMONITORPROFILERDATA;
439
BOOL cdecl cmsxMonitorProfilerInit(LPMONITORPROFILERDATA sys);
440
BOOL cdecl cmsxMonitorProfilerDo(LPMONITORPROFILERDATA sys);
443
/* Scanner profiler API ------------------------------------------------------------------- */
449
PROFILERCOMMONDATA hdr;
451
LPGAMMATABLE Prelinearization[3];
453
LPMATN HiTerms; /* Regression matrix of many terms */
454
LPMATN LoTerms; /* Low order regression matrix used for extrapolation */
456
BOOL lLocalConvergenceExtrapolation;
459
} SCANNERPROFILERDATA,FAR* LPSCANNERPROFILERDATA;
462
BOOL cdecl cmsxScannerProfilerInit(LPSCANNERPROFILERDATA sys);
463
BOOL cdecl cmsxScannerProfilerDo(LPSCANNERPROFILERDATA sys);
465
/* ----------------------------------------------------------- end of profilers */