00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef __cmsprf_H
00039
00040
00041
00042 #include <lcms.h>
00043
00044
00045
00046 #include <cctype>
00047 #include <climits>
00048 #include <cstdarg>
00049
00050
00051
00052 #include <sys/stat.h>
00053
00054 #ifdef __cplusplus
00055 extern "C"
00056 {
00057 #endif
00058
00059 #ifdef NON_WINDOWS
00060 # ifndef stricmp
00061 # define stricmp strcasecmp
00062 # endif
00063 #endif
00064
00065 #ifndef max
00066 #define max(a,b) ((a) > (b)?(a):(b))
00067 #endif
00068
00069
00070 #if (LCMS_VERSION > 116)
00071 typedef LCMSBOOL BOOL;
00072 #endif
00073
00074
00075
00076
00077 typedef struct
00078 {
00079
00080 int Cols, Rows;
00081 double** Values;
00082
00083 } MATN,FAR* LPMATN;
00084
00085 LPMATN cdecl MATNalloc(int Rows, int Cols);
00086 void cdecl MATNfree (LPMATN mat);
00087 LPMATN cdecl MATNmult(LPMATN a1, LPMATN a2);
00088 double cdecl MATNcross(LPMATN a);
00089 void cdecl MATNscalar (LPMATN a, double scl, LPMATN b);
00090 LPMATN cdecl MATNtranspose (LPMATN a);
00091 BOOL cdecl MATNsolve(LPMATN a, LPMATN b);
00092
00093
00094
00095
00096 #define cmsxIT8_ROWS 12
00097 #define cmsxIT8_COLS 22
00098 #define cmsxIT8_GRAYCOLS 24
00099 #define cmsxIT8_NORMAL_PATCHES (cmsxIT8_ROWS*cmsxIT8_COLS + cmsxIT8_GRAYCOLS)
00100 #define cmsxIT8_CUSTOM_PATCHES 10
00101 #define cmsxIT8_TOTAL_PATCHES (cmsxIT8_NORMAL_PATCHES + cmsxIT8_CUSTOM_PATCHES)
00102
00103
00104 LCMSHANDLE cdecl cmsxIT8Alloc(void);
00105 void cdecl cmsxIT8Free(LCMSHANDLE cmsxIT8);
00106 LCMSHANDLE cdecl cmsxIT8LoadFromFile(const char* cFileName);
00107 LCMSHANDLE cdecl cmsxIT8LoadFromMem(void *Ptr, size_t len);
00108 BOOL cdecl cmsxIT8SaveToFile(LCMSHANDLE cmsxIT8, const char* cFileName);
00109 const char* cdecl cmsxIT8GetSheetType(LCMSHANDLE hIT8);
00110 BOOL cdecl cmsxIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
00111 const char* cdecl cmsxIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
00112 BOOL cdecl cmsxIT8SetProperty(LCMSHANDLE hcmsxIT8, const char* cProp, const char *Str);
00113 BOOL cdecl cmsxIT8SetPropertyDbl(LCMSHANDLE hcmsxIT8, const char* cProp, double Val);
00114 const char* cdecl cmsxIT8GetProperty(LCMSHANDLE hcmsxIT8, const char* cProp);
00115 double cdecl cmsxIT8GetPropertyDbl(LCMSHANDLE hcmsxIT8, const char* cProp);
00116 int cdecl cmsxIT8EnumProperties(LCMSHANDLE cmsxIT8, char ***PropertyNames);
00117 int cdecl cmsxIT8EnumDataFormat(LCMSHANDLE cmsxIT8, char ***SampleNames);
00118 BOOL cdecl cmsxIT8SetDataFormat(LCMSHANDLE cmsxIT8, int n, const char *Sample);
00119 BOOL cdecl cmsxIT8GetDataSetByPos(LCMSHANDLE IT8, int col, int row, char* Val, int ValBufferLen);
00120 BOOL cdecl cmsxIT8GetDataSet(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, char* Val, int ValBuffLen);
00121 BOOL cdecl cmsxIT8GetDataSetDbl(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, double* v);
00122 BOOL cdecl cmsxIT8SetDataSet(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, char *Val);
00123 BOOL cdecl cmsxIT8SetDataSetDbl(LCMSHANDLE cmsxIT8, const char* cPatch, const char* cSample, double Val);
00124 const char *cdecl cmsxIT8GenericPatchName(int nPatch, char* buffer);
00125
00126
00127
00128
00129 #define PATCH_HAS_Lab 0x00000001
00130 #define PATCH_HAS_XYZ 0x00000002
00131 #define PATCH_HAS_RGB 0x00000004
00132 #define PATCH_HAS_CMY 0x00000008
00133 #define PATCH_HAS_CMYK 0x00000010
00134 #define PATCH_HAS_HEXACRM 0x00000020
00135 #define PATCH_HAS_STD_Lab 0x00010000
00136 #define PATCH_HAS_STD_XYZ 0x00020000
00137 #define PATCH_HAS_XYZ_PROOF 0x00100000
00138 #define PATCH_HAS_MEAN_DE 0x01000000
00139 #define PATCH_HAS_STD_DE 0x02000000
00140 #define PATCH_HAS_CHISQ 0x04000000
00141
00142
00143 #define MAXPATCHNAMELEN 20
00144
00145
00146
00147 typedef struct
00148 {
00149
00150 DWORD dwFlags;
00151
00152
00153
00154 char Name[MAXPATCHNAMELEN];
00155
00156 cmsCIELab Lab;
00157 cmsCIEXYZ XYZ;
00158
00159 cmsCIEXYZ XYZProof;
00160
00161
00162 union {
00163
00164
00165 double RGB[3];
00166 double CMY[3];
00167 double CMYK[4];
00168 double Hexa[MAXCHANNELS];
00169
00170 } Colorant;
00171
00172 double dEStd;
00173 double ChiSq;
00174 double dEMean;
00175
00176 } PATCH, FAR* LPPATCH;
00177
00178
00179
00180
00181
00182
00183 typedef BOOL* SETOFPATCHES;
00184
00185
00186
00187 typedef struct _measurement
00188 {
00189
00190 int nPatches;
00191 LPPATCH Patches;
00192 SETOFPATCHES Allowed;
00193
00194 } MEASUREMENT,FAR *LPMEASUREMENT;
00195
00196
00197 void cdecl cmsxPCollFreeMeasurements(LPMEASUREMENT m);
00198 SETOFPATCHES cdecl cmsxPCollBuildSet(LPMEASUREMENT m, BOOL lDefault);
00199
00200 BOOL cdecl cmsxPCollBuildMeasurement(LPMEASUREMENT m, const char *ReferenceSheet,
00201 const char *MeasurementSheet, DWORD dwNeededSamplesType);
00202
00203 int cdecl cmsxPCollCountSet(LPMEASUREMENT m, SETOFPATCHES Set);
00204 BOOL cdecl cmsxPCollValidatePatches(LPMEASUREMENT m, DWORD dwFlags);
00205
00206 BOOL cdecl cmsxPCollLoadFromSheet(LPMEASUREMENT m, LCMSHANDLE hSheet);
00207 BOOL cdecl cmsxPCollSaveToSheet(LPMEASUREMENT m, LCMSHANDLE it8);
00208
00209 LPPATCH cdecl cmsxPCollGetPatch(LPMEASUREMENT m, int n);
00210 LPPATCH cdecl cmsxPCollGetPatchByName(LPMEASUREMENT m, const char* Name, int* lpPos);
00211 LPPATCH cdecl cmsxPCollGetPatchByPos(LPMEASUREMENT m, int row, int col);
00212 LPPATCH cdecl cmsxPCollAddPatchRGB(LPMEASUREMENT m, const char *Name,
00213 double r, double g, double b,
00214 LPcmsCIEXYZ XYZ, LPcmsCIELab Lab);
00215
00216 void cdecl cmsxPCollLinearizePatches(LPMEASUREMENT m, SETOFPATCHES Valids, LPGAMMATABLE Gamma[3]);
00217
00218
00219
00220
00221
00222
00223 void cdecl cmsxPCollPatchesGS(LPMEASUREMENT m, SETOFPATCHES Result);
00224
00225 int cdecl cmsxPCollPatchesNearRGB(LPMEASUREMENT m, SETOFPATCHES Valids,
00226 double r, double g, double b, int need, SETOFPATCHES Result);
00227
00228 int cdecl cmsxPCollPatchesNearNeutral(LPMEASUREMENT m, SETOFPATCHES Valids,
00229 int need, SETOFPATCHES Result);
00230
00231 int cdecl cmsxPCollPatchesNearPrimary(LPMEASUREMENT m, SETOFPATCHES Valids,
00232 int nChannel, int need, SETOFPATCHES Result);
00233
00234 int cdecl cmsxPCollPatchesInLabCube(LPMEASUREMENT m, SETOFPATCHES Valids,
00235 double Lmin, double LMax, double a, double b, SETOFPATCHES Result);
00236
00237 int cdecl cmsxPCollPatchesInGamutLUT(LPMEASUREMENT m, SETOFPATCHES Valids,
00238 LPLUT Gamut, SETOFPATCHES Result);
00239
00240
00241
00242 LPPATCH cdecl cmsxPCollFindWhite(LPMEASUREMENT m, SETOFPATCHES Valids, double* Distance);
00243 LPPATCH cdecl cmsxPCollFindBlack(LPMEASUREMENT m, SETOFPATCHES Valids, double* Distance);
00244 LPPATCH cdecl cmsxPCollFindPrimary(LPMEASUREMENT m, SETOFPATCHES Valids, int Channel, double* Distance);
00245
00246
00247
00248
00249
00250
00251 typedef struct
00252 {
00253
00254 double SSE;
00255 double MSE;
00256 double SSR;
00257 double MSR;
00258 double SSTO;
00259 double F;
00260 double R2;
00261
00262
00263 double R2adj;
00264
00265
00266
00267
00268
00269 } MLRSTATISTICS, FAR* LPMLRSTATISTICS;
00270
00271
00272 int cdecl cmsxRegressionCreateMatrix(LPMEASUREMENT m, SETOFPATCHES Allowed, int nterms,
00273 int ColorSpace,
00274 LPMATN* lpMat, LPMLRSTATISTICS Stat);
00275
00276 BOOL cdecl cmsxRegressionRGB2Lab(double r, double g, double b,
00277 LPMATN tfm, LPcmsCIELab Lab);
00278
00279 BOOL cdecl cmsxRegressionRGB2XYZ(double r, double g, double b,
00280 LPMATN tfm, LPcmsCIEXYZ XYZ);
00281
00282 BOOL cdecl cmsxRegressionInterpolatorRGB(LPMEASUREMENT m,
00283 int ColorSpace,
00284 int RegressionTerms,
00285 BOOL lUseLocalPatches,
00286 int MinPatchesToCollect,
00287 double r, double g, double b,
00288 void* Res);
00289
00290
00291
00292
00293 LCMSHANDLE cdecl cmsxLevenbergMarquardtInit(LPSAMPLEDCURVE x, LPSAMPLEDCURVE y, double sig,
00294 double a[], int ma,
00295 void (*funcs)(double, double[], double*, double[], int));
00296
00297 double cdecl cmsxLevenbergMarquardtAlamda(LCMSHANDLE hMRQ);
00298 double cdecl cmsxLevenbergMarquardtChiSq(LCMSHANDLE hMRQ);
00299 BOOL cdecl cmsxLevenbergMarquardtIterate(LCMSHANDLE hMRQ);
00300 BOOL cdecl cmsxLevenbergMarquardtFree(LCMSHANDLE hMRQ);
00301
00302
00303
00304
00305 LCMSHANDLE cdecl cmsxHullInit(void);
00306 void cdecl cmsxHullDone(LCMSHANDLE hHull);
00307 BOOL cdecl cmsxHullAddPoint(LCMSHANDLE hHull, int x, int y, int z);
00308 BOOL cdecl cmsxHullComputeHull(LCMSHANDLE hHull);
00309 char cdecl cmsxHullCheckpoint(LCMSHANDLE hHull, int x, int y, int z);
00310 BOOL cdecl cmsxHullDumpVRML(LCMSHANDLE hHull, const char* fname);
00311
00312
00313
00314
00315
00316 #define MEDIUM_REFLECTIVE_D50 0
00317 #define MEDIUM_TRANSMISSIVE 1
00318
00319 void cdecl cmsxComputeLinearizationTables(LPMEASUREMENT m, int ColorSpace,
00320 LPGAMMATABLE Lin[3], int nResultingPoints, int Medium);
00321
00322 void cdecl cmsxCompleteLabOfPatches(LPMEASUREMENT m, SETOFPATCHES Valids, int Medium);
00323 LPGAMMATABLE cdecl cmsxEstimateGamma(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
00324
00325 void cdecl cmsxApplyLinearizationTable(double In[3], LPGAMMATABLE Gamma[3], double Out[3]);
00326 void cdecl cmsxApplyLinearizationGamma(WORD In[3], LPGAMMATABLE Gamma[3], WORD Out[3]);
00327
00328
00329
00330 double cdecl _cmsxSaturate65535To255(double d);
00331 double cdecl _cmsxSaturate255To65535(double d);
00332 void cdecl _cmsxClampXYZ100(LPcmsCIEXYZ xyz);
00333
00334
00335
00336
00337 BOOL cdecl cmsxComputeMatrixShaper(const char* ReferenceSheet,
00338 const char* MeasurementSheet,
00339 int Medium,
00340 LPGAMMATABLE TransferCurves[3],
00341 LPcmsCIEXYZ WhitePoint,
00342 LPcmsCIEXYZ BlackPoint,
00343 LPcmsCIExyYTRIPLE Primaries);
00344
00345
00346
00347
00348 #define MAX_STR 256
00349
00350 typedef int (* cmsxGAUGER)(const char *Label, int nMin, int nMax, int Pos);
00351 typedef int (* cmsxPRINTF)(const char *Frm, ...);
00352
00353 typedef struct
00354 {
00355
00356
00357 char ReferenceSheet[MAX_PATH];
00358 char MeasurementSheet[MAX_PATH];
00359 char OutputProfileFile[MAX_PATH];
00360
00361
00362 char Description[MAX_STR];
00363 char Manufacturer[MAX_STR];
00364 char Model[MAX_STR];
00365 char Copyright[MAX_STR];
00366
00367
00368 cmsxGAUGER Gauger;
00369 cmsxPRINTF printf;
00370
00371
00372 cmsCIEXYZ WhitePoint;
00373 cmsCIEXYZ BlackPoint;
00374 cmsCIExyYTRIPLE Primaries;
00375 LPGAMMATABLE Gamma[3];
00376
00377
00378 cmsHPROFILE hProfile;
00379
00380 icProfileClassSignature DeviceClass;
00381 icColorSpaceSignature ColorSpace;
00382
00383 int PCSType;
00384 int CLUTPoints;
00385 int ProfileVerbosityLevel;
00386
00387
00388
00389 MEASUREMENT m;
00390 int Medium;
00391
00392
00393
00394 LCMSHANDLE hRGBHull;
00395
00396
00397 BOOL lUseCIECAM97s;
00398
00399 cmsViewingConditions device;
00400 cmsViewingConditions PCS;
00401
00402 LCMSHANDLE hDevice;
00403 LCMSHANDLE hPCS;
00404
00405 } PROFILERCOMMONDATA,FAR* LPPROFILERCOMMONDATA;
00406
00407
00408
00409
00410 BOOL cdecl cmsxEmbedCharTarget(LPPROFILERCOMMONDATA hdr);
00411 BOOL cdecl cmsxEmbedMatrixShaper(LPPROFILERCOMMONDATA hdr);
00412 BOOL cdecl cmsxEmbedTextualInfo(LPPROFILERCOMMONDATA hdr);
00413
00414 int cdecl cmsxFindOptimumNumOfTerms(LPPROFILERCOMMONDATA hdr, int nMaxTerms, BOOL* lAllOk);
00415 void cdecl cmsxChromaticAdaptationAndNormalization(LPPROFILERCOMMONDATA hdr, LPcmsCIEXYZ xyz, BOOL lReverse);
00416 void cdecl cmsxInitPCSViewingConditions(LPPROFILERCOMMONDATA hdr);
00417 void cdecl cmsxComputeGamutHull(LPPROFILERCOMMONDATA hdr);
00418 BOOL cdecl cmsxChoosePCS(LPPROFILERCOMMONDATA hdr);
00419
00420
00421
00422 typedef struct
00423 {
00424
00425 PROFILERCOMMONDATA hdr;
00426
00427 LPGAMMATABLE Prelinearization[3];
00428 LPGAMMATABLE ReverseTables[3];
00429 LPGAMMATABLE PreLab[3];
00430 LPGAMMATABLE PreLabRev[3];
00431
00432 MAT3 PrimariesMatrix;
00433 MAT3 PrimariesMatrixRev;
00434
00435 } MONITORPROFILERDATA,FAR* LPMONITORPROFILERDATA;
00436
00437
00438
00439 BOOL cdecl cmsxMonitorProfilerInit(LPMONITORPROFILERDATA sys);
00440 BOOL cdecl cmsxMonitorProfilerDo(LPMONITORPROFILERDATA sys);
00441
00442
00443
00444
00445
00446 typedef struct
00447 {
00448
00449 PROFILERCOMMONDATA hdr;
00450
00451 LPGAMMATABLE Prelinearization[3];
00452
00453 LPMATN HiTerms;
00454 LPMATN LoTerms;
00455
00456 BOOL lLocalConvergenceExtrapolation;
00457
00458
00459 } SCANNERPROFILERDATA,FAR* LPSCANNERPROFILERDATA;
00460
00461
00462 BOOL cdecl cmsxScannerProfilerInit(LPSCANNERPROFILERDATA sys);
00463 BOOL cdecl cmsxScannerProfilerDo(LPSCANNERPROFILERDATA sys);
00464
00465
00466
00467
00468 #ifdef __cplusplus
00469 }
00470 #endif
00471
00472 #define __cmsprf_H
00473 #endif