diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-08-23 12:22:51 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-08-23 12:22:51 +0200 |
commit | bc3604d9b226ac475a104cd8ae2ca2d1d4a27984 (patch) | |
tree | e796661f371a94a50edfdc693388bb911b253dfd /xicc | |
parent | 509016be676f7915d635fa57144d2a441e3090ca (diff) | |
parent | c0b89ac5bfb90835ef01573267020e42d4fe070c (diff) |
Merge new upstream release
Diffstat (limited to 'xicc')
-rwxr-xr-x[-rw-r--r--] | xicc/Jamfile | 1 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/License.txt | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/Readme.txt | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/afiles | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/bt1886.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/bt1886.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam02.c | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam02.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam02plot.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam02ref.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam02test.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam97s3.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam97s3.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cam97test.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/ccmx.c | 25 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/ccmx.h | 5 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/ccss.c | 14 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/ccss.h | 3 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/ccttest.c | 5 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cgatsplot.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cv.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/cvtest.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/example.sp | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/extracticc.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/extractttag.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/fakeCMY.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/fbview.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/iccgamut.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/iccjpeg.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/iccjpeg.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/icheck.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/monctest.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/moncurve.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/moncurve.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/mpp.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/mpp.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/mpplu.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/revfix.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/specplot.c | 57 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/specsubsamp.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/spectest.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/spectest2.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/tiffgamut.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/tiffgmts.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/transplot.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xcal.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xcal.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xcam.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xcam.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xcolorants.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xcolorants.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xcolorantslu.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xdevlin.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xdevlin.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xdgb.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xdgb.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xfbview.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xfit.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xfit.h | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xicc.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xicc.h | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xicclu.c | 24 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xlut.c | 8 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xlutfix.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xmatrix.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xmono.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xspect.c | 3318 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xspect.h | 48 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xutils.c | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | xicc/xutils.h | 0 |
70 files changed, 3131 insertions, 381 deletions
diff --git a/xicc/Jamfile b/xicc/Jamfile index 9c15349..5a03901 100644..100755 --- a/xicc/Jamfile +++ b/xicc/Jamfile @@ -139,6 +139,7 @@ if $(BUILD_JUNK) { LINKLIBS += ../render/librender ; Main illlocus : illlocus.c ; + Main illlocus2 : illlocus2.c ; Main slocustest : slocustest.c ; diff --git a/xicc/License.txt b/xicc/License.txt index a871fcf..a871fcf 100644..100755 --- a/xicc/License.txt +++ b/xicc/License.txt diff --git a/xicc/Readme.txt b/xicc/Readme.txt index f4a303a..f4a303a 100644..100755 --- a/xicc/Readme.txt +++ b/xicc/Readme.txt diff --git a/xicc/afiles b/xicc/afiles index f2b84ad..f2b84ad 100644..100755 --- a/xicc/afiles +++ b/xicc/afiles diff --git a/xicc/bt1886.c b/xicc/bt1886.c index 3f94dbe..3f94dbe 100644..100755 --- a/xicc/bt1886.c +++ b/xicc/bt1886.c diff --git a/xicc/bt1886.h b/xicc/bt1886.h index f14efdc..f14efdc 100644..100755 --- a/xicc/bt1886.h +++ b/xicc/bt1886.h diff --git a/xicc/cam02.c b/xicc/cam02.c index 9bc9343..5140f04 100644..100755 --- a/xicc/cam02.c +++ b/xicc/cam02.c @@ -809,7 +809,7 @@ double XYZ[3] } #endif - /* Constraied (+ve, non-zero) J */ + /* Constrained (+ve, non-zero) J */ if (A > 0.0) { cJ = pow(A/s->Aw, s->C * s->z); if (cJ < s->ssmincj) diff --git a/xicc/cam02.h b/xicc/cam02.h index 37443d3..37443d3 100644..100755 --- a/xicc/cam02.h +++ b/xicc/cam02.h diff --git a/xicc/cam02plot.c b/xicc/cam02plot.c index f397e09..f397e09 100644..100755 --- a/xicc/cam02plot.c +++ b/xicc/cam02plot.c diff --git a/xicc/cam02ref.h b/xicc/cam02ref.h index 29f7d2a..29f7d2a 100644..100755 --- a/xicc/cam02ref.h +++ b/xicc/cam02ref.h diff --git a/xicc/cam02test.c b/xicc/cam02test.c index eba27d6..eba27d6 100644..100755 --- a/xicc/cam02test.c +++ b/xicc/cam02test.c diff --git a/xicc/cam97s3.c b/xicc/cam97s3.c index d75b33e..d75b33e 100644..100755 --- a/xicc/cam97s3.c +++ b/xicc/cam97s3.c diff --git a/xicc/cam97s3.h b/xicc/cam97s3.h index 9893ea4..9893ea4 100644..100755 --- a/xicc/cam97s3.h +++ b/xicc/cam97s3.h diff --git a/xicc/cam97test.c b/xicc/cam97test.c index ff71bc8..ff71bc8 100644..100755 --- a/xicc/cam97test.c +++ b/xicc/cam97test.c diff --git a/xicc/ccmx.c b/xicc/ccmx.c index 464b89c..538f181 100644..100755 --- a/xicc/ccmx.c +++ b/xicc/ccmx.c @@ -92,6 +92,8 @@ cgats **pocg /* return CGATS structure */ ocg->add_kword(ocg, 0, "UI_SELECTORS", p->sel, NULL); if (p->ref != NULL) ocg->add_kword(ocg, 0, "REFERENCE",p->ref, NULL); + if (p->oem != 0) + ocg->add_kword(ocg, 0, "OEM","YES", NULL); ocg->add_kword(ocg, 0, "ORIGINATOR", "Argyll ccmx", NULL); ocg->add_kword(ocg, 0, "CREATED",atm, NULL); @@ -271,6 +273,22 @@ cgats *icg /* input cgats structure */ } } + if ((ti = icg->find_kword(icg, 0, "OEM")) >= 0) { + if ((p->ref = strdup(icg->t[0].kdata[ti])) == NULL) { + sprintf(p->err, "read_ccmx: malloc failed"); + return 2; + } + } + + if ((ti = icg->find_kword(icg, 0, "OEM")) >= 0) { + if (stricmp(icg->t[0].kdata[ti], "YES") == 0) + p->oem = 1; + else if (stricmp(icg->t[0].kdata[ti], "NO") == 0) + p->oem = 0; + } else { + p->oem = 0; + } + /* Locate the fields */ for (i = 0; i < 3; i++) { /* XYZ fields */ if ((spi[i] = icg->find_field(icg, 0, xyzfname[i])) < 0) { @@ -392,6 +410,7 @@ int refrmode, /* Display refresh mode, -1 = unknown, 0 = n, 1 = yes */ int cbid, /* Display type calibration base ID, 0 = unknown */ char *sel, /* UI selector characters - NULL for none */ char *refd, /* Reference spectrometer description (optional) */ +int oem, /* NZ if OEM source */ double mtx[3][3] /* Transform matrix to copy from */ ) { if ((p->desc = desc) != NULL && (p->desc = strdup(desc)) == NULL) { @@ -421,6 +440,8 @@ double mtx[3][3] /* Transform matrix to copy from */ return 2; } + p->oem = oem; + icmCpy3x3(p->matrix, mtx); return 0; @@ -540,6 +561,7 @@ int refrmode, /* Display refresh mode, -1 = unknown, 0 = n, 1 = yes */ int cbid, /* Display type calibration base index, 0 = unknown */ char *sel, /* UI selector characters - NULL for none */ char *refd, /* Reference spectrometer description (optional) */ +int oem, /* NZ if OEM source */ int npat, /* Number of samples in following arrays */ double (*refs)[3], /* Array of XYZ values from spectrometer */ double (*cols)[3] /* Array of XYZ values from colorimeter */ @@ -571,11 +593,14 @@ double (*cols)[3] /* Array of XYZ values from colorimeter */ return 2; } } + if ((p->ref = refd) != NULL && (p->ref = strdup(refd)) == NULL) { sprintf(p->err, "create_ccmx: malloc failed"); return 2; } + p->oem = oem; + /* Find the white patch */ cx.npat = npat; diff --git a/xicc/ccmx.h b/xicc/ccmx.h index 48598fc..94263e0 100644..100755 --- a/xicc/ccmx.h +++ b/xicc/ccmx.h @@ -34,11 +34,11 @@ struct _ccmx { /* Set the contents of the ccmx. return nz on error. */ int (*set_ccmx)(struct _ccmx *p, char *desc, char *inst, char *disp, disptech dtech, - int refrmode, int cbid, char *sel, char *refd, double mtx[3][3]); + int refrmode, int cbid, char *sel, char *refd, int oem, double mtx[3][3]); /* Create a ccmx from measurements. return nz on error. */ int (*create_ccmx)(struct _ccmx *p, char *desc, char *inst, char *disp, disptech dtech, - int refrmode, int cbid, char *sel, char *refd, + int refrmode, int cbid, char *sel, char *refd, int oem, int nsamples, double (*refs)[3], double (*cols)[3]); /* write to a CGATS .ccmx file */ @@ -70,6 +70,7 @@ struct _ccmx { int refrmode; /* Refresh mode, -1 if unknown, 0 of no, 1 if yes */ char *sel; /* Optional UI selector characters. May be NULL */ char *ref; /* Name of spectrometer instrument (optional) */ + int oem; /* nz if oem origin */ double matrix[3][3]; /* Transform matrix */ double av_err; /* Average error of fit */ double mx_err; /* Maximum error of fit */ diff --git a/xicc/ccss.c b/xicc/ccss.c index 663a789..75075c1 100644..100755 --- a/xicc/ccss.c +++ b/xicc/ccss.c @@ -103,6 +103,8 @@ cgats **pocg /* return CGATS structure */ ocg->add_kword(ocg, 0, "UI_SELECTORS", p->sel, NULL); if (p->ref != NULL) ocg->add_kword(ocg, 0, "REFERENCE",p->ref, NULL); + if (p->oem != 0) + ocg->add_kword(ocg, 0, "OEM","YES", NULL); sprintf(buf,"%d", p->samples[0].spec_n); ocg->add_kword(ocg, 0, "SPECTRAL_BANDS",buf, NULL); @@ -320,6 +322,15 @@ cgats *icg /* input cgats structure */ } } + if ((ti = icg->find_kword(icg, 0, "OEM")) >= 0) { + if (stricmp(icg->t[0].kdata[ti], "YES") == 0) + p->oem = 1; + else if (stricmp(icg->t[0].kdata[ti], "NO") == 0) + p->oem = 0; + } else { + p->oem = 0; + } + if ((ii = icg->find_kword(icg, 0, "SPECTRAL_BANDS")) < 0) { sprintf(p->err,"Input file doesn't contain keyword SPECTRAL_BANDS"); return 1; @@ -471,6 +482,7 @@ disptech dtech, /* Display technology enum */ int refrmode, /* Display refresh mode, -1 = unknown, 0 = n, 1 = yes */ char *sel, /* UI selector characters - NULL for none */ char *refd, /* Reference spectrometer description (optional) */ +int oem, /* NZ if OEM source */ xspect *samples, /* Arry of spectral samples. All assumed to be same dim as first */ int no_samp /* Number of spectral samples */ ) { @@ -516,6 +528,8 @@ int no_samp /* Number of spectral samples */ } } + p->oem = oem; + if (p->samples != NULL) { free(p->samples); p->samples = NULL; diff --git a/xicc/ccss.h b/xicc/ccss.h index 924f045..8258031 100644..100755 --- a/xicc/ccss.h +++ b/xicc/ccss.h @@ -34,7 +34,7 @@ struct _ccss { /* (Makes copies of all parameters) */ int (*set_ccss)(struct _ccss *p, char *orig, char *cdate, char *desc, char *disp, disptech dtech, int refrmode, char *sel, - char *ref, xspect *samples, int no_samp); + char *ref, int oem, xspect *samples, int no_samp); /* write to a CGATS .ccss file */ /* return nz on error, with message in err[] */ @@ -63,6 +63,7 @@ struct _ccss { int refrmode; /* Refresh mode, -1 if unknown, 0 of no, 1 if yes */ char *sel; /* Optional UI selector characters. May be NULL */ char *ref; /* Name of reference spectrometer instrument (optional) */ + int oem; /* nz if oem origin */ xspect *samples; /* Set of spectral samples */ int no_samp; /* Number of samples */ diff --git a/xicc/ccttest.c b/xicc/ccttest.c index 28a3dc9..52bbdac 100644..100755 --- a/xicc/ccttest.c +++ b/xicc/ccttest.c @@ -74,9 +74,10 @@ static int do_spec(char *name, xspect *sp) { { int invalid = 0; + double RR[14]; double cri; - cri = icx_CIE1995_CRI(&invalid, sp); - printf("CRI = %.1f%s\n",cri,invalid ? " (Invalid)" : ""); + cri = icx_CIE1995_CRI(&invalid, RR, sp); + printf("CRI = %.1f [ R9 = %.1f ]%s\n",cri,RR[9],invalid ? " (Invalid)" : ""); } /* Use modern color difference - gives a better visual match */ diff --git a/xicc/cgatsplot.c b/xicc/cgatsplot.c index ccaa28a..ccaa28a 100644..100755 --- a/xicc/cgatsplot.c +++ b/xicc/cgatsplot.c diff --git a/xicc/cv.c b/xicc/cv.c index 7cd7927..7cd7927 100644..100755 --- a/xicc/cv.c +++ b/xicc/cv.c diff --git a/xicc/cvtest.c b/xicc/cvtest.c index a9fa59f..a9fa59f 100644..100755 --- a/xicc/cvtest.c +++ b/xicc/cvtest.c diff --git a/xicc/example.sp b/xicc/example.sp index 57cfcfc..57cfcfc 100644..100755 --- a/xicc/example.sp +++ b/xicc/example.sp diff --git a/xicc/extracticc.c b/xicc/extracticc.c index 5fc24af..5fc24af 100644..100755 --- a/xicc/extracticc.c +++ b/xicc/extracticc.c diff --git a/xicc/extractttag.c b/xicc/extractttag.c index 2c26bda..2c26bda 100644..100755 --- a/xicc/extractttag.c +++ b/xicc/extractttag.c diff --git a/xicc/fakeCMY.c b/xicc/fakeCMY.c index b27f2d1..b27f2d1 100644..100755 --- a/xicc/fakeCMY.c +++ b/xicc/fakeCMY.c diff --git a/xicc/fbview.c b/xicc/fbview.c index 07a9170..07a9170 100644..100755 --- a/xicc/fbview.c +++ b/xicc/fbview.c diff --git a/xicc/iccgamut.c b/xicc/iccgamut.c index a77653f..a77653f 100644..100755 --- a/xicc/iccgamut.c +++ b/xicc/iccgamut.c diff --git a/xicc/iccjpeg.c b/xicc/iccjpeg.c index 13d4e25..13d4e25 100644..100755 --- a/xicc/iccjpeg.c +++ b/xicc/iccjpeg.c diff --git a/xicc/iccjpeg.h b/xicc/iccjpeg.h index 5e1888d..5e1888d 100644..100755 --- a/xicc/iccjpeg.h +++ b/xicc/iccjpeg.h diff --git a/xicc/icheck.c b/xicc/icheck.c index 5f61d9a..5f61d9a 100644..100755 --- a/xicc/icheck.c +++ b/xicc/icheck.c diff --git a/xicc/monctest.c b/xicc/monctest.c index a97b1b5..a97b1b5 100644..100755 --- a/xicc/monctest.c +++ b/xicc/monctest.c diff --git a/xicc/moncurve.c b/xicc/moncurve.c index 1769ce4..1769ce4 100644..100755 --- a/xicc/moncurve.c +++ b/xicc/moncurve.c diff --git a/xicc/moncurve.h b/xicc/moncurve.h index 5510c7d..5510c7d 100644..100755 --- a/xicc/moncurve.h +++ b/xicc/moncurve.h diff --git a/xicc/mpp.c b/xicc/mpp.c index 86b6c30..86b6c30 100644..100755 --- a/xicc/mpp.c +++ b/xicc/mpp.c diff --git a/xicc/mpp.h b/xicc/mpp.h index 26fa3a8..26fa3a8 100644..100755 --- a/xicc/mpp.h +++ b/xicc/mpp.h diff --git a/xicc/mpplu.c b/xicc/mpplu.c index 11ddb76..11ddb76 100644..100755 --- a/xicc/mpplu.c +++ b/xicc/mpplu.c diff --git a/xicc/revfix.c b/xicc/revfix.c index 2add264..2add264 100644..100755 --- a/xicc/revfix.c +++ b/xicc/revfix.c diff --git a/xicc/specplot.c b/xicc/specplot.c index 9de4645..6f38f37 100644..100755 --- a/xicc/specplot.c +++ b/xicc/specplot.c @@ -31,12 +31,6 @@ #define MAXGRAPHS 10 -#ifdef PLANKIAN -#define BBTYPE icxIT_Ptemp -#else -#define BBTYPE icxIT_Dtemp -#endif - /* Display a spectrum etc. */ /* We are guaranteed that the x range/increments are identical, */ /* and that there is only one spectrum if douv */ @@ -60,6 +54,9 @@ static int do_spec( double cct, vct; double cct_xyz[3], vct_xyz[3]; double cct_lab[3], vct_lab[3]; + double cdt, vdt; + double cdt_xyz[3], vdt_xyz[3]; + double cdt_lab[3], vdt_lab[3]; icmXYZNumber wp; double de; double uv = uvmin; @@ -129,24 +126,37 @@ static int do_spec( #endif /* Compute CCT */ - if ((cct = icx_XYZ2ill_ct(cct_xyz, BBTYPE, icxOT_CIE_1931_2, NULL, xyz, NULL, 0)) < 0) + if ((cct = icx_XYZ2ill_ct(cct_xyz, icxIT_Ptemp, icxOT_CIE_1931_2, NULL, xyz, NULL, 0)) < 0) warning("Got bad cct\n"); /* Compute VCT */ - if ((vct = icx_XYZ2ill_ct(vct_xyz, BBTYPE, icxOT_CIE_1931_2, NULL, xyz, NULL, 1)) < 0) + if ((vct = icx_XYZ2ill_ct(vct_xyz, icxIT_Ptemp, icxOT_CIE_1931_2, NULL, xyz, NULL, 1)) < 0) warning("Got bad vct\n"); -#ifdef PLANKIAN printf("CCT = %f, VCT = %f\n",cct, vct); -#else + + /* Compute CDT */ + if ((cct = icx_XYZ2ill_ct(cct_xyz, icxIT_Dtemp, icxOT_CIE_1931_2, NULL, xyz, NULL, 0)) < 0) + warning("Got bad cct\n"); + + /* Compute VDT */ + if ((vct = icx_XYZ2ill_ct(vct_xyz, icxIT_Dtemp, icxOT_CIE_1931_2, NULL, xyz, NULL, 1)) < 0) + warning("Got bad vct\n"); + printf("CDT = %f, VDT = %f\n",cct, vct); -#endif { int invalid = 0; + double RR[14]; double cri; - cri = icx_CIE1995_CRI(&invalid, &tsp); - printf("CRI = %.1f%s\n",cri,invalid ? " (Invalid)" : ""); + cri = icx_CIE1995_CRI(&invalid, RR, &tsp); + printf("CRI = %.1f [ R9 = %.1f ]%s\n",cri,RR[9-1],invalid ? " (Invalid)" : ""); + } + { + int invalid = 0; + double tlci; + tlci = icx_EBU2012_TLCI(&invalid, &tsp); + printf("TLCI = %.1f%s\n",tlci,invalid ? " (Invalid)" : ""); } /* Use modern color difference - gives a better visual match */ @@ -320,8 +330,12 @@ main( inm = "D50"; break; case icxIT_D50M2: inm = "D50M2"; break; + case icxIT_D55: + inm = "D55"; break; case icxIT_D65: inm = "D65"; break; + case icxIT_D75: + inm = "D75"; break; case icxIT_E: inm = "E"; break; case icxIT_F5: @@ -336,21 +350,28 @@ main( } if (standardIlluminant(&sp[0], ilType, 0) != 0) - error ("standardIlluminant returned error"); + error ("standardIlluminant returned error for %d (%s)",ilType,inm); strcpy(buf[0],inm); do_spec(buf, sp, 1, zero, douv, uvmin, uvmax); } /* For each material and illuminant */ - for (temp = 2500; temp <= 9000; temp += 500) { + for (k = 0; k < 2; k++) { + double start, end; + + if (k == 0) + start = 3400, end = 9000; + else + start = 500, end = 9000; + + for (temp = start; temp <= end; temp += 500) { - for (k = 0; k < 2; k++) { - ilType = k == 0 ? icxIT_Dtemp : icxIT_Ptemp; if (standardIlluminant(&sp[0], ilType, temp) != 0) - error ("standardIlluminant returned error"); + error ("standardIlluminant returned error for %s temp %f", + k == 0 ? "Daylight" : "Plankian", temp); sprintf(buf[0], "%s at %f", k == 0 ? "Daylight" : "Black body", temp); diff --git a/xicc/specsubsamp.c b/xicc/specsubsamp.c index 4163ee2..4163ee2 100644..100755 --- a/xicc/specsubsamp.c +++ b/xicc/specsubsamp.c diff --git a/xicc/spectest.c b/xicc/spectest.c index c340e98..c340e98 100644..100755 --- a/xicc/spectest.c +++ b/xicc/spectest.c diff --git a/xicc/spectest2.c b/xicc/spectest2.c index 3fd574f..3fd574f 100644..100755 --- a/xicc/spectest2.c +++ b/xicc/spectest2.c diff --git a/xicc/tiffgamut.c b/xicc/tiffgamut.c index 9ddb62b..9ddb62b 100644..100755 --- a/xicc/tiffgamut.c +++ b/xicc/tiffgamut.c diff --git a/xicc/tiffgmts.c b/xicc/tiffgmts.c index c31f852..c31f852 100644..100755 --- a/xicc/tiffgmts.c +++ b/xicc/tiffgmts.c diff --git a/xicc/transplot.c b/xicc/transplot.c index 6473e2b..6473e2b 100644..100755 --- a/xicc/transplot.c +++ b/xicc/transplot.c diff --git a/xicc/xcal.c b/xicc/xcal.c index 4400745..4400745 100644..100755 --- a/xicc/xcal.c +++ b/xicc/xcal.c diff --git a/xicc/xcal.h b/xicc/xcal.h index f7c3fa9..f7c3fa9 100644..100755 --- a/xicc/xcal.h +++ b/xicc/xcal.h diff --git a/xicc/xcam.c b/xicc/xcam.c index 6117cd1..6117cd1 100644..100755 --- a/xicc/xcam.c +++ b/xicc/xcam.c diff --git a/xicc/xcam.h b/xicc/xcam.h index 021c621..021c621 100644..100755 --- a/xicc/xcam.h +++ b/xicc/xcam.h diff --git a/xicc/xcolorants.c b/xicc/xcolorants.c index 84a7720..84a7720 100644..100755 --- a/xicc/xcolorants.c +++ b/xicc/xcolorants.c diff --git a/xicc/xcolorants.h b/xicc/xcolorants.h index 460c4b0..460c4b0 100644..100755 --- a/xicc/xcolorants.h +++ b/xicc/xcolorants.h diff --git a/xicc/xcolorantslu.c b/xicc/xcolorantslu.c index 601c4bd..601c4bd 100644..100755 --- a/xicc/xcolorantslu.c +++ b/xicc/xcolorantslu.c diff --git a/xicc/xdevlin.c b/xicc/xdevlin.c index a5f7bd6..a5f7bd6 100644..100755 --- a/xicc/xdevlin.c +++ b/xicc/xdevlin.c diff --git a/xicc/xdevlin.h b/xicc/xdevlin.h index 7e51e40..7e51e40 100644..100755 --- a/xicc/xdevlin.h +++ b/xicc/xdevlin.h diff --git a/xicc/xdgb.c b/xicc/xdgb.c index 80914b8..80914b8 100644..100755 --- a/xicc/xdgb.c +++ b/xicc/xdgb.c diff --git a/xicc/xdgb.h b/xicc/xdgb.h index bfb1752..bfb1752 100644..100755 --- a/xicc/xdgb.h +++ b/xicc/xdgb.h diff --git a/xicc/xfbview.c b/xicc/xfbview.c index affdb53..affdb53 100644..100755 --- a/xicc/xfbview.c +++ b/xicc/xfbview.c diff --git a/xicc/xfit.c b/xicc/xfit.c index d12919f..d12919f 100644..100755 --- a/xicc/xfit.c +++ b/xicc/xfit.c diff --git a/xicc/xfit.h b/xicc/xfit.h index 14b4ecc..14b4ecc 100644..100755 --- a/xicc/xfit.h +++ b/xicc/xfit.h diff --git a/xicc/xicc.c b/xicc/xicc.c index a7556d5..a7556d5 100644..100755 --- a/xicc/xicc.c +++ b/xicc/xicc.c diff --git a/xicc/xicc.h b/xicc/xicc.h index 37fff5d..f521de2 100644..100755 --- a/xicc/xicc.h +++ b/xicc/xicc.h @@ -126,7 +126,7 @@ int shape0gam, /* NZ if zero'th order shaper should be gamma function */ int clipbw, /* Prevent white > 1 and -ve black */ int clipprims, /* Prevent primaries going -ve */ double smooth, /* Smoothing factor (nominal 1.0) */ -double scale /* Scale device values */ +double scale /* Amount to scale device values */ ); /* ------------------------------------------------------------------------------ */ diff --git a/xicc/xicclu.c b/xicc/xicclu.c index f3b1267..0ca00aa 100644..100755 --- a/xicc/xicclu.c +++ b/xicc/xicclu.c @@ -250,6 +250,7 @@ main(int argc, char *argv[]) { if (na == NULL) { verb = 2; } else { + fa = nfa; if (na[0] == '0') verb = 0; else if (na[0] == '1') @@ -258,7 +259,6 @@ main(int argc, char *argv[]) { verb = 2; else usage("Illegal verbosity level"); - fa = nfa; } } @@ -269,6 +269,7 @@ main(int argc, char *argv[]) { /* Plot start or end override */ else if (argv[fa][1] == 'G') { if (na == NULL) usage("No parameter after flag -G"); + fa = nfa; if (na[0] == 's' || na[0] == 'S') { if (sscanf(na+1,":%lf:%lf:%lf",&pstart[0],&pstart[1],&pstart[2]) != 3) usage("Unrecognised parameters after -Gs"); @@ -277,7 +278,6 @@ main(int argc, char *argv[]) { usage("Unrecognised parameters after -Ge"); } else usage("Unrecognised parameters after -G"); - fa = nfa; } /* Actual target values */ else if (argv[fa][1] == 'a') { @@ -302,15 +302,16 @@ main(int argc, char *argv[]) { /* Device scale */ else if (argv[fa][1] == 's') { if (na == NULL) usage("No parameter after flag -s"); + fa = nfa; scale = atof(na); if (scale <= 0.0) usage("Illegal scale value"); - fa = nfa; } /* Video RGB encoding */ else if (argv[fa][1] == 'e' || argv[fa][1] == 'E') { int enc; if (na == NULL) usage("Video encodong flag (-e/E) needs an argument"); + fa = nfa; switch (na[0]) { case 'n': /* Normal */ enc = 0; @@ -340,12 +341,12 @@ main(int argc, char *argv[]) { in_tvenc = enc; else out_tvenc = enc; - fa = nfa; } /* function */ else if (argv[fa][1] == 'f') { if (na == NULL) usage("No parameter after flag -f"); + fa = nfa; switch (na[0]) { case 'f': case 'F': @@ -376,12 +377,12 @@ main(int argc, char *argv[]) { default: usage("Unknown parameter after flag -f"); } - fa = nfa; } /* Intent */ else if (argv[fa][1] == 'i') { if (na == NULL) usage("No parameter after flag -i"); + fa = nfa; switch (na[0]) { case 'p': intent = icPerceptual; @@ -406,12 +407,12 @@ main(int argc, char *argv[]) { default: usage("Unknown parameter after flag -i"); } - fa = nfa; } /* PCS override */ else if (argv[fa][1] == 'p') { if (na == NULL) usage("No parameter after flag -i"); + fa = nfa; switch (na[0]) { case 'x': pcsor = icSigXYZData; @@ -466,12 +467,12 @@ main(int argc, char *argv[]) { default: usage("Unknown parameter after flag -i"); } - fa = nfa; } /* Search order */ else if (argv[fa][1] == 'o') { if (na == NULL) usage("No parameter after flag -o"); + fa = nfa; switch (na[0]) { case 'n': case 'N': @@ -484,13 +485,13 @@ main(int argc, char *argv[]) { default: usage("Unknown parameter after flag -o"); } - fa = nfa; } /* Inking rule */ else if (argv[fa][1] == 'k' || argv[fa][1] == 'K') { if (na == NULL) usage("No parameter after flag -k"); + fa = nfa; if (argv[fa][1] == 'k') locus = 0; /* K value target */ else @@ -574,19 +575,18 @@ main(int argc, char *argv[]) { default: usage("Unknown parameter after flag -k"); } - fa = nfa; } else if (argv[fa][1] == 'l') { if (na == NULL) usage("No parameter after flag -l"); - tlimit = atoi(na)/100.0; fa = nfa; + tlimit = atoi(na)/100.0; } else if (argv[fa][1] == 'L') { if (na == NULL) usage("No parameter after flag -L"); - klimit = atoi(na)/100.0; fa = nfa; + klimit = atoi(na)/100.0; } #ifdef SPTEST @@ -600,6 +600,7 @@ main(int argc, char *argv[]) { /* Viewing conditions */ else if (argv[fa][1] == 'c') { if (na == NULL) usage("No parameter after flag -c"); + fa = nfa; #ifdef NEVER if (na[0] >= '0' && na[0] <= '9') { vc_e = atoi(na); @@ -659,7 +660,6 @@ main(int argc, char *argv[]) { usage("Unrecognised parameters after -cg"); } else usage("Unrecognised parameters after -c"); - fa = nfa; } else diff --git a/xicc/xlut.c b/xicc/xlut.c index 5b07ca5..8b7699c 100644..100755 --- a/xicc/xlut.c +++ b/xicc/xlut.c @@ -50,6 +50,8 @@ /* + ~~~~~!!!!! This has all been fixed ? + NOTE :- an alternative to the way display profile absolute is handled here would be to always chromatically adapt the illuminant to D50, and encode that in the Chromatic adapation tag. To make absolute colorimetric @@ -2267,6 +2269,7 @@ icxInk *ink /* inking details (NULL for default) */ ) { icxLuLut *p; /* Object being created */ icmLuLut *luluto = (icmLuLut *)plu; /* Lookup Lut type object */ + icmLookupFunc fnc; int i; @@ -2314,7 +2317,7 @@ fprintf(stderr,"~1 Internal optimised 4D separations not yet implemented!\n"); p->intent = intent; /* Get the effective spaces of underlying icm */ - plu->spaces(plu, &p->ins, NULL, &p->outs, NULL, NULL, NULL, NULL, &p->pcs, NULL); + plu->spaces(plu, &p->ins, NULL, &p->outs, NULL, NULL, NULL, &fnc, &p->pcs, NULL); /* Override with pcsor */ /* We assume that any profile that has a CIE color as a "device" color */ @@ -2460,7 +2463,8 @@ fprintf(stderr,"~1 Internal optimised 4D separations not yet implemented!\n"); /* Setup all the clipping, ink limiting and auxiliary stuff, */ /* in case a reverse call is used. Only do this if we know */ /* the reverse stuff isn't going to fail due to channel limits. */ - if (p->clutTable->within_restrictedsize(p->clutTable)) { + if (fnc != icmGamut && fnc != icmPreview + && p->clutTable->within_restrictedsize(p->clutTable)) { if (setup_ink_icxLuLut(p, ink, 1) != 0) { p->del((icxLuBase *)p); diff --git a/xicc/xlutfix.c b/xicc/xlutfix.c index a0c0e4e..a0c0e4e 100644..100755 --- a/xicc/xlutfix.c +++ b/xicc/xlutfix.c diff --git a/xicc/xmatrix.c b/xicc/xmatrix.c index 034a396..034a396 100644..100755 --- a/xicc/xmatrix.c +++ b/xicc/xmatrix.c diff --git a/xicc/xmono.c b/xicc/xmono.c index fe9c55e..fe9c55e 100644..100755 --- a/xicc/xmono.c +++ b/xicc/xmono.c diff --git a/xicc/xspect.c b/xicc/xspect.c index 477892b..1df8555 100644..100755 --- a/xicc/xspect.c +++ b/xicc/xspect.c @@ -52,7 +52,7 @@ #undef STOCKFWA /* [und] Use table shape else compute from flat line estimate*/ -#undef DEBUG /* [und] Extra printouts + debugging messages */ +#undef DEBUG /* [und] Extra printouts + debugging messages (need to uncomment) */ #undef DOPLOT /* [und] Plot FWA setup */ #undef DOPLOT_ALL_FWA /* [und] Plot all FWA corrected conversions */ #undef WRITE_FWA1_STIM /* [und] Write file "fwa1_stip.sp" when FWA is setup */ @@ -292,10 +292,11 @@ static xspect il_D65 = { }; #ifndef SALONEINSTLIB -/* General temperature Daylight spectra (Using CIE 1960 u,v CCT) */ +/* General temperature Daylight spectra (Using OLDER CIE 1960 u,v CCT) */ +/* 300 - 830nm ub 5nm intervals. */ /* Fill in the given xspect with the specified daylight illuminant */ /* Return nz if temperature is out of range */ -static int daylight_il(xspect *sp, double ct) { +static int daylight_old_il(xspect *sp, double ct) { static double s0[107] = { 0.04, 3.02, 6.00, 17.80, 29.60, 42.45, 55.30, 56.30, 57.30, 59.55, 61.80, 61.65, 61.50, 65.15, 68.80, 66.10, 63.40, 64.60, 65.80, 80.30, @@ -339,7 +340,7 @@ static int daylight_il(xspect *sp, double ct) { double xd, yd; double m1, m2; - if (ct < 4000.0 || ct > 25000.0) { /* Only accurate down to 4000 */ + if (ct < 2500.0 || ct > 25000.0) { /* Only accurate down to about 4000 */ return 1; } @@ -352,8 +353,8 @@ static int daylight_il(xspect *sp, double ct) { yd = -3.000 * xd * xd + 2.870 * xd - 0.275; /* Compute m factors */ - m1 = (-1.3515 - 1.7703 * xd + 5.9114 * yd)/(0.0241 + 0.2562 * xd - 0.7341 * yd); - m2 = (0.0300 - 31.4424 * xd + 30.0717 * yd)/(0.0241 + 0.2562 * xd - 0.7341 * yd); + m1 = (-1.7703 * xd + 5.9114 * yd - 1.3515)/(0.2562 * xd - 0.7341 * yd + 0.0241); + m2 = (-31.4424 * xd + 30.0717 * yd + 0.0300)/(0.2562 * xd - 0.7341 * yd + 0.0241); /* Compute spectral values */ for (i = 0; i < 107; i++) { @@ -367,10 +368,154 @@ static int daylight_il(xspect *sp, double ct) { return 0; } + +/* General temperature Daylight spectra from CIE 15.2004 Appendix C. */ +/* - uses improved interpolation. Assumes 1931 observer & 1 nm spacing. */ +/* 300 - 830nm ub 5nm intervals. */ +/* Fill in the given xspect with the specified daylight illuminant */ +/* Return nz if temperature is out of range */ +static int daylight_il(xspect *sp, double ct) { + static double s0[107] = { + 0.04000, -0.15625, 6.00000, 16.56625, 29.60000, + 43.80000, 55.30000, 57.62500, 57.30000, 59.69375, + 61.80000, 61.47500, 61.50000, 65.46875, 68.80000, + 66.40625, 63.40000, 62.45000, 65.80000, 79.82500, + 94.80000, 101.54375, 104.80000, 106.54375, 105.90000, + 100.35000, 96.80000, 104.05000, 113.90000, 120.82500, + 125.60000, 126.54375, 125.50000, 123.39375, 121.30000, + 121.52500, 121.30000, 117.42500, 113.50000, 112.95625, + 113.10000, 112.19375, 110.80000, 108.36250, 106.50000, + 107.60000, 108.80000, 107.25000, 105.30000, 104.90625, + 104.40000, 102.39375, 100.00000, 97.78125, 96.00000, + 95.67500, 95.10000, 91.95625, 89.10000, 89.43750, + 90.50000, 90.60625, 90.30000, 89.61250, 88.40000, + 86.01250, 84.00000, 84.47500, 85.10000, 83.52500, + 81.90000, 81.90625, 82.60000, 84.01875, 84.90000, + 83.83125, 81.30000, 76.22500, 71.90000, 72.38125, + 74.30000, 76.31875, 76.40000, 69.45625, 63.30000, + 66.35000, 71.70000, 75.61250, 77.00000, 72.52500, + 65.20000, 54.40625, 47.70000, 57.28125, 68.60000, + 68.04375, 65.00000, 65.58750, 66.00000, 64.04375, + 61.00000, 56.48750, 53.30000, 55.43125, 58.90000, + 61.71875, 61.90000 + }; + + static double s1[107] = { + 0.02000, -0.15000, 4.50000, 12.50500, 22.40000, + 33.40625, 42.00000, 42.46250, 40.60000, 41.23750, + 41.60000, 39.58750, 38.00000, 40.21875, 42.40000, + 40.94375, 38.50000, 35.98125, 35.00000, 38.80000, + 43.40000, 45.52500, 46.30000, 45.70625, 43.90000, + 40.37500, 37.10000, 36.52500, 36.70000, 36.48125, + 35.90000, 34.49375, 32.60000, 30.26875, 27.90000, + 26.06875, 24.30000, 22.21875, 20.10000, 18.07500, + 16.20000, 14.74375, 13.20000, 10.86875, 8.60000, + 7.18125, 6.10000, 5.13750, 4.20000, 3.05000, + 1.90000, 0.90625, 0.00000, -0.80000, -1.60000, + -2.65000, -3.50000, -3.47500, -3.50000, -4.56250, + -5.80000, -6.55625, -7.20000, -7.93125, -8.60000, + -9.05000, -9.50000, -10.26875, -10.90000, -10.80625, + -10.70000, -11.21250, -12.00000, -13.10625, -14.00000, + -14.02500, -13.60000, -12.69375, -12.00000, -12.57500, + -13.30000, -13.32500, -12.90000, -11.66250, -10.60000, + -10.91875, -11.60000, -12.08750, -12.20000, -11.38750, + -10.20000, -8.66250, -7.80000, -9.40000, -11.20000, + -11.00000, -10.40000, -10.50625, -10.60000, -10.25000, + -9.70000, -8.88125, -8.30000, -8.68125, -9.30000, + -9.79375, -9.80000 + }; + + static double s2[107] = { + 0.00000, 1.15625, 2.00000, 2.84375, 4.00000, + 6.41875, 8.50000, 8.50000, 7.80000, 7.29375, + 6.70000, 5.88125, 5.30000, 5.80625, 6.10000, + 4.71250, 3.00000, 2.05000, 1.20000, -0.10000, + -1.10000, -0.93125, -0.50000, -0.53125, -0.70000, + -0.87500, -1.20000, -1.91250, -2.60000, -2.84375, + -2.90000, -2.88125, -2.80000, -2.69375, -2.60000, + -2.63750, -2.60000, -2.21875, -1.80000, -1.61250, + -1.50000, -1.38750, -1.30000, -1.25000, -1.20000, + -1.12500, -1.00000, -0.75000, -0.50000, -0.38750, + -0.30000, -0.15000, 0.00000, 0.10000, 0.20000, + 0.26250, 0.50000, 1.25000, 2.10000, 2.69375, + 3.20000, 3.68125, 4.10000, 4.43125, 4.70000, + 4.83750, 5.10000, 5.88750, 6.70000, 7.01875, + 7.30000, 7.91250, 8.60000, 9.25625, 9.80000, + 10.19375, 10.20000, 9.19375, 8.30000, 8.90000, + 9.60000, 9.22500, 8.50000, 7.64375, 7.00000, + 7.18125, 7.60000, 7.91875, 8.00000, 7.46875, + 6.70000, 5.73125, 5.20000, 6.24375, 7.40000, + 7.22500, 6.80000, 6.90000, 7.00000, 6.76875, + 6.40000, 5.87500, 5.50000, 5.71875, 6.10000, + 6.43125, 6.50000, + }; + + /* M values for [1nm,5nm][1931,1964][M1,M2][g, h, i, j, k, l] */ + double ms[2][2][2][6] = { + { /* 1nm */ + { + { -1.77864, 5.90745, -1.34666, 0.25540, -0.73218, 0.02387 }, + { -31.44505, 30.06408, 0.03656, 0.25540, -0.73218, 0.02387 } + }, + { + { -1.57049, 5.56450, -1.31211, 0.21249, -0.71591, 0.04663 }, + { -30.15166, 31.07906, -0.73912, 0.21249, -0.71591, 0.04663 } + } + }, + { /* 5nm */ + { + { -1.77861, 5.90757, -1.34674, 0.25539, -0.73217, 0.02387 }, + { -31.44464, 30.06400, 0.03638, 0.25539, -0.73217, 0.02387 } + }, + { + { -1.57049, 5.56460, -1.31215, 0.21250, -0.71592, 0.04663 }, + { -30.15139, 31.07931, -0.73928, 0.21250, -0.71592, 0.04663 } + } + } + }; + + int i; + double xd, yd; + int obs = 0; /* 1931 */ + int sint = 0; /* 1nm */ + double m1, m2; + + if (ct < 2500.0 || ct > 25000.0) { /* Only accurate down to about 4000 */ + return 1; + } + + /* Compute chromaticity coordinates */ + if (ct < 7000.0) { + xd = -4.6070e9/(ct * ct * ct) + 2.9678e6/(ct * ct) + 0.09911e3/ct + 0.244063; + } else { + xd = -2.0064e9/(ct * ct * ct) + 1.9018e6/(ct * ct) + 0.24748e3/ct + 0.237040; + } + yd = -3.000 * xd * xd + 2.870 * xd - 0.275; + + /* Compute m factors */ + m1 = (ms[sint][obs][0][0] * xd + ms[sint][obs][0][1] * yd + ms[sint][obs][0][2]) + / (ms[sint][obs][0][3] * xd + ms[sint][obs][0][4] * yd + ms[sint][obs][0][5]); + m2 = (ms[sint][obs][1][0] * xd + ms[sint][obs][1][1] * yd + ms[sint][obs][1][2]) + / (ms[sint][obs][1][3] * xd + ms[sint][obs][1][4] * yd + ms[sint][obs][1][5]); + + /* Compute spectral values */ + for (i = 0; i < 107; i++) { + sp->spec[i] = s0[i] + m1 * s1[i] + m2 * s2[i]; + } + + sp->spec_n = 107; + sp->spec_wl_short = 300.0; + sp->spec_wl_long = 830; + sp->norm = 100.0; /* Arbitrary */ + + return 0; +} + #endif /* !SALONEINSTLIB */ -/* General temperature Planckian (black body) spectra */ +/* General temperature Planckian (black body) spectra using CIE 15:2004 */ /* Fill in the given xspect with the specified Planckian illuminant */ +/* normalised so that 560nm = 100. */ /* Return nz if temperature is out of range */ static int planckian_il(xspect *sp, double ct) { int i; @@ -386,19 +531,49 @@ static int planckian_il(xspect *sp, double ct) { /* Compute spectral values using Plank's radiation law: */ /* Normalise numbers by energy at 560 nm */ - wl = 1e-9 * 560; - norm = 0.01 * (3.74183e-16 * pow(wl, -5.0)) / (exp(1.4388e-2 / (wl * ct)) - 1.0); + norm = pow(560e-9, -5.0) / (exp(1.4388e-2 / (560e-9 * ct)) - 1.0); for (i = 0; i < sp->spec_n; i++) { wl = 1e-9 * XSPECT_XWL(sp, i); /* Wavelength in meters */ - sp->spec[i] = (3.74183e-16 * pow(wl, -5.0)) / (exp(1.4388e-2 / (wl * ct)) - 1.0); + sp->spec[i] = 100.0 * pow(wl, -5.0) / (exp(1.4388e-2 / (wl * ct)) - 1.0); sp->spec[i] /= norm; } - sp->norm = 100.0; /* Arbitrary */ + sp->norm = 100.0; /* value at 560 nm */ return 0; } +/* General temperature Planckian (black body) spectra using older formulation */ +/* Fill in the given xspect with the specified Planckian illuminant */ +/* normalised so that 560nm = 100. */ +/* Return nz if temperature is out of range */ +static int planckian_old_il(xspect *sp, double ct) { + int i; + double wl, norm; + + if (ct < 1.0 || ct > 1e6) /* set some arbitrary limits */ + return 1; + + /* Set out targets */ + sp->spec_n = 531; /* 1nm */ + sp->spec_wl_short = 300.0; + sp->spec_wl_long = 830; + + /* Compute spectral values using Plank's radiation law: */ + /* Normalise numbers by energy at 560 nm */ + norm = pow(560e-9, -5.0) / (exp(1.4350e-2 / (560e-9 * ct)) - 1.0); + for (i = 0; i < sp->spec_n; i++) { + wl = 1e-9 * XSPECT_XWL(sp, i); /* Wavelength in meters */ + sp->spec[i] = 100.0 * pow(wl, -5.0) / (exp(1.4350e-2 / (wl * ct)) - 1.0); + sp->spec[i] /= norm; + + } + sp->norm = 100.0; /* value at 560 nm */ + + return 0; +} + + #ifndef SALONEINSTLIB /* CIE F5 */ @@ -460,7 +635,7 @@ static xspect il_F10 = { 6.75, 34.39, 14.86, 10.40, 10.76, 10.67, 10.11, 9.27, 8.29, 7.29, 7.91, 16.64, 16.73, 10.44, 5.94, 3.34, 2.35, 1.88, 1.59, 1.47, 1.80, 5.71, 40.98, 73.69, 33.61, 8.24, 3.38, 2.47, 2.14, 4.86, - 11.45, 14.79, 12.16, 8.97, 6.53, 8.31, 44.12, 34.55, 12.09, 12.15, + 11.45, 14.79, 12.16, 8.97, 6.5, 8.31, 44.12, 34.55, 12.09, 12.15, 10.52, 4.43, 1.95, 2.19, 3.19, 2.77, 2.29, 2.00, 1.52, 1.35, 1.47, 1.79, 1.74, 1.02, 1.14, 3.32, 4.49, 2.05, 0.49, 0.24, 0.21, 0.21, 0.24, 0.24, 0.21, 0.17, 0.21, 0.22, 0.17, 0.12, @@ -569,16 +744,19 @@ double temp /* Optional temperature in degrees kelvin, for Dtemp and Ptemp * case icxIT_Spectrocam: *sp = il_Spectrocam; return 0; + case icxIT_ODtemp: + return daylight_old_il(sp, temp); case icxIT_Dtemp: return daylight_il(sp, temp); #endif + case icxIT_OPtemp: + return planckian_old_il(sp, temp); case icxIT_Ptemp: return planckian_il(sp, temp); } return 1; } - /* ------------- */ /* Observer Data */ @@ -1712,6 +1890,77 @@ static xspect ob_Shaw_Fairchild_2[3] = { } }; +/* EBU standard camera curves - 2012 */ +/* from Tech 3355 */ +static xspect ob_EBU_2012[3] = { + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000450, 0.001000, 0.001230, 0.001300, + 0.001300, 0.001190, 0.001120, 0.001040, 0.000930, + 0.000860, 0.000820, 0.000820, 0.000890, 0.000890, + 0.000970, 0.000890, 0.000890, 0.000890, 0.000930, + 0.001040, 0.001120, 0.001340, 0.001490, 0.001710, + 0.001790, 0.001670, 0.001410, 0.001150, 0.001120, + 0.001190, 0.001710, 0.005920, 0.015630, 0.032310, + 0.054310, 0.067330, 0.072830, 0.073060, 0.071650, + 0.068640, 0.063800, 0.059260, 0.054600, 0.049390, + 0.044370, 0.039570, 0.034540, 0.029440, 0.025030, + 0.021030, 0.017900, 0.014960, 0.012170, 0.009710, + 0.007740, 0.005880, 0.004350, 0.002900, 0.002000, + 0.001340, 0.000950, 0.000710, 0.000530, 0.000440, + 0.000310, 0.000190, 0.000060, 0.000000, 0.000000, + 0.000000, 0.000000 + } + }, + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000110, 0.000211, 0.000321, 0.000482, + 0.000562, 0.000633, 0.000753, 0.000934, 0.001175, + 0.001386, 0.001777, 0.002239, 0.002902, 0.003555, + 0.004488, 0.006175, 0.010664, 0.021297, 0.036343, + 0.046681, 0.054634, 0.059594, 0.062114, 0.063761, + 0.065066, 0.066341, 0.067426, 0.068018, 0.068109, + 0.066994, 0.063530, 0.054222, 0.041319, 0.025210, + 0.013264, 0.007350, 0.004418, 0.002611, 0.001707, + 0.001084, 0.000482, 0.000030, 0.000011, 0.000008, + 0.000006, 0.000003, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000 + } + }, + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.000000, 0.000215, 0.000649, 0.001397, 0.003902, + 0.007905, 0.014223, 0.021958, 0.029294, 0.036253, + 0.042739, 0.048916, 0.055513, 0.061881, 0.068628, + 0.073179, 0.075694, 0.077461, 0.078010, 0.074377, + 0.066582, 0.053601, 0.036619, 0.022597, 0.012366, + 0.008274, 0.006138, 0.004461, 0.003254, 0.002455, + 0.001996, 0.001707, 0.001407, 0.001228, 0.000998, + 0.000928, 0.000779, 0.000599, 0.000489, 0.000369, + 0.000329, 0.000260, 0.000190, 0.000110, 0.000070, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000 + } + } +}; + #ifdef NEVER CIE TC 1-36 proposed @@ -2649,6 +2898,11 @@ icxObserverType obType /* Type of observer */ sp[1] = &ob_Shaw_Fairchild_2[1]; sp[2] = &ob_Shaw_Fairchild_2[2]; return 0; + case icxOT_EBU_2012: + sp[0] = &ob_EBU_2012[0]; + sp[1] = &ob_EBU_2012[1]; + sp[2] = &ob_EBU_2012[2]; + return 0; #endif /* !SALONEINSTLIB */ default: return 1; @@ -2676,6 +2930,8 @@ char *standardObserverDescription(icxObserverType obType) { return "CIE 1964 10 degree observer (aligned)"; case icxOT_Shaw_Fairchild_2: return "Shaw & Fairchild 1997 2 degree observer"; + case icxOT_EBU_2012: + return "EBU Standard Camera 2012"; #endif /* !SALONEINSTLIB */ } return "Unknown observer"; @@ -2961,6 +3217,562 @@ static xspect CIE1995_TCS[] = { } }; +/* EBU TLCI ColorChecker samples */ +static xspect TLCI_2012_TCS[] = { + + /* 1 Dark skin */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.05400, 0.05700, 0.06300, 0.06600, 0.07500, + 0.07800, 0.07800, 0.07600, 0.07400, 0.07000, + 0.06600, 0.06400, 0.06200, 0.06000, 0.05900, + 0.06000, 0.05800, 0.06000, 0.06000, 0.06200, + 0.05800, 0.06300, 0.06300, 0.06700, 0.06800, + 0.07000, 0.07200, 0.07700, 0.07900, 0.08100, + 0.08100, 0.08300, 0.08300, 0.08400, 0.08400, + 0.08800, 0.09300, 0.09800, 0.10400, 0.11100, + 0.12100, 0.12700, 0.13300, 0.14000, 0.14400, + 0.14900, 0.15100, 0.15400, 0.16000, 0.16400, + 0.17000, 0.17500, 0.17900, 0.18400, 0.19300, + 0.20300, 0.21300, 0.22000, 0.23600, 0.24100, + 0.24800, 0.25700, 0.26900, 0.28000, 0.28900, + 0.30000, 0.31400, 0.33700, 0.34600, 0.36100, + 0.38200, 0.40400, 0.42500, 0.43900, 0.46400, + 0.47600, 0.49000 + } + }, + /* 2 Light skin */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.09200, 0.10900, 0.13400, 0.16100, 0.18600, + 0.20000, 0.20500, 0.20600, 0.20700, 0.20900, + 0.21100, 0.21300, 0.21600, 0.22100, 0.22700, + 0.23700, 0.24600, 0.25900, 0.27300, 0.28500, + 0.29400, 0.30400, 0.30500, 0.30900, 0.31400, + 0.32300, 0.33400, 0.34000, 0.33200, 0.31600, + 0.30000, 0.29200, 0.29000, 0.29500, 0.30000, + 0.30200, 0.29700, 0.29500, 0.30400, 0.32800, + 0.36500, 0.40900, 0.45000, 0.48800, 0.52000, + 0.54000, 0.55600, 0.56600, 0.57400, 0.58200, + 0.59300, 0.60200, 0.60700, 0.62500, 0.63100, + 0.63900, 0.65500, 0.66100, 0.68700, 0.69300, + 0.71100, 0.72200, 0.73700, 0.75700, 0.76800, + 0.78600, 0.79800, 0.81500, 0.82200, 0.82300, + 0.83500, 0.84500, 0.85500, 0.84800, 0.86200, + 0.86100, 0.86800 + } + }, + /* 3 Blue sky */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.10500, 0.12700, 0.16400, 0.21300, 0.27100, + 0.31400, 0.33300, 0.34400, 0.34500, 0.34400, + 0.34600, 0.34600, 0.34700, 0.34300, 0.33700, + 0.33300, 0.32700, 0.32400, 0.31900, 0.30600, + 0.29000, 0.28800, 0.28000, 0.27400, 0.26500, + 0.25800, 0.25000, 0.24000, 0.22900, 0.22000, + 0.21200, 0.20700, 0.20300, 0.19800, 0.19300, + 0.19100, 0.18700, 0.18100, 0.17400, 0.17000, + 0.16700, 0.16200, 0.15800, 0.16100, 0.15600, + 0.15200, 0.15000, 0.14500, 0.14200, 0.13700, + 0.13300, 0.13200, 0.12600, 0.12700, 0.12100, + 0.11800, 0.11500, 0.11500, 0.11200, 0.11000, + 0.11000, 0.10900, 0.10800, 0.10800, 0.10600, + 0.10500, 0.10500, 0.10600, 0.10600, 0.10500, + 0.10700, 0.10500, 0.10600, 0.10500, 0.10800, + 0.10700, 0.11000 + } + }, + /* 4 Foliage */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.05000, 0.05200, 0.05200, 0.05000, 0.05200, + 0.05200, 0.05200, 0.05300, 0.05100, 0.05300, + 0.05300, 0.05300, 0.05500, 0.05800, 0.05900, + 0.06100, 0.06000, 0.06300, 0.06300, 0.06700, + 0.06500, 0.06700, 0.06900, 0.07200, 0.07700, + 0.08800, 0.10500, 0.13200, 0.15900, 0.18200, + 0.19500, 0.19900, 0.19100, 0.18000, 0.16700, + 0.15600, 0.14400, 0.13300, 0.13100, 0.13000, + 0.12900, 0.12300, 0.11800, 0.11400, 0.11000, + 0.10200, 0.10100, 0.10300, 0.10400, 0.10500, + 0.10500, 0.10600, 0.10200, 0.10200, 0.10100, + 0.10100, 0.10100, 0.10100, 0.10700, 0.11500, + 0.13200, 0.15200, 0.18500, 0.23300, 0.28300, + 0.33900, 0.38300, 0.41900, 0.44400, 0.44500, + 0.46500, 0.47300, 0.47700, 0.48000, 0.48900, + 0.49200, 0.49800 + } + }, + /* 5 Blue flower */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.10100, 0.12700, 0.17000, 0.23300, 0.31000, + 0.37300, 0.40900, 0.42400, 0.43200, 0.43700, + 0.43700, 0.43800, 0.43700, 0.43200, 0.42800, + 0.42300, 0.41700, 0.41200, 0.40500, 0.39500, + 0.38000, 0.37300, 0.36400, 0.35500, 0.34200, + 0.33300, 0.31600, 0.29600, 0.26700, 0.24500, + 0.22700, 0.21200, 0.20600, 0.20300, 0.20300, + 0.20400, 0.19600, 0.19000, 0.19000, 0.19400, + 0.20100, 0.21000, 0.21600, 0.22500, 0.22800, + 0.23200, 0.23800, 0.24000, 0.23600, 0.23600, + 0.24000, 0.24800, 0.26100, 0.28900, 0.32200, + 0.36200, 0.40700, 0.44600, 0.48800, 0.51200, + 0.54600, 0.54600, 0.55500, 0.56300, 0.56400, + 0.57500, 0.57800, 0.58600, 0.59000, 0.58900, + 0.60100, 0.60400, 0.60600, 0.60500, 0.61400, + 0.61600, 0.61700 + } + }, + /* 6 Bluish green */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.10800, 0.13200, 0.16800, 0.21300, 0.26000, + 0.29200, 0.30800, 0.31700, 0.32000, 0.32800, + 0.33600, 0.34200, 0.35200, 0.36000, 0.37100, + 0.38600, 0.40500, 0.43300, 0.46500, 0.49700, + 0.52800, 0.55700, 0.57600, 0.59100, 0.58600, + 0.59100, 0.58600, 0.58200, 0.56700, 0.55900, + 0.54500, 0.53300, 0.51200, 0.49200, 0.47200, + 0.44500, 0.42900, 0.40200, 0.38000, 0.35500, + 0.33200, 0.30900, 0.28400, 0.26200, 0.24700, + 0.23300, 0.22400, 0.21700, 0.21200, 0.20900, + 0.20700, 0.20500, 0.20000, 0.19800, 0.19900, + 0.19700, 0.19900, 0.20300, 0.21000, 0.21600, + 0.21800, 0.22600, 0.23200, 0.23600, 0.23800, + 0.24200, 0.24200, 0.23900, 0.23200, 0.22700, + 0.22900, 0.23000, 0.23700, 0.24800, 0.25600, + 0.26900, 0.27400 + } + }, + /* 7 Orange */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.05200, 0.05400, 0.05200, 0.05000, 0.05200, + 0.05200, 0.05200, 0.05100, 0.05000, 0.05000, + 0.05200, 0.05000, 0.05100, 0.05100, 0.05200, + 0.05100, 0.05100, 0.05300, 0.05300, 0.05400, + 0.05500, 0.05600, 0.05500, 0.05800, 0.06100, + 0.06300, 0.06800, 0.07700, 0.08600, 0.09800, + 0.12000, 0.14500, 0.17500, 0.20600, 0.23600, + 0.27000, 0.30200, 0.34100, 0.37500, 0.41000, + 0.44000, 0.46700, 0.48800, 0.50900, 0.51800, + 0.53200, 0.54000, 0.55100, 0.55700, 0.56200, + 0.56800, 0.57500, 0.58100, 0.58400, 0.58500, + 0.59000, 0.60100, 0.59600, 0.60000, 0.59600, + 0.60400, 0.60300, 0.60600, 0.60700, 0.60800, + 0.61500, 0.61700, 0.62100, 0.62200, 0.61900, + 0.62500, 0.62800, 0.63000, 0.62700, 0.63500, + 0.63900, 0.64000 + } + }, + /* 8 Purplish blue */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.09400, 0.11300, 0.14100, 0.18600, 0.23500, + 0.27500, 0.29700, 0.31600, 0.31700, 0.33300, + 0.34600, 0.35500, 0.36800, 0.37800, 0.38100, + 0.37700, 0.36800, 0.35600, 0.34000, 0.32200, + 0.29600, 0.26900, 0.24100, 0.22000, 0.19700, + 0.18200, 0.16600, 0.15100, 0.13800, 0.12700, + 0.12000, 0.11500, 0.10800, 0.10400, 0.10100, + 0.09500, 0.09000, 0.08400, 0.08200, 0.08100, + 0.08100, 0.08100, 0.08100, 0.08300, 0.08300, + 0.08000, 0.07900, 0.08000, 0.08100, 0.08100, + 0.08400, 0.08900, 0.09200, 0.09600, 0.10300, + 0.10700, 0.11200, 0.11100, 0.11200, 0.10900, + 0.10400, 0.10200, 0.09900, 0.09900, 0.10000, + 0.10000, 0.10300, 0.10600, 0.10900, 0.11300, + 0.12200, 0.12700, 0.13800, 0.15300, 0.17300, + 0.19300, 0.21500 + } + }, + /* 9 Moderate red */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.08800, 0.10200, 0.12100, 0.13600, 0.15100, + 0.15300, 0.15100, 0.14400, 0.14200, 0.14100, + 0.13900, 0.13500, 0.13600, 0.13500, 0.13300, + 0.13200, 0.12900, 0.13000, 0.12900, 0.12700, + 0.12100, 0.11800, 0.10900, 0.10500, 0.10500, + 0.10400, 0.10100, 0.10000, 0.09400, 0.09100, + 0.08900, 0.09200, 0.09500, 0.09700, 0.10400, + 0.10900, 0.11100, 0.11300, 0.11600, 0.13400, + 0.16700, 0.22300, 0.29100, 0.36200, 0.42600, + 0.47400, 0.51100, 0.53700, 0.55100, 0.56200, + 0.56500, 0.57000, 0.57500, 0.57400, 0.57900, + 0.57700, 0.57900, 0.57700, 0.58000, 0.58100, + 0.57900, 0.58100, 0.58100, 0.58300, 0.58100, + 0.58100, 0.58000, 0.58600, 0.58500, 0.58400, + 0.58900, 0.58700, 0.59000, 0.58200, 0.58900, + 0.59200, 0.59000 + } + }, + /* 10 Purple */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.08300, 0.10000, 0.12500, 0.15400, 0.18300, + 0.19800, 0.20600, 0.20700, 0.20700, 0.20100, + 0.19400, 0.18400, 0.17500, 0.16300, 0.15400, + 0.14200, 0.12900, 0.12000, 0.10900, 0.10200, + 0.09500, 0.09000, 0.08100, 0.07700, 0.07000, + 0.06700, 0.06500, 0.06300, 0.05900, 0.05800, + 0.05600, 0.05300, 0.05200, 0.05200, 0.05100, + 0.05300, 0.05500, 0.05600, 0.05400, 0.05200, + 0.05300, 0.04900, 0.05100, 0.05500, 0.05800, + 0.06300, 0.07300, 0.08700, 0.10300, 0.12000, + 0.13700, 0.14900, 0.16100, 0.17500, 0.18800, + 0.19700, 0.20800, 0.21800, 0.22900, 0.24100, + 0.24900, 0.26200, 0.27200, 0.28400, 0.29200, + 0.30400, 0.31200, 0.32500, 0.32900, 0.33300, + 0.34300, 0.34600, 0.35000, 0.35000, 0.35900, + 0.36000, 0.36200 + } + }, + /* 11 Yellow green */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.04500, 0.04800, 0.05000, 0.05000, 0.05400, + 0.05300, 0.05300, 0.05500, 0.05300, 0.05700, + 0.05900, 0.05900, 0.06200, 0.06500, 0.07000, + 0.07500, 0.08100, 0.09200, 0.10200, 0.11600, + 0.13600, 0.15800, 0.18500, 0.22500, 0.27400, + 0.32800, 0.39000, 0.44600, 0.48500, 0.51100, + 0.52900, 0.53800, 0.53900, 0.53500, 0.52600, + 0.52100, 0.51100, 0.50000, 0.48400, 0.46700, + 0.45000, 0.43500, 0.41200, 0.39500, 0.37700, + 0.36300, 0.35200, 0.34600, 0.33900, 0.33700, + 0.33700, 0.33100, 0.32600, 0.32200, 0.32300, + 0.32000, 0.32500, 0.32700, 0.33400, 0.34000, + 0.34700, 0.35500, 0.36200, 0.36900, 0.37300, + 0.37600, 0.37500, 0.37900, 0.37200, 0.36500, + 0.36700, 0.37500, 0.37900, 0.38800, 0.40300, + 0.41500, 0.43000 + } + }, + /* 12 Orange yellow */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.04900, 0.05200, 0.05400, 0.05500, 0.05400, + 0.05700, 0.05700, 0.05900, 0.05700, 0.05700, + 0.05900, 0.05700, 0.05800, 0.06000, 0.06100, + 0.06100, 0.06200, 0.06700, 0.07200, 0.08100, + 0.08800, 0.09800, 0.10600, 0.11200, 0.12000, + 0.13000, 0.14300, 0.16300, 0.18800, 0.21800, + 0.25600, 0.30400, 0.35100, 0.39900, 0.44200, + 0.47600, 0.50500, 0.53200, 0.54400, 0.56100, + 0.57900, 0.53900, 0.59700, 0.60400, 0.61700, + 0.61700, 0.61800, 0.62400, 0.62500, 0.63000, + 0.64700, 0.63500, 0.63800, 0.64200, 0.64900, + 0.65000, 0.64900, 0.65000, 0.67700, 0.65700, + 0.65300, 0.65900, 0.65800, 0.66200, 0.66100, + 0.66600, 0.66800, 0.67200, 0.67100, 0.66700, + 0.67700, 0.67800, 0.68200, 0.67800, 0.68600, + 0.69300, 0.69000 + } + }, + /* 13 Blue */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.06800, 0.08400, 0.10400, 0.12700, 0.15600, + 0.17800, 0.19400, 0.20900, 0.22100, 0.23400, + 0.25000, 0.26400, 0.28700, 0.30800, 0.31800, + 0.32300, 0.31700, 0.30300, 0.27600, 0.25500, + 0.22500, 0.19300, 0.16000, 0.13900, 0.11700, + 0.10400, 0.08700, 0.07700, 0.06600, 0.06000, + 0.05600, 0.05300, 0.05000, 0.04700, 0.04500, + 0.04200, 0.04300, 0.04000, 0.04000, 0.03800, + 0.03800, 0.03700, 0.03600, 0.03700, 0.03800, + 0.03600, 0.03700, 0.03700, 0.03700, 0.03900, + 0.03900, 0.04200, 0.04000, 0.04200, 0.04400, + 0.04500, 0.04700, 0.04800, 0.05000, 0.04800, + 0.04600, 0.05000, 0.04800, 0.05100, 0.04900, + 0.05200, 0.05400, 0.05700, 0.06000, 0.06500, + 0.06900, 0.07600, 0.08700, 0.10200, 0.12300, + 0.14700, 0.17400 + } + }, + /* 14 Green */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.04500, 0.04800, 0.05400, 0.05400, 0.05700, + 0.05900, 0.06000, 0.06000, 0.06000, 0.06200, + 0.05400, 0.06400, 0.06900, 0.07000, 0.07500, + 0.07900, 0.08300, 0.09000, 0.09900, 0.10900, + 0.12000, 0.13200, 0.14400, 0.15800, 0.17500, + 0.19600, 0.23100, 0.27200, 0.30700, 0.33800, + 0.35200, 0.35700, 0.35300, 0.34100, 0.32300, + 0.30500, 0.28600, 0.26500, 0.24400, 0.22400, + 0.20300, 0.18000, 0.16100, 0.14400, 0.12400, + 0.10800, 0.09800, 0.08900, 0.08400, 0.08000, + 0.07600, 0.07500, 0.07100, 0.07100, 0.07000, + 0.06700, 0.06700, 0.06700, 0.06800, 0.07000, + 0.07000, 0.07400, 0.07600, 0.07900, 0.08000, + 0.08200, 0.08600, 0.08500, 0.08300, 0.08100, + 0.08100, 0.08100, 0.08300, 0.08600, 0.09100, + 0.09400, 0.09800 + } + }, + /* 15 Red */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.04300, 0.04500, 0.04600, 0.04500, 0.04700, + 0.04600, 0.04800, 0.04600, 0.04600, 0.04600, + 0.04800, 0.04400, 0.04600, 0.04700, 0.04700, + 0.04700, 0.04600, 0.04600, 0.04400, 0.04400, + 0.04000, 0.04200, 0.03900, 0.04000, 0.04000, + 0.03900, 0.04000, 0.04000, 0.03800, 0.03800, + 0.03900, 0.03800, 0.04000, 0.04000, 0.04100, + 0.04200, 0.04400, 0.04600, 0.04700, 0.05400, + 0.06400, 0.08100, 0.11200, 0.15600, 0.21600, + 0.28300, 0.35800, 0.43400, 0.49900, 0.54900, + 0.58500, 0.60700, 0.62400, 0.63300, 0.65000, + 0.65200, 0.65200, 0.65600, 0.66100, 0.66600, + 0.66400, 0.67100, 0.67100, 0.67700, 0.67300, + 0.67800, 0.68000, 0.68900, 0.68800, 0.68500, + 0.69100, 0.69400, 0.69600, 0.69200, 0.69800, + 0.70400, 0.70000 + } + }, + /* 16 Yellow */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.04700, 0.04700, 0.04800, 0.04700, 0.05000, + 0.05200, 0.05200, 0.05100, 0.05100, 0.05300, + 0.05300, 0.05300, 0.05700, 0.05600, 0.05800, + 0.06000, 0.06200, 0.06700, 0.07600, 0.09000, + 0.10900, 0.14200, 0.18300, 0.22800, 0.27400, + 0.31900, 0.36000, 0.40500, 0.44300, 0.47500, + 0.51000, 0.54400, 0.57100, 0.59400, 0.61200, + 0.63000, 0.64600, 0.65600, 0.66800, 0.67700, + 0.69100, 0.69600, 0.70100, 0.70200, 0.72900, + 0.70100, 0.70400, 0.70700, 0.70800, 0.71300, + 0.72100, 0.71600, 0.71700, 0.71800, 0.72600, + 0.72900, 0.73000, 0.72800, 0.74700, 0.73900, + 0.73700, 0.74300, 0.74000, 0.75600, 0.74200, + 0.74900, 0.75100, 0.75300, 0.75400, 0.75000, + 0.76000, 0.76200, 0.76900, 0.76200, 0.77400, + 0.77600, 0.77900 + } + }, + /* 17 Magenta */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.10600, 0.12900, 0.16800, 0.22900, 0.29700, + 0.34600, 0.36700, 0.37200, 0.37700, 0.37300, + 0.36200, 0.35100, 0.34000, 0.32300, 0.30600, + 0.29300, 0.27600, 0.25900, 0.25000, 0.23400, + 0.22000, 0.20600, 0.19000, 0.17900, 0.16900, + 0.16300, 0.15200, 0.14000, 0.12600, 0.11300, + 0.10400, 0.09800, 0.09800, 0.10200, 0.10400, + 0.10300, 0.10400, 0.10300, 0.10600, 0.11800, + 0.14000, 0.17000, 0.21200, 0.25700, 0.31300, + 0.35400, 0.40300, 0.45700, 0.50100, 0.54600, + 0.58700, 0.61200, 0.63700, 0.65500, 0.67700, + 0.68400, 0.69300, 0.69500, 0.71400, 0.71000, + 0.72000, 0.71500, 0.71400, 0.73900, 0.71900, + 0.72600, 0.72800, 0.73300, 0.73700, 0.73200, + 0.74300, 0.74200, 0.74800, 0.74100, 0.75300, + 0.75400, 0.76100 + } + }, + /* 18 Cyan */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.08500, 0.10200, 0.13000, 0.16300, 0.20100, + 0.22800, 0.24700, 0.25400, 0.26200, 0.27800, + 0.28200, 0.30000, 0.31900, 0.33200, 0.34800, + 0.36300, 0.38200, 0.40100, 0.41900, 0.43100, + 0.43800, 0.44100, 0.43800, 0.42900, 0.41500, + 0.40400, 0.38100, 0.35800, 0.33900, 0.31600, + 0.28800, 0.26200, 0.23600, 0.21000, 0.18600, + 0.16200, 0.14200, 0.12900, 0.11600, 0.10500, + 0.09900, 0.09200, 0.08800, 0.08600, 0.08100, + 0.07700, 0.07800, 0.07600, 0.07600, 0.07600, + 0.07600, 0.07600, 0.07600, 0.07700, 0.07800, + 0.07700, 0.08100, 0.08000, 0.08100, 0.07900, + 0.07900, 0.07900, 0.07700, 0.07600, 0.07500, + 0.07400, 0.07400, 0.07600, 0.07700, 0.08100, + 0.08400, 0.09000, 0.09800, 0.11100, 0.13000, + 0.15100, 0.17900 + } + }, + /* 19 White */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.12600, 0.16900, 0.21200, 0.26400, 0.31800, + 0.49100, 0.66400, 0.75700, 0.85100, 0.86800, + 0.88700, 0.88800, 0.89000, 0.89300, 0.89500, + 0.89600, 0.89800, 0.90000, 0.90200, 0.90000, + 0.89700, 0.90400, 0.90100, 0.90000, 0.90000, + 0.89800, 0.89700, 0.90000, 0.90200, 0.90200, + 0.90100, 0.90000, 0.89900, 0.89600, 0.89300, + 0.89500, 0.89800, 0.90000, 0.90200, 0.90400, + 0.90500, 0.90600, 0.90700, 0.90500, 0.90300, + 0.90400, 0.90500, 0.90700, 0.89800, 0.89700, + 0.89600, 0.89800, 0.90000, 0.90000, 0.89900, + 0.90100, 0.90400, 0.90400, 0.90500, 0.90200, + 0.89900, 0.89900, 0.90000, 0.89900, 0.89800, + 0.89800, 0.89900, 0.89800, 0.89800, 0.89900, + 0.90100, 0.89800, 0.89600, 0.89500, 0.89800, + 0.89900, 0.89800 + } + }, + /* 20 Neutral 8 */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.08400, 0.11300, 0.14100, 0.17600, 0.21100, + 0.32700, 0.44200, 0.50400, 0.56700, 0.57800, + 0.59000, 0.59100, 0.59200, 0.59400, 0.59500, + 0.59600, 0.59700, 0.59900, 0.60000, 0.59900, + 0.59700, 0.60200, 0.59900, 0.59900, 0.59900, + 0.59700, 0.59700, 0.59900, 0.60000, 0.60000, + 0.59900, 0.59900, 0.59800, 0.59600, 0.59400, + 0.59500, 0.59700, 0.59900, 0.60000, 0.60200, + 0.60200, 0.60300, 0.60400, 0.60200, 0.60100, + 0.60200, 0.60200, 0.60400, 0.59700, 0.59700, + 0.59600, 0.59700, 0.59900, 0.59900, 0.59800, + 0.59900, 0.60200, 0.60200, 0.60200, 0.60000, + 0.59800, 0.59800, 0.59900, 0.59800, 0.59700, + 0.59700, 0.59800, 0.59700, 0.59700, 0.59800, + 0.59900, 0.59700, 0.59600, 0.59500, 0.59700, + 0.59800, 0.59700 + } + }, + /* 21 Neutral 6.5 */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.05100, 0.06800, 0.08500, 0.10600, 0.12800, + 0.19800, 0.26700, 0.30500, 0.34200, 0.34900, + 0.35700, 0.35700, 0.35800, 0.35900, 0.36000, + 0.36000, 0.36100, 0.36200, 0.36300, 0.36200, + 0.36100, 0.36400, 0.36200, 0.36200, 0.36200, + 0.36100, 0.36100, 0.36200, 0.36300, 0.36300, + 0.36200, 0.36200, 0.36100, 0.36000, 0.35900, + 0.36000, 0.36100, 0.36200, 0.36300, 0.36400, + 0.36400, 0.36400, 0.36500, 0.36400, 0.36300, + 0.36400, 0.36400, 0.36500, 0.36100, 0.36100, + 0.36000, 0.36100, 0.36200, 0.36200, 0.36100, + 0.36200, 0.36400, 0.36400, 0.36400, 0.36300, + 0.36100, 0.36100, 0.36200, 0.36100, 0.36100, + 0.36100, 0.36100, 0.36100, 0.36100, 0.36100, + 0.36200, 0.36100, 0.36000, 0.36000, 0.36100, + 0.36100, 0.36100 + } + }, + /* 22 Neutral 5 */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.02770, 0.03720, 0.04650, 0.05800, 0.06980, + 0.10790, 0.14570, 0.16630, 0.18690, 0.19070, + 0.19470, 0.19490, 0.19540, 0.19600, 0.19650, + 0.19670, 0.19710, 0.19760, 0.19800, 0.19760, + 0.19690, 0.19850, 0.19780, 0.19760, 0.19760, + 0.19710, 0.19690, 0.19760, 0.19800, 0.19800, + 0.19780, 0.19760, 0.19740, 0.19670, 0.19600, + 0.19650, 0.19710, 0.19760, 0.19800, 0.19850, + 0.19870, 0.19890, 0.19910, 0.19870, 0.19820, + 0.19850, 0.19870, 0.19910, 0.19710, 0.19690, + 0.19670, 0.19710, 0.19760, 0.19760, 0.19740, + 0.19780, 0.19850, 0.19850, 0.19870, 0.19800, + 0.19740, 0.19740, 0.19760, 0.19740, 0.19710, + 0.19710, 0.19740, 0.19710, 0.19710, 0.19740, + 0.19780, 0.19710, 0.19670, 0.19650, 0.19710, + 0.19740, 0.19710 + } + }, + /* 23 Neutral 3.5 */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.01260, 0.01690, 0.02120, 0.02640, 0.03180, + 0.04910, 0.06640, 0.07570, 0.08510, 0.08680, + 0.08860, 0.08870, 0.08890, 0.08930, 0.08950, + 0.08960, 0.08980, 0.09000, 0.09020, 0.09000, + 0.08970, 0.09040, 0.09010, 0.09000, 0.09000, + 0.08980, 0.08970, 0.09000, 0.09020, 0.09020, + 0.09010, 0.09000, 0.08990, 0.08960, 0.08930, + 0.08950, 0.08980, 0.09000, 0.09020, 0.09040, + 0.09050, 0.09060, 0.09070, 0.09050, 0.09030, + 0.09040, 0.09050, 0.09070, 0.08980, 0.08970, + 0.08960, 0.08980, 0.09000, 0.09000, 0.08990, + 0.09010, 0.09040, 0.09040, 0.09050, 0.09020, + 0.08990, 0.08990, 0.09000, 0.08990, 0.08980, + 0.08980, 0.08990, 0.08980, 0.08980, 0.08990, + 0.09010, 0.08980, 0.08960, 0.08950, 0.08980, + 0.08990, 0.08980 + } + }, + /* 24 Black */ + { + 77, 380.0, 760.0, /* 77 bands from 380 to 760 nm in 5nm steps */ + 1.0, /* Scale factor */ + { + 0.00439, 0.00589, 0.00737, 0.00919, 0.01105, + 0.01708, 0.02308, 0.02635, 0.02961, 0.03020, + 0.03084, 0.03087, 0.03094, 0.03105, 0.03112, + 0.03115, 0.03122, 0.03129, 0.03136, 0.03129, + 0.03119, 0.03143, 0.03133, 0.03129, 0.03129, + 0.03122, 0.03119, 0.03129, 0.03136, 0.03136, + 0.03133, 0.03129, 0.03126, 0.03115, 0.03105, + 0.03112, 0.03122, 0.03129, 0.03136, 0.03143, + 0.03147, 0.03150, 0.03154, 0.03147, 0.03140, + 0.03143, 0.03147, 0.03154, 0.03122, 0.03119, + 0.03115, 0.03122, 0.03129, 0.03129, 0.03126, + 0.03133, 0.03143, 0.03143, 0.03147, 0.03136, + 0.03126, 0.03126, 0.03129, 0.03126, 0.03122, + 0.03122, 0.03126, 0.03122, 0.03122, 0.03126, + 0.03133, 0.03122, 0.03115, 0.03112, 0.03122, + 0.03126, 0.03122 + } + } +}; /* -------------------------------- */ /* Fluorescent Whitening Agent Data */ @@ -3076,7 +3888,7 @@ int write_nxspect(char *fname, xspect *sp, int nspec, int type) { return 0; } -/* restore a set of spectrum from a CGATS file. */ +/* Restore a set of spectrum from a CGATS file. */ /* Up to nspec will be restored starting at offset off.. */ /* The number restored from the file will be written to *nret */ /* type: 0 = any, mask: 1 = SPECT, 2 = CMF, 4 = ccss */ @@ -3221,8 +4033,10 @@ int write_cmf(char *fname, xspect sp[3]) { int read_cmf(xspect sp[3], char *fname) { int rv, nret; - if ((rv = read_nxspect(sp, fname, &nret, 0, 3, 2)) != 0) + if ((rv = read_nxspect(sp, fname, &nret, 0, 3, 2)) != 0) { + DBG("read_nxspect failed\n"); return rv; + } if (nret != 3) { DBG("Didn't read three spectra\n"); return 1; @@ -3578,6 +4392,49 @@ void xspect_plot(xspect *sp1, xspect *sp2, xspect *sp3) { do_plot(xx, y1, sp2 != NULL ? y2 : NULL, sp3 != NULL ? y3 : NULL, j); } + +/* Plot up to 10 spectra */ +void xspect_plot10(xspect *sp, int n) { + double xx[XSPECT_MAX_BANDS]; + double *yp[10]; + double yy[10][XSPECT_MAX_BANDS]; + double wl, wlshort, wllong; + int i, j; + + for (i = 0; i < 10; i++) + yp[i] = NULL; + + if (sp == NULL) + return; + + wlshort = sp->spec_wl_short; + wllong = sp->spec_wl_long; + + for (i = 0; i < n; i++) { + if (sp[i].spec_wl_short < wlshort) + wlshort = sp[i].spec_wl_short; + if (sp[i].spec_wl_long > wllong) + wllong = sp[i].spec_wl_long; + } + + wlshort = floor(wlshort + 0.5); + wllong = floor(wllong + 0.5); + + /* Compute at 1nm intervals over the whole range covered */ + for (j = 0, wl = wlshort; j < XSPECT_MAX_BANDS && wl < wllong; j++, wl += 1.0) { +#if defined(__APPLE__) && defined(__POWERPC__) + gcc_bug_fix(j); +#endif + xx[j] = wl; + for (i = 0; i < n; i++) { + yp[i] = yy[i]; + yy[i][j] = value_xspect(&sp[i], wl); + } + } + do_plot10(xx, yp[0], yp[1], yp[2], yp[3], yp[4], + yp[5], yp[6], yp[7], yp[8], yp[9], j, 0); +} + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Given an emission spectrum, set the UV output to the given level. */ @@ -3787,7 +4644,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { DBG("set_fwa started\n"); - p->bw = 1.0; /* Intergrate over 1nm bands */ + p->fwa_bw = 1.0; /* Intergrate over 1nm bands */ p->oillum = p->illuminant; /* Take copy of observer illuminant */ xspect_denorm(&p->oillum); if (p->tillum.spec_n == 0) { /* If not set by set_fwa(), copy observer illuminant */ @@ -3801,7 +4658,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { double Iim; /* illuminant multiplier */ Iim = 0.0; - for (ww = p->observer[1].spec_wl_short; ww <= p->observer[1].spec_wl_long; ww += p->bw) { + for (ww = p->spec_wl_short; ww <= p->spec_wl_long; ww += p->spec_bw) { double O, I; getval_lxspec(&p->iillum, &I, ww); getval_lxspec(&p->observer[1], &O, ww); @@ -3824,7 +4681,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { scale = 0.0; Itm = 0.0; - for (ww = p->observer[1].spec_wl_short; ww <= p->observer[1].spec_wl_long; ww += p->bw) { + for (ww = p->spec_wl_short; ww <= p->spec_wl_long; ww += p->spec_bw) { double O, I; getval_lxspec(&p->tillum, &I, ww); getval_lxspec(&p->observer[1], &O, ww); @@ -3865,7 +4722,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { scale = 0.0; Itm = 0.0; - for (ww = p->observer[1].spec_wl_short; ww <= p->observer[1].spec_wl_long; ww += p->bw) { + for (ww = p->spec_wl_short; ww <= p->spec_wl_long; ww += p->spec_bw) { double O, I; getval_lxspec(&p->oillum, &I, ww); getval_lxspec(&p->observer[1], &O, ww); @@ -3890,7 +4747,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { /* Find darkest point between 450 and 510nm */ ar = 1e6; - for (ww = 450.0; ww <= 510.0; ww += p->bw) { + for (ww = 450.0; ww <= 510.0; ww += p->fwa_bw) { double rr; getval_lxspec(&p->imedia, &rr, ww); DBGF((DBGA,"media %f = %f\n",ww,rr)); @@ -3903,7 +4760,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { /* Find lightest point between A point+70 and 650 */ br = -1.0; - for (ww = aw+70.0; ww <= 630.0; ww += p->bw) { + for (ww = aw+70.0; ww <= 630.0; ww += p->fwa_bw) { double rr; getval_lxspec(&p->imedia, &rr, ww); DBGF((DBGA,"media %f = %f\n",ww,rr)); @@ -3921,7 +4778,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { /* Compute an Em that explains the bump over the flat line */ Em = 0.0; - for (ww = FWA1_emit.spec_wl_short; ww <= (FWA1_emit.spec_wl_long - 100.0); ww += p->bw) { + for (ww = FWA1_emit.spec_wl_short; ww <= (FWA1_emit.spec_wl_long - 100.0); ww += p->fwa_bw) { double Rl, rr; /* Compute value of line at this wavelength */ @@ -4085,7 +4942,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { /* Compute level of UV stimulating FWA */ p->Sm = 0.0; - for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->bw) { + for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->fwa_bw) { double Ii; double Su; @@ -4099,7 +4956,7 @@ static int xsp2cie_set_fwa_imp(xsp2cie *p) { /* Compute FWA content of this media, for information purposes */ p->FWAc = 0.0; - for (ww = p->emits.spec_wl_short; ww <= p->emits.spec_wl_long; ww += p->bw) { + for (ww = p->emits.spec_wl_short; ww <= p->emits.spec_wl_long; ww += p->fwa_bw) { double Eu; getval_lxspec(&p->emits, &Eu, ww); /* FWA emission at this wavelength */ @@ -4250,7 +5107,7 @@ xspect *in /* Spectrum to be converted */ Emc = Emct = 0.0; for (k = 0; k < 4; k++) { Smct = Smc = 0.0; - for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->bw) { + for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->fwa_bw) { double Kc; /* FWA contribution for instrument illum */ double Kct; /* FWA contribution for target illum */ double Ii; /* Instrument illuminant level */ @@ -4312,9 +5169,9 @@ xspect *in /* Spectrum to be converted */ #endif /* DEBUG */ } - /* Compute CIE output over observer range in 1nm increments */ + /* Compute CIE output over observer range in bw increments */ scale = 0.0; - for (ww = p->observer[1].spec_wl_short; ww <= p->observer[1].spec_wl_long; ww += p->bw) { + for (ww = p->spec_wl_short; ww <= p->spec_wl_long; ww += p->spec_bw) { double Kc; /* FWA contribution for instrument illum */ double Kct; /* FWA contribution for target illum */ double Ii; /* Instrument illuminant level */ @@ -4421,10 +5278,10 @@ xspect *in /* Spectrum to be converted */ /* Do it again for output over optional returned spectrum range */ if (sout != NULL) { - tsout.spec_n = in->spec_n; + tsout.spec_n = in->spec_n; tsout.spec_wl_short = in->spec_wl_short; - tsout.spec_wl_long = in->spec_wl_long; - tsout.norm = in->norm; + tsout.spec_wl_long = in->spec_wl_long; + tsout.norm = in->norm; for (i = 0; i < in->spec_n; i++) { double Kc; /* FWA contribution for instrument illum */ @@ -4527,7 +5384,7 @@ xspect *in /* Spectrum to be converted, normalised by norm */ Emc = 0.0; for (k = 0; k < 4; k++) { Smc = 0.0; - for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->bw) { + for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->fwa_bw) { double Kc; /* FWA contribution for instrument illum */ double Ii; /* Instrument illuminant level */ double Su; /* FWA sensitivity */ @@ -4639,7 +5496,7 @@ xspect *in /* Colorant reflectance to be applied */ Emc = 0.0; for (k = 0; k < 4; k++) { Smc = 0.0; - for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->bw) { + for (ww = FWA1_stim.spec_wl_short; ww <= FWA1_stim.spec_wl_long; ww += p->fwa_bw) { double Kc; /* FWA contribution for instrument illum */ double Ii; /* Instrument illuminant level */ double Eu; /* FWA emmission profile */ @@ -4722,6 +5579,18 @@ xspect *in /* Colorant reflectance to be applied */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #endif /* !SALONEINSTLIB */ +/* Override the integration wavelength range and step size */ +static void xsp2cie_set_int_steps( +xsp2cie *p, /* this */ +double bw, /* Integration step size (nm) */ +double wl_short, /* Starting nm */ +double wl_long /* Ending nm */ +) { + p->spec_bw = bw; + p->spec_wl_short = wl_short; + p->spec_wl_long = wl_long; +} + /* Do the normal spectral to CIE conversion. */ /* Note that the input spectrum normalisation value is used. */ /* Emissive spectral values are assumed to be in mW/nm, and sampled */ @@ -4748,18 +5617,20 @@ xspect *in /* Spectrum to be converted */ /* values are truncated at the extremes, then the last valid values */ /* are used, also consistent with CIE and ANSI CGATS recommendations. */ out[j] = 0.0; - for (ww = p->observer[j].spec_wl_short; ww <= p->observer[j].spec_wl_long; ww += 1.0) { + for (ww = p->spec_wl_short; ww <= p->spec_wl_long; ww += p->spec_bw) { double I = 1.0, O, S; if (!p->isemis) getval_xspec(&p->illuminant, &I, ww); getval_xspec(&p->observer[j], &O, ww); getval_xspec(in, &S, ww); if (j == 1) - scale += I * O; /* Integrate Y illuminant/observer values */ + scale += I * O; /* Integrate Y illuminant * observer values */ out[j] += I * O * S; } } if (p->isemis) { + // Hmm. Should we really make scale += O for this case and then + // scale = 0.683002/scale ?? scale = 0.683002; /* Convert from mW/m^2 to Lumens/m^2 */ /* (== 683 Luments/Watt/m^2) */ } else { @@ -4917,6 +5788,11 @@ icxClamping clamp /* NZ to clamp XYZ/Lab to be +ve */ p->observer[1] = ob_Shaw_Fairchild_2[1]; p->observer[2] = ob_Shaw_Fairchild_2[2]; break; + case icxOT_EBU_2012: + p->observer[0] = ob_EBU_2012[0]; + p->observer[1] = ob_EBU_2012[1]; + p->observer[2] = ob_EBU_2012[2]; + break; #endif /* !SALONEINSTLIB */ default: DBGF((DBGA,"new_xsp2cie() unrecognised observer type 0x%x\n",obType)); @@ -4938,18 +5814,23 @@ icxClamping clamp /* NZ to clamp XYZ/Lab to be +ve */ p->clamp = clamp; - p->convert = xsp2cie_convert; - p->sconvert = xsp2cie_sconvert; - p->get_cie_il = xsp2cie_get_cie_il; + p->spec_bw = 1.0; /* 1nm integration */ + p->spec_wl_short = p->observer[1].spec_wl_short; + p->spec_wl_long = p->observer[1].spec_wl_long; + + p->set_int_steps = xsp2cie_set_int_steps; + p->convert = xsp2cie_convert; + p->sconvert = xsp2cie_sconvert; + p->get_cie_il = xsp2cie_get_cie_il; #ifndef SALONEINSTLIB - p->set_mw = xsp2cie_set_mw; /* Default no media white */ - p->set_fwa = xsp2cie_set_fwa; /* Default no FWA compensation */ + p->set_mw = xsp2cie_set_mw; /* Default no media white */ + p->set_fwa = xsp2cie_set_fwa; /* Default no FWA compensation */ p->update_fwa_custillum = xsp2cie_update_fwa_custillum; - p->get_fwa_info = xsp2cie_get_fwa_info; - p->extract = xsp2cie_extract; - p->apply = xsp2cie_apply; + p->get_fwa_info = xsp2cie_get_fwa_info; + p->extract = xsp2cie_extract; + p->apply = xsp2cie_apply; #endif /* !SALONEINSTLIB */ - p->del = xsp2cie_del; + p->del = xsp2cie_del; return p; } @@ -5001,33 +5882,370 @@ int icx_spectrum_locus(double xyz[3], double wl, icxObserverType obType) { /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Pre-calculated spectral locuses of Daylight and Plankian at 5 Mired intervals, */ -/* created using illlocus.c */ +/* used by the fast but slightly less accurate CCT support icx_XYZ2ill_ct2() */ +/* Created using illlocus.c */ + /* These aren't actually spectrum, they are XYZ values */ /* indexed by temperature in Mired */ +static xspect illoc_Plankian_CIE_1931_2[3] = { + { + 481, 40.000000, 1000.000000, + 1.0, + { + 1.001190, 1.000021, 0.998861, 0.997711, 0.996571, + 0.995444, 0.994330, 0.993229, 0.992143, 0.991072, + 0.990017, 0.988980, 0.987961, 0.986960, 0.985979, + 0.985018, 0.984078, 0.983159, 0.982263, 0.981390, + 0.980540, 0.979714, 0.978913, 0.978137, 0.977387, + 0.976663, 0.975965, 0.975295, 0.974652, 0.974036, + 0.973449, 0.972890, 0.972359, 0.971858, 0.971385, + 0.970942, 0.970529, 0.970145, 0.969791, 0.969468, + 0.969174, 0.968910, 0.968677, 0.968474, 0.968301, + 0.968159, 0.968047, 0.967965, 0.967914, 0.967893, + 0.967902, 0.967941, 0.968010, 0.968109, 0.968238, + 0.968396, 0.968584, 0.968802, 0.969049, 0.969325, + 0.969629, 0.969963, 0.970325, 0.970715, 0.971134, + 0.971581, 0.972055, 0.972558, 0.973087, 0.973644, + 0.974227, 0.974838, 0.975475, 0.976138, 0.976827, + 0.977542, 0.978282, 0.979048, 0.979839, 0.980655, + 0.981495, 0.982360, 0.983249, 0.984162, 0.985098, + 0.986058, 0.987041, 0.988047, 0.989076, 0.990127, + 0.991200, 0.992295, 0.993412, 0.994551, 0.995711, + 0.996891, 0.998093, 0.999315, 1.000557, 1.001820, + 1.003102, 1.004404, 1.005726, 1.007066, 1.008426, + 1.009804, 1.011201, 1.012616, 1.014050, 1.015501, + 1.016970, 1.018456, 1.019960, 1.021480, 1.023018, + 1.024572, 1.026143, 1.027729, 1.029332, 1.030951, + 1.032586, 1.034236, 1.035901, 1.037581, 1.039276, + 1.040986, 1.042711, 1.044450, 1.046203, 1.047970, + 1.049751, 1.051546, 1.053354, 1.055175, 1.057010, + 1.058857, 1.060718, 1.062591, 1.064477, 1.066375, + 1.068285, 1.070207, 1.072141, 1.074087, 1.076045, + 1.078013, 1.079994, 1.081985, 1.083987, 1.086000, + 1.088024, 1.090059, 1.092103, 1.094159, 1.096224, + 1.098299, 1.100384, 1.102479, 1.104584, 1.106698, + 1.108822, 1.110954, 1.113096, 1.115247, 1.117407, + 1.119575, 1.121752, 1.123938, 1.126132, 1.128334, + 1.130544, 1.132763, 1.134989, 1.137223, 1.139465, + 1.141715, 1.143972, 1.146236, 1.148508, 1.150786, + 1.153072, 1.155365, 1.157665, 1.159971, 1.162284, + 1.164604, 1.166930, 1.169263, 1.171601, 1.173946, + 1.176297, 1.178654, 1.181017, 1.183386, 1.185760, + 1.188140, 1.190526, 1.192917, 1.195313, 1.197715, + 1.200122, 1.202534, 1.204951, 1.207372, 1.209799, + 1.212231, 1.214667, 1.217107, 1.219553, 1.222002, + 1.224456, 1.226915, 1.229377, 1.231844, 1.234315, + 1.236790, 1.239268, 1.241751, 1.244237, 1.246727, + 1.249221, 1.251718, 1.254219, 1.256723, 1.259230, + 1.261741, 1.264255, 1.266772, 1.269292, 1.271816, + 1.274342, 1.276871, 1.279403, 1.281938, 1.284475, + 1.287015, 1.289558, 1.292103, 1.294651, 1.297201, + 1.299753, 1.302308, 1.304865, 1.307424, 1.309985, + 1.312548, 1.315113, 1.317681, 1.320250, 1.322821, + 1.325393, 1.327968, 1.330544, 1.333122, 1.335701, + 1.338282, 1.340865, 1.343448, 1.346034, 1.348620, + 1.351208, 1.353797, 1.356387, 1.358979, 1.361571, + 1.364165, 1.366759, 1.369355, 1.371951, 1.374548, + 1.377146, 1.379745, 1.382345, 1.384945, 1.387546, + 1.390147, 1.392749, 1.395352, 1.397955, 1.400559, + 1.403162, 1.405767, 1.408371, 1.410976, 1.413581, + 1.416186, 1.418792, 1.421397, 1.424003, 1.426609, + 1.429214, 1.431820, 1.434425, 1.437031, 1.439636, + 1.442241, 1.444846, 1.447451, 1.450055, 1.452659, + 1.455263, 1.457866, 1.460469, 1.463072, 1.465674, + 1.468275, 1.470876, 1.473477, 1.476077, 1.478676, + 1.481274, 1.483872, 1.486469, 1.489065, 1.491661, + 1.494255, 1.496849, 1.499442, 1.502034, 1.504625, + 1.507215, 1.509804, 1.512392, 1.514979, 1.517565, + 1.520150, 1.522734, 1.525316, 1.527898, 1.530478, + 1.533057, 1.535634, 1.538211, 1.540786, 1.543359, + 1.545932, 1.548503, 1.551072, 1.553640, 1.556207, + 1.558772, 1.561335, 1.563897, 1.566458, 1.569017, + 1.571574, 1.574130, 1.576684, 1.579236, 1.581787, + 1.584336, 1.586883, 1.589429, 1.591972, 1.594514, + 1.597054, 1.599593, 1.602129, 1.604664, 1.607196, + 1.609727, 1.612256, 1.614782, 1.617307, 1.619830, + 1.622351, 1.624869, 1.627386, 1.629901, 1.632413, + 1.634924, 1.637432, 1.639938, 1.642442, 1.644944, + 1.647444, 1.649941, 1.652436, 1.654929, 1.657420, + 1.659908, 1.662394, 1.664878, 1.667359, 1.669838, + 1.672315, 1.674790, 1.677261, 1.679731, 1.682198, + 1.684663, 1.687125, 1.689585, 1.692042, 1.694497, + 1.696949, 1.699399, 1.701846, 1.704291, 1.706733, + 1.709173, 1.711610, 1.714044, 1.716476, 1.718905, + 1.721331, 1.723755, 1.726176, 1.728594, 1.731010, + 1.733423, 1.735833, 1.738241, 1.740646, 1.743048, + 1.745447, 1.747844, 1.750238, 1.752629, 1.755017, + 1.757402, 1.759785, 1.762164, 1.764541, 1.766915, + 1.769286, 1.771654, 1.774019, 1.776382, 1.778741, + 1.781098, 1.783451, 1.785802, 1.788150, 1.790494, + 1.792836, 1.795175, 1.797511, 1.799843, 1.802173, + 1.804500, 1.806824, 1.809144, 1.811462, 1.813777, + 1.816088, 1.818397, 1.820702, 1.823004, 1.825303, + 1.827600, 1.829893, 1.832182, 1.834469, 1.836753, + 1.839033, 1.841311, 1.843585, 1.845856, 1.848124, + 1.850388, 1.852650, 1.854908, 1.857163, 1.859415, + 1.861664, 1.863909, 1.866152, 1.868391, 1.870627, + 1.872859, 1.875088, 1.877315, 1.879537, 1.881757, + 1.883973, 1.886186, 1.888396, 1.890603, 1.892806, + 1.895006 + } + }, + { + 481, 40.000000, 1000.000000, + 1.0, + { + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 + } + }, + { + 481, 40.000000, 1000.000000, + 1.0, + { + 1.963589, 1.948210, 1.932763, 1.917253, 1.901688, + 1.886072, 1.870411, 1.854712, 1.838981, 1.823223, + 1.807443, 1.791649, 1.775844, 1.760035, 1.744226, + 1.728424, 1.712632, 1.696857, 1.681103, 1.665375, + 1.649677, 1.634014, 1.618391, 1.602811, 1.587278, + 1.571797, 1.556372, 1.541005, 1.525701, 1.510463, + 1.495294, 1.480197, 1.465176, 1.450233, 1.435370, + 1.420591, 1.405897, 1.391292, 1.376777, 1.362354, + 1.348026, 1.333793, 1.319659, 1.305623, 1.291689, + 1.277856, 1.264128, 1.250503, 1.236985, 1.223573, + 1.210269, 1.197073, 1.183986, 1.171008, 1.158141, + 1.145385, 1.132739, 1.120205, 1.107783, 1.095472, + 1.083273, 1.071187, 1.059212, 1.047349, 1.035599, + 1.023960, 1.012432, 1.001016, 0.989711, 0.978517, + 0.967433, 0.956459, 0.945595, 0.934840, 0.924194, + 0.913655, 0.903225, 0.892901, 0.882684, 0.872572, + 0.862566, 0.852664, 0.842867, 0.833172, 0.823580, + 0.814090, 0.804701, 0.795412, 0.786223, 0.777133, + 0.768140, 0.759245, 0.750447, 0.741744, 0.733136, + 0.724623, 0.716202, 0.707875, 0.699638, 0.691493, + 0.683438, 0.675472, 0.667595, 0.659805, 0.652102, + 0.644486, 0.636954, 0.629507, 0.622143, 0.614862, + 0.607663, 0.600545, 0.593508, 0.586550, 0.579671, + 0.572870, 0.566146, 0.559498, 0.552926, 0.546429, + 0.540006, 0.533656, 0.527379, 0.521173, 0.515039, + 0.508975, 0.502980, 0.497055, 0.491197, 0.485407, + 0.479683, 0.474025, 0.468433, 0.462905, 0.457441, + 0.452040, 0.446701, 0.441424, 0.436208, 0.431053, + 0.425958, 0.420921, 0.415943, 0.411023, 0.406160, + 0.401354, 0.396604, 0.391908, 0.387268, 0.382682, + 0.378149, 0.373669, 0.369241, 0.364865, 0.360540, + 0.356266, 0.352042, 0.347867, 0.343741, 0.339663, + 0.335634, 0.331651, 0.327715, 0.323825, 0.319981, + 0.316182, 0.312428, 0.308718, 0.305051, 0.301428, + 0.297847, 0.294308, 0.290811, 0.287356, 0.283941, + 0.280566, 0.277231, 0.273935, 0.270678, 0.267460, + 0.264279, 0.261137, 0.258031, 0.254962, 0.251929, + 0.248932, 0.245971, 0.243045, 0.240153, 0.237295, + 0.234472, 0.231682, 0.228924, 0.226200, 0.223508, + 0.220848, 0.218219, 0.215621, 0.213055, 0.210519, + 0.208013, 0.205536, 0.203089, 0.200672, 0.198282, + 0.195922, 0.193589, 0.191284, 0.189007, 0.186756, + 0.184533, 0.182336, 0.180165, 0.178020, 0.175900, + 0.173806, 0.171737, 0.169692, 0.167672, 0.165676, + 0.163703, 0.161754, 0.159829, 0.157926, 0.156046, + 0.154189, 0.152353, 0.150540, 0.148748, 0.146978, + 0.145229, 0.143501, 0.141793, 0.140106, 0.138439, + 0.136792, 0.135164, 0.133556, 0.131968, 0.130398, + 0.128847, 0.127315, 0.125801, 0.124305, 0.122827, + 0.121366, 0.119924, 0.118498, 0.117090, 0.115698, + 0.114323, 0.112965, 0.111623, 0.110297, 0.108987, + 0.107692, 0.106413, 0.105150, 0.103901, 0.102668, + 0.101449, 0.100245, 0.099055, 0.097880, 0.096719, + 0.095571, 0.094438, 0.093318, 0.092212, 0.091118, + 0.090038, 0.088971, 0.087917, 0.086875, 0.085846, + 0.084829, 0.083825, 0.082832, 0.081852, 0.080883, + 0.079926, 0.078980, 0.078046, 0.077123, 0.076211, + 0.075310, 0.074419, 0.073540, 0.072671, 0.071812, + 0.070964, 0.070126, 0.069298, 0.068480, 0.067672, + 0.066874, 0.066085, 0.065306, 0.064536, 0.063775, + 0.063023, 0.062281, 0.061547, 0.060822, 0.060106, + 0.059399, 0.058700, 0.058009, 0.057327, 0.056653, + 0.055987, 0.055329, 0.054679, 0.054036, 0.053402, + 0.052775, 0.052156, 0.051544, 0.050939, 0.050342, + 0.049752, 0.049169, 0.048593, 0.048023, 0.047461, + 0.046906, 0.046357, 0.045814, 0.045279, 0.044749, + 0.044226, 0.043710, 0.043199, 0.042695, 0.042197, + 0.041704, 0.041218, 0.040737, 0.040262, 0.039793, + 0.039330, 0.038872, 0.038420, 0.037973, 0.037531, + 0.037095, 0.036664, 0.036238, 0.035817, 0.035401, + 0.034990, 0.034584, 0.034183, 0.033787, 0.033396, + 0.033009, 0.032627, 0.032249, 0.031876, 0.031508, + 0.031144, 0.030784, 0.030428, 0.030077, 0.029730, + 0.029387, 0.029049, 0.028714, 0.028383, 0.028056, + 0.027734, 0.027415, 0.027100, 0.026788, 0.026480, + 0.026177, 0.025876, 0.025579, 0.025286, 0.024996, + 0.024710, 0.024427, 0.024148, 0.023872, 0.023599, + 0.023329, 0.023063, 0.022800, 0.022540, 0.022283, + 0.022029, 0.021778, 0.021530, 0.021285, 0.021043, + 0.020804, 0.020568, 0.020334, 0.020104, 0.019876, + 0.019651, 0.019428, 0.019208, 0.018991, 0.018776, + 0.018564, 0.018354, 0.018147, 0.017942, 0.017740, + 0.017540, 0.017343, 0.017148, 0.016955, 0.016764, + 0.016576, 0.016390, 0.016206, 0.016024, 0.015845, + 0.015668, 0.015492, 0.015319, 0.015148, 0.014979, + 0.014811, 0.014646, 0.014483, 0.014322, 0.014162, + 0.014005, 0.013849, 0.013695, 0.013543, 0.013393, + 0.013245, 0.013098, 0.012953, 0.012810, 0.012668, + 0.012528, 0.012390, 0.012253, 0.012118, 0.011985, + 0.011853, 0.011723, 0.011594, 0.011467, 0.011341, + 0.011217, 0.011094, 0.010972, 0.010852, 0.010734, + 0.010617, 0.010501, 0.010386, 0.010273, 0.010161, + 0.010051, 0.009942, 0.009834, 0.009727, 0.009621, + 0.009517, 0.009414, 0.009312, 0.009212, 0.009112, + 0.009014, 0.008917, 0.008821, 0.008726, 0.008632, + 0.008540, 0.008448, 0.008357, 0.008268, 0.008180, + 0.008092 + } + } +}; + static xspect illoc_Daylight_CIE_1931_2[3] = { { - 69, 60.000000, 400.000000, + 181, 40.000000, 400.000000, 1.0, { - 0.970635, 0.968292, 0.966045, 0.963906, 0.961884, - 0.959990, 0.958232, 0.956618, 0.955155, 0.953850, - 0.952710, 0.951740, 0.950945, 0.950330, 0.949899, - 0.949656, 0.949604, 0.949747, 0.950085, 0.950619, - 0.951352, 0.952283, 0.953413, 0.954741, 0.956265, - 0.957984, 0.959896, 0.961999, 0.964289, 0.966764, - 0.969419, 0.972251, 0.975254, 0.978425, 0.981759, - 0.985248, 0.988889, 0.992674, 0.996597, 1.000651, - 1.004828, 1.009121, 1.013522, 1.018021, 1.022611, - 1.027281, 1.032021, 1.036822, 1.041673, 1.046562, - 1.051478, 1.056409, 1.061342, 1.066265, 1.071163, - 1.076024, 1.080834, 1.085577, 1.090239, 1.094805, - 1.099259, 1.103586, 1.107771, 1.111796, 1.115647, - 1.119306, 1.122759, 1.125989, 1.128981 + 0.980513, 0.979463, 0.978420, 0.977383, 0.976353, + 0.975333, 0.974322, 0.973321, 0.972332, 0.971354, + 0.970390, 0.969439, 0.968503, 0.967582, 0.966676, + 0.965787, 0.964916, 0.964062, 0.963227, 0.962412, + 0.961616, 0.960840, 0.960086, 0.959353, 0.958642, + 0.957953, 0.957288, 0.956646, 0.956029, 0.955436, + 0.954867, 0.954325, 0.953808, 0.953317, 0.952852, + 0.952415, 0.952005, 0.951622, 0.951268, 0.950941, + 0.950643, 0.950374, 0.950135, 0.949924, 0.949743, + 0.949592, 0.949471, 0.949381, 0.949321, 0.949292, + 0.949293, 0.949326, 0.949391, 0.949486, 0.949613, + 0.949771, 0.949961, 0.950182, 0.950435, 0.950720, + 0.951037, 0.951386, 0.951766, 0.952178, 0.952622, + 0.953098, 0.953606, 0.954145, 0.954716, 0.955318, + 0.955951, 0.956616, 0.957312, 0.958039, 0.958797, + 0.959585, 0.960405, 0.961254, 0.962134, 0.963043, + 0.963982, 0.964951, 0.965949, 0.966977, 0.968033, + 0.969117, 0.970230, 0.971371, 0.972540, 0.973736, + 0.974959, 0.976209, 0.977486, 0.978788, 0.980117, + 0.981471, 0.982850, 0.984254, 0.985682, 0.987134, + 0.988610, 0.990109, 0.991631, 0.993175, 0.994740, + 0.996328, 0.997936, 0.999565, 1.001214, 1.002882, + 1.004570, 1.006276, 1.008000, 1.009741, 1.011500, + 1.013275, 1.015066, 1.016872, 1.018693, 1.020528, + 1.022376, 1.024238, 1.026112, 1.027997, 1.029894, + 1.031800, 1.033717, 1.035642, 1.037576, 1.039518, + 1.041466, 1.043421, 1.045381, 1.047345, 1.049314, + 1.051286, 1.053260, 1.055236, 1.057212, 1.059189, + 1.061165, 1.063139, 1.065110, 1.067079, 1.069042, + 1.071001, 1.072954, 1.074900, 1.076838, 1.078767, + 1.080687, 1.082596, 1.084493, 1.086378, 1.088250, + 1.090107, 1.091949, 1.093774, 1.095582, 1.097372, + 1.099142, 1.100892, 1.102620, 1.104327, 1.106009, + 1.107668, 1.109300, 1.110907, 1.112485, 1.114036, + 1.115556, 1.117047, 1.118505, 1.119931, 1.121323, + 1.122681, 1.124003, 1.125288, 1.126535, 1.127744, + 1.128913 } }, { - 69, 60.000000, 400.000000, + 181, 40.000000, 400.000000, 1.0, { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, @@ -5043,78 +6261,183 @@ static xspect illoc_Daylight_CIE_1931_2[3] = { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, - 1.000000, 1.000000, 1.000000, 1.000000 + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 } }, { - 69, 60.000000, 400.000000, + 181, 40.000000, 400.000000, 1.0, { - 1.787622, 1.747661, 1.707659, 1.667701, 1.627864, - 1.588223, 1.548842, 1.509780, 1.471093, 1.432827, - 1.395026, 1.357727, 1.320965, 1.284767, 1.249158, - 1.214160, 1.179790, 1.146125, 1.113225, 1.081024, - 1.049542, 1.018793, 0.988790, 0.959541, 0.931050, - 0.903320, 0.876351, 0.850140, 0.824684, 0.799977, - 0.776012, 0.752780, 0.730272, 0.708479, 0.687390, - 0.666992, 0.647275, 0.628227, 0.609834, 0.592085, - 0.574967, 0.558466, 0.542572, 0.527270, 0.512549, - 0.498396, 0.484799, 0.471746, 0.459226, 0.447227, - 0.435739, 0.424749, 0.414250, 0.404229, 0.394677, - 0.385586, 0.376946, 0.368749, 0.360986, 0.353651, - 0.346735, 0.340234, 0.334139, 0.328447, 0.323151, - 0.318248, 0.313734, 0.309607, 0.305862 + 1.943602, 1.928150, 1.912613, 1.897001, 1.881321, + 1.865580, 1.849784, 1.833942, 1.818059, 1.802142, + 1.786198, 1.770233, 1.754253, 1.738263, 1.722270, + 1.706279, 1.690295, 1.674323, 1.658369, 1.642436, + 1.626531, 1.610657, 1.594819, 1.579020, 1.563266, + 1.547559, 1.531903, 1.516302, 1.500760, 1.485279, + 1.469863, 1.454514, 1.439236, 1.424031, 1.408902, + 1.393851, 1.378881, 1.363993, 1.349191, 1.334475, + 1.319847, 1.305310, 1.290866, 1.276515, 1.262259, + 1.248099, 1.234037, 1.220075, 1.206212, 1.192450, + 1.178790, 1.165233, 1.151811, 1.138526, 1.125350, + 1.112284, 1.099330, 1.086490, 1.073764, 1.061153, + 1.048660, 1.036283, 1.024025, 1.011886, 0.999866, + 0.987966, 0.976187, 0.964529, 0.952992, 0.941577, + 0.930283, 0.919111, 0.908061, 0.897132, 0.886325, + 0.875640, 0.865075, 0.854632, 0.844310, 0.834108, + 0.824027, 0.814065, 0.804222, 0.794499, 0.784893, + 0.775406, 0.766036, 0.756782, 0.747645, 0.738623, + 0.729716, 0.720923, 0.712244, 0.703678, 0.695223, + 0.686881, 0.678648, 0.670526, 0.662513, 0.654608, + 0.646811, 0.639121, 0.631537, 0.624058, 0.616683, + 0.609412, 0.602244, 0.595178, 0.588213, 0.581349, + 0.574584, 0.567919, 0.561351, 0.554880, 0.548506, + 0.542227, 0.536043, 0.529953, 0.523956, 0.518051, + 0.512238, 0.506516, 0.500884, 0.495341, 0.489887, + 0.484521, 0.479241, 0.474048, 0.468940, 0.463917, + 0.458978, 0.454122, 0.449349, 0.444657, 0.440047, + 0.435518, 0.431068, 0.426697, 0.422405, 0.418191, + 0.414054, 0.409993, 0.406009, 0.402099, 0.398265, + 0.394504, 0.390817, 0.387203, 0.383662, 0.380192, + 0.376793, 0.373466, 0.370208, 0.367020, 0.363902, + 0.360852, 0.357870, 0.354957, 0.352110, 0.349331, + 0.346618, 0.343971, 0.341389, 0.338873, 0.336422, + 0.334036, 0.331714, 0.329455, 0.327260, 0.325129, + 0.323060, 0.321055, 0.319111, 0.317230, 0.315412, + 0.313654, 0.311959, 0.310325, 0.308753, 0.307241, + 0.305791 } } }; -static xspect illoc_Plankian_CIE_1931_2[3] = { +static xspect illoc_OPlankian_CIE_1931_2[3] = { { - 189, 60.000000, 1000.000000, + 481, 40.000000, 1000.000000, 1.0, { - 0.990017, 0.987458, 0.985018, 0.982708, 0.980540, - 0.978522, 0.976663, 0.974970, 0.973449, 0.972105, - 0.970942, 0.969965, 0.969174, 0.968572, 0.968159, - 0.967936, 0.967902, 0.968056, 0.968396, 0.968922, - 0.969629, 0.970517, 0.971581, 0.972819, 0.974227, - 0.975803, 0.977542, 0.979441, 0.981495, 0.983702, - 0.986058, 0.988559, 0.991200, 0.993979, 0.996891, - 0.999934, 1.003102, 1.006394, 1.009804, 1.013331, - 1.016970, 1.020718, 1.024572, 1.028529, 1.032586, - 1.036739, 1.040986, 1.045325, 1.049751, 1.054263, - 1.058857, 1.063532, 1.068285, 1.073113, 1.078013, - 1.082985, 1.088024, 1.093130, 1.098299, 1.103530, - 1.108822, 1.114170, 1.119575, 1.125034, 1.130544, - 1.136105, 1.141715, 1.147371, 1.153072, 1.158817, - 1.164604, 1.170431, 1.176297, 1.182201, 1.188140, - 1.194115, 1.200122, 1.206161, 1.212231, 1.218329, - 1.224456, 1.230610, 1.236790, 1.242994, 1.249221, - 1.255470, 1.261741, 1.268032, 1.274342, 1.280670, - 1.287015, 1.293376, 1.299753, 1.306144, 1.312548, - 1.318965, 1.325393, 1.331833, 1.338282, 1.344741, - 1.351208, 1.357683, 1.364165, 1.370653, 1.377146, - 1.383645, 1.390147, 1.396654, 1.403162, 1.409674, - 1.416186, 1.422700, 1.429214, 1.435728, 1.442241, - 1.448753, 1.455263, 1.461771, 1.468275, 1.474777, - 1.481274, 1.487767, 1.494255, 1.500738, 1.507215, - 1.513686, 1.520150, 1.526607, 1.533057, 1.539498, - 1.545932, 1.552356, 1.558772, 1.565178, 1.571574, - 1.577960, 1.584336, 1.590701, 1.597054, 1.603397, - 1.609727, 1.616045, 1.622351, 1.628644, 1.634924, - 1.641190, 1.647444, 1.653683, 1.659908, 1.666119, - 1.672315, 1.678497, 1.684663, 1.690814, 1.696949, - 1.703069, 1.709173, 1.715260, 1.721331, 1.727386, - 1.733423, 1.739444, 1.745447, 1.751433, 1.757402, - 1.763353, 1.769286, 1.775201, 1.781098, 1.786976, - 1.792836, 1.798677, 1.804500, 1.810304, 1.816088, - 1.821853, 1.827600, 1.833326, 1.839033, 1.844721, - 1.850388, 1.856036, 1.861664, 1.867272, 1.872859, - 1.878426, 1.883973, 1.889500, 1.895006 + 1.001252, 1.000085, 0.998928, 0.997780, 0.996643, + 0.995518, 0.994406, 0.993307, 0.992222, 0.991153, + 0.990100, 0.989064, 0.988046, 0.987046, 0.986066, + 0.985106, 0.984166, 0.983248, 0.982352, 0.981479, + 0.980629, 0.979803, 0.979001, 0.978224, 0.977473, + 0.976748, 0.976049, 0.975377, 0.974732, 0.974114, + 0.973525, 0.972963, 0.972430, 0.971926, 0.971451, + 0.971005, 0.970588, 0.970201, 0.969844, 0.969516, + 0.969218, 0.968951, 0.968713, 0.968506, 0.968328, + 0.968181, 0.968064, 0.967978, 0.967921, 0.967894, + 0.967898, 0.967931, 0.967995, 0.968088, 0.968210, + 0.968363, 0.968544, 0.968755, 0.968995, 0.969265, + 0.969562, 0.969889, 0.970244, 0.970627, 0.971039, + 0.971478, 0.971945, 0.972440, 0.972962, 0.973510, + 0.974086, 0.974689, 0.975317, 0.975972, 0.976653, + 0.977360, 0.978092, 0.978850, 0.979632, 0.980439, + 0.981271, 0.982127, 0.983007, 0.983911, 0.984839, + 0.985790, 0.986764, 0.987761, 0.988780, 0.989822, + 0.990886, 0.991972, 0.993080, 0.994209, 0.995359, + 0.996531, 0.997723, 0.998935, 1.000168, 1.001421, + 1.002694, 1.003986, 1.005298, 1.006629, 1.007979, + 1.009347, 1.010734, 1.012140, 1.013563, 1.015004, + 1.016463, 1.017940, 1.019434, 1.020944, 1.022472, + 1.024016, 1.025577, 1.027153, 1.028746, 1.030355, + 1.031979, 1.033619, 1.035274, 1.036945, 1.038630, + 1.040330, 1.042044, 1.043773, 1.045516, 1.047273, + 1.049044, 1.050828, 1.052626, 1.054437, 1.056262, + 1.058099, 1.059950, 1.061813, 1.063688, 1.065576, + 1.067476, 1.069388, 1.071312, 1.073248, 1.075195, + 1.077154, 1.079124, 1.081105, 1.083097, 1.085100, + 1.087114, 1.089138, 1.091173, 1.093218, 1.095274, + 1.097339, 1.099414, 1.101499, 1.103593, 1.105697, + 1.107811, 1.109934, 1.112065, 1.114206, 1.116356, + 1.118514, 1.120682, 1.122857, 1.125041, 1.127233, + 1.129434, 1.131643, 1.133859, 1.136083, 1.138315, + 1.140555, 1.142802, 1.145057, 1.147319, 1.149588, + 1.151864, 1.154147, 1.156437, 1.158734, 1.161037, + 1.163347, 1.165664, 1.167987, 1.170316, 1.172651, + 1.174993, 1.177340, 1.179694, 1.182053, 1.184418, + 1.186788, 1.189164, 1.191546, 1.193933, 1.196325, + 1.198723, 1.201125, 1.203533, 1.205945, 1.208363, + 1.210785, 1.213212, 1.215644, 1.218080, 1.220520, + 1.222965, 1.225414, 1.227868, 1.230326, 1.232787, + 1.235253, 1.237723, 1.240197, 1.242674, 1.245155, + 1.247640, 1.250128, 1.252620, 1.255115, 1.257614, + 1.260116, 1.262621, 1.265130, 1.267641, 1.270156, + 1.272674, 1.275194, 1.277717, 1.280244, 1.282773, + 1.285304, 1.287838, 1.290375, 1.292914, 1.295456, + 1.298000, 1.300546, 1.303095, 1.305646, 1.308199, + 1.310754, 1.313311, 1.315870, 1.318431, 1.320994, + 1.323559, 1.326125, 1.328693, 1.331263, 1.333835, + 1.336408, 1.338982, 1.341558, 1.344135, 1.346714, + 1.349294, 1.351876, 1.354458, 1.357042, 1.359627, + 1.362212, 1.364799, 1.367387, 1.369976, 1.372566, + 1.375156, 1.377748, 1.380340, 1.382933, 1.385526, + 1.388120, 1.390715, 1.393311, 1.395906, 1.398503, + 1.401099, 1.403696, 1.406294, 1.408892, 1.411490, + 1.414088, 1.416686, 1.419285, 1.421883, 1.424482, + 1.427081, 1.429680, 1.432278, 1.434877, 1.437476, + 1.440074, 1.442672, 1.445270, 1.447868, 1.450465, + 1.453063, 1.455659, 1.458256, 1.460852, 1.463447, + 1.466042, 1.468637, 1.471231, 1.473824, 1.476417, + 1.479009, 1.481601, 1.484192, 1.486782, 1.489371, + 1.491960, 1.494547, 1.497134, 1.499720, 1.502305, + 1.504889, 1.507473, 1.510055, 1.512636, 1.515216, + 1.517795, 1.520373, 1.522950, 1.525525, 1.528100, + 1.530673, 1.533245, 1.535816, 1.538385, 1.540953, + 1.543520, 1.546085, 1.548649, 1.551212, 1.553773, + 1.556333, 1.558891, 1.561448, 1.564003, 1.566557, + 1.569109, 1.571660, 1.574208, 1.576756, 1.579301, + 1.581845, 1.584387, 1.586928, 1.589467, 1.592004, + 1.594539, 1.597072, 1.599604, 1.602133, 1.604661, + 1.607187, 1.609711, 1.612233, 1.614753, 1.617271, + 1.619788, 1.622302, 1.624814, 1.627324, 1.629832, + 1.632338, 1.634842, 1.637344, 1.639843, 1.642341, + 1.644836, 1.647329, 1.649820, 1.652309, 1.654795, + 1.657279, 1.659761, 1.662241, 1.664718, 1.667193, + 1.669666, 1.672136, 1.674604, 1.677070, 1.679533, + 1.681994, 1.684452, 1.686908, 1.689362, 1.691813, + 1.694261, 1.696707, 1.699151, 1.701592, 1.704030, + 1.706466, 1.708900, 1.711331, 1.713759, 1.716184, + 1.718607, 1.721028, 1.723445, 1.725860, 1.728273, + 1.730683, 1.733090, 1.735494, 1.737896, 1.740294, + 1.742691, 1.745084, 1.747475, 1.749862, 1.752248, + 1.754630, 1.757009, 1.759386, 1.761760, 1.764131, + 1.766499, 1.768864, 1.771227, 1.773586, 1.775943, + 1.778297, 1.780648, 1.782995, 1.785340, 1.787683, + 1.790022, 1.792358, 1.794691, 1.797021, 1.799349, + 1.801673, 1.803994, 1.806312, 1.808627, 1.810940, + 1.813249, 1.815555, 1.817858, 1.820158, 1.822455, + 1.824749, 1.827040, 1.829327, 1.831612, 1.833893, + 1.836172, 1.838447, 1.840719, 1.842988, 1.845254, + 1.847517, 1.849776, 1.852033, 1.854286, 1.856536, + 1.858783, 1.861027, 1.863267, 1.865504, 1.867738, + 1.869969, 1.872197, 1.874421, 1.876643, 1.878860, + 1.881075, 1.883287, 1.885495, 1.887700, 1.889901, + 1.892100 } }, { - 189, 60.000000, 1000.000000, + 481, 40.000000, 1000.000000, 1.0, { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, @@ -5154,78 +6477,219 @@ static xspect illoc_Plankian_CIE_1931_2[3] = { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, - 1.000000, 1.000000, 1.000000, 1.000000 + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 } }, { - 189, 60.000000, 1000.000000, + 481, 40.000000, 1000.000000, 1.0, { - 1.807443, 1.767939, 1.728424, 1.688977, 1.649677, - 1.610595, 1.571797, 1.533345, 1.495294, 1.457694, - 1.420591, 1.384023, 1.348026, 1.312628, 1.277856, - 1.243731, 1.210269, 1.177483, 1.145385, 1.113980, - 1.083273, 1.053267, 1.023960, 0.995350, 0.967433, - 0.940204, 0.913655, 0.887779, 0.862566, 0.838007, - 0.814090, 0.790805, 0.768140, 0.746084, 0.724623, - 0.703745, 0.683438, 0.663689, 0.644486, 0.625814, - 0.607663, 0.590019, 0.572870, 0.556203, 0.540006, - 0.524267, 0.508975, 0.494117, 0.479683, 0.465661, - 0.452040, 0.438809, 0.425958, 0.413476, 0.401354, - 0.389581, 0.378149, 0.367047, 0.356266, 0.345798, - 0.335634, 0.325764, 0.316182, 0.306879, 0.297847, - 0.289078, 0.280566, 0.272302, 0.264279, 0.256492, - 0.248932, 0.241594, 0.234472, 0.227558, 0.220848, - 0.214334, 0.208013, 0.201877, 0.195922, 0.190142, - 0.184533, 0.179089, 0.173806, 0.168679, 0.163703, - 0.158875, 0.154189, 0.149641, 0.145229, 0.140947, - 0.136792, 0.132760, 0.128847, 0.125050, 0.121366, - 0.117792, 0.114323, 0.110958, 0.107692, 0.104523, - 0.101449, 0.098466, 0.095571, 0.092763, 0.090038, - 0.087394, 0.084829, 0.082340, 0.079926, 0.077583, - 0.075310, 0.073104, 0.070964, 0.068888, 0.066874, - 0.064919, 0.063023, 0.061184, 0.059399, 0.057667, - 0.055987, 0.054357, 0.052775, 0.051240, 0.049752, - 0.048307, 0.046906, 0.045546, 0.044226, 0.042946, - 0.041704, 0.040499, 0.039330, 0.038195, 0.037095, - 0.036027, 0.034990, 0.033985, 0.033009, 0.032062, - 0.031144, 0.030252, 0.029387, 0.028548, 0.027734, - 0.026943, 0.026177, 0.025432, 0.024710, 0.024009, - 0.023329, 0.022669, 0.022029, 0.021407, 0.020804, - 0.020219, 0.019651, 0.019099, 0.018564, 0.018044, - 0.017540, 0.017051, 0.016576, 0.016115, 0.015668, - 0.015233, 0.014811, 0.014402, 0.014005, 0.013619, - 0.013245, 0.012881, 0.012528, 0.012186, 0.011853, - 0.011530, 0.011217, 0.010912, 0.010617, 0.010329, - 0.010051, 0.009780, 0.009517, 0.009262, 0.009014, - 0.008773, 0.008540, 0.008313, 0.008092 + 1.964399, 1.949065, 1.933662, 1.918197, 1.902676, + 1.887104, 1.871488, 1.855833, 1.840145, 1.824431, + 1.808694, 1.792942, 1.777180, 1.761413, 1.745646, + 1.729884, 1.714133, 1.698398, 1.682683, 1.666994, + 1.651334, 1.635709, 1.620122, 1.604578, 1.589081, + 1.573634, 1.558243, 1.542909, 1.527638, 1.512431, + 1.497293, 1.482226, 1.467234, 1.452320, 1.437485, + 1.422732, 1.408065, 1.393485, 1.378994, 1.364595, + 1.350290, 1.336080, 1.321966, 1.307952, 1.294037, + 1.280224, 1.266513, 1.252907, 1.239405, 1.226009, + 1.212720, 1.199539, 1.186466, 1.173502, 1.160647, + 1.147903, 1.135268, 1.122745, 1.110333, 1.098031, + 1.085841, 1.073763, 1.061796, 1.049940, 1.038196, + 1.026563, 1.015041, 1.003630, 0.992329, 0.981138, + 0.970058, 0.959087, 0.948225, 0.937472, 0.926827, + 0.916289, 0.905859, 0.895535, 0.885318, 0.875206, + 0.865199, 0.855295, 0.845496, 0.835799, 0.826205, + 0.816712, 0.807319, 0.798027, 0.788834, 0.779739, + 0.770743, 0.761843, 0.753039, 0.744331, 0.735718, + 0.727199, 0.718772, 0.710438, 0.702195, 0.694043, + 0.685981, 0.678008, 0.670124, 0.662326, 0.654616, + 0.646991, 0.639451, 0.631995, 0.624623, 0.617333, + 0.610126, 0.602999, 0.595952, 0.588985, 0.582096, + 0.575286, 0.568552, 0.561895, 0.555313, 0.548805, + 0.542372, 0.536012, 0.529725, 0.523509, 0.517364, + 0.511289, 0.505284, 0.499347, 0.493478, 0.487677, + 0.481943, 0.476274, 0.470670, 0.465131, 0.459655, + 0.454243, 0.448893, 0.443605, 0.438378, 0.433211, + 0.428104, 0.423056, 0.418066, 0.413134, 0.408260, + 0.403442, 0.398679, 0.393972, 0.389320, 0.384722, + 0.380177, 0.375686, 0.371246, 0.366858, 0.362522, + 0.358235, 0.353999, 0.349812, 0.345675, 0.341585, + 0.337543, 0.333549, 0.329601, 0.325700, 0.321844, + 0.318033, 0.314267, 0.310545, 0.306866, 0.303231, + 0.299639, 0.296088, 0.292580, 0.289112, 0.285685, + 0.282299, 0.278952, 0.275645, 0.272376, 0.269147, + 0.265955, 0.262800, 0.259683, 0.256603, 0.253559, + 0.250551, 0.247578, 0.244640, 0.241737, 0.238869, + 0.236034, 0.233232, 0.230464, 0.227729, 0.225026, + 0.222354, 0.219715, 0.217106, 0.214529, 0.211982, + 0.209465, 0.206978, 0.204520, 0.202092, 0.199692, + 0.197321, 0.194978, 0.192663, 0.190375, 0.188114, + 0.185880, 0.183673, 0.181492, 0.179337, 0.177207, + 0.175103, 0.173024, 0.170969, 0.168939, 0.166933, + 0.164951, 0.162992, 0.161057, 0.159145, 0.157255, + 0.155388, 0.153543, 0.151720, 0.149919, 0.148140, + 0.146381, 0.144644, 0.142927, 0.141231, 0.139555, + 0.137899, 0.136262, 0.134646, 0.133048, 0.131470, + 0.129910, 0.128369, 0.126846, 0.125342, 0.123855, + 0.122387, 0.120935, 0.119502, 0.118085, 0.116685, + 0.115302, 0.113935, 0.112585, 0.111251, 0.109933, + 0.108631, 0.107344, 0.106072, 0.104816, 0.103575, + 0.102349, 0.101137, 0.099940, 0.098757, 0.097588, + 0.096434, 0.095293, 0.094166, 0.093052, 0.091952, + 0.090864, 0.089790, 0.088729, 0.087680, 0.086644, + 0.085620, 0.084609, 0.083610, 0.082622, 0.081647, + 0.080683, 0.079731, 0.078790, 0.077860, 0.076942, + 0.076035, 0.075138, 0.074252, 0.073377, 0.072512, + 0.071658, 0.070814, 0.069980, 0.069156, 0.068342, + 0.067537, 0.066743, 0.065958, 0.065182, 0.064415, + 0.063658, 0.062910, 0.062171, 0.061440, 0.060718, + 0.060006, 0.059301, 0.058605, 0.057917, 0.057238, + 0.056567, 0.055904, 0.055248, 0.054601, 0.053961, + 0.053329, 0.052705, 0.052088, 0.051478, 0.050876, + 0.050281, 0.049693, 0.049113, 0.048539, 0.047972, + 0.047411, 0.046858, 0.046311, 0.045771, 0.045237, + 0.044710, 0.044188, 0.043674, 0.043165, 0.042662, + 0.042166, 0.041675, 0.041190, 0.040711, 0.040238, + 0.039770, 0.039308, 0.038852, 0.038401, 0.037955, + 0.037515, 0.037080, 0.036650, 0.036226, 0.035806, + 0.035392, 0.034982, 0.034577, 0.034177, 0.033782, + 0.033392, 0.033006, 0.032625, 0.032249, 0.031877, + 0.031509, 0.031146, 0.030787, 0.030432, 0.030082, + 0.029736, 0.029394, 0.029056, 0.028722, 0.028392, + 0.028066, 0.027744, 0.027426, 0.027111, 0.026801, + 0.026494, 0.026190, 0.025891, 0.025594, 0.025302, + 0.025013, 0.024727, 0.024445, 0.024166, 0.023890, + 0.023618, 0.023349, 0.023083, 0.022820, 0.022560, + 0.022304, 0.022050, 0.021800, 0.021553, 0.021308, + 0.021066, 0.020828, 0.020592, 0.020359, 0.020128, + 0.019901, 0.019676, 0.019453, 0.019234, 0.019017, + 0.018802, 0.018590, 0.018381, 0.018174, 0.017970, + 0.017767, 0.017568, 0.017371, 0.017176, 0.016983, + 0.016793, 0.016604, 0.016418, 0.016235, 0.016053, + 0.015874, 0.015697, 0.015521, 0.015348, 0.015177, + 0.015008, 0.014841, 0.014676, 0.014513, 0.014352, + 0.014192, 0.014035, 0.013879, 0.013725, 0.013574, + 0.013423, 0.013275, 0.013128, 0.012983, 0.012840, + 0.012699, 0.012559, 0.012420, 0.012284, 0.012149, + 0.012015, 0.011883, 0.011753, 0.011624, 0.011497, + 0.011371, 0.011247, 0.011124, 0.011002, 0.010882, + 0.010764, 0.010647, 0.010531, 0.010416, 0.010303, + 0.010191, 0.010081, 0.009971, 0.009863, 0.009756, + 0.009651, 0.009547, 0.009444, 0.009342, 0.009241, + 0.009142, 0.009043, 0.008946, 0.008850, 0.008755, + 0.008661, 0.008568, 0.008477, 0.008386, 0.008296, + 0.008208 } } }; -static xspect illoc_Daylight_CIE_1964_10[3] = { +static xspect illoc_ODaylight_CIE_1931_2[3] = { { - 69, 60.000000, 400.000000, + 181, 40.000000, 400.000000, 1.0, { - 0.949535, 0.948408, 0.947363, 0.946408, 0.945551, - 0.944800, 0.944161, 0.943639, 0.943243, 0.942976, - 0.942844, 0.942853, 0.943006, 0.943308, 0.943763, - 0.944374, 0.945146, 0.946079, 0.947174, 0.948434, - 0.949861, 0.951455, 0.953217, 0.955146, 0.957242, - 0.959504, 0.961930, 0.964519, 0.967268, 0.970175, - 0.973237, 0.976450, 0.979812, 0.983317, 0.986963, - 0.990743, 0.994653, 0.998688, 1.002842, 1.007108, - 1.011480, 1.015951, 1.020514, 1.025161, 1.029883, - 1.034672, 1.039519, 1.044415, 1.049348, 1.054309, - 1.059288, 1.064271, 1.069249, 1.074207, 1.079135, - 1.084018, 1.088844, 1.093597, 1.098265, 1.102832, - 1.107284, 1.111605, 1.115781, 1.119796, 1.123634, - 1.127280, 1.130718, 1.133933, 1.136910 + 0.980733, 0.979686, 0.978644, 0.977610, 0.976584, + 0.975566, 0.974557, 0.973559, 0.972572, 0.971597, + 0.970635, 0.969687, 0.968753, 0.967834, 0.966931, + 0.966045, 0.965176, 0.964324, 0.963492, 0.962678, + 0.961884, 0.961111, 0.960358, 0.959627, 0.958918, + 0.958232, 0.957568, 0.956929, 0.956313, 0.955721, + 0.955155, 0.954614, 0.954098, 0.953609, 0.953146, + 0.952710, 0.952302, 0.951920, 0.951567, 0.951242, + 0.950945, 0.950677, 0.950439, 0.950229, 0.950049, + 0.949899, 0.949779, 0.949690, 0.949630, 0.949602, + 0.949604, 0.949638, 0.949703, 0.949799, 0.949926, + 0.950085, 0.950275, 0.950497, 0.950750, 0.951035, + 0.951352, 0.951701, 0.952081, 0.952493, 0.952937, + 0.953413, 0.953920, 0.954459, 0.955030, 0.955632, + 0.956265, 0.956929, 0.957625, 0.958351, 0.959108, + 0.959896, 0.960715, 0.961563, 0.962442, 0.963351, + 0.964289, 0.965257, 0.966254, 0.967281, 0.968336, + 0.969419, 0.970531, 0.971670, 0.972838, 0.974033, + 0.975254, 0.976503, 0.977778, 0.979079, 0.980406, + 0.981759, 0.983136, 0.984538, 0.985965, 0.987415, + 0.988889, 0.990386, 0.991906, 0.993448, 0.995012, + 0.996597, 0.998203, 0.999830, 1.001477, 1.003143, + 1.004828, 1.006532, 1.008254, 1.009993, 1.011749, + 1.013522, 1.015310, 1.017114, 1.018932, 1.020765, + 1.022611, 1.024470, 1.026341, 1.028223, 1.030117, + 1.032021, 1.033935, 1.035858, 1.037789, 1.039727, + 1.041673, 1.043625, 1.045582, 1.047543, 1.049509, + 1.051478, 1.053449, 1.055422, 1.057396, 1.059369, + 1.061342, 1.063313, 1.065282, 1.067247, 1.069208, + 1.071163, 1.073113, 1.075056, 1.076991, 1.078917, + 1.080834, 1.082740, 1.084634, 1.086516, 1.088385, + 1.090239, 1.092078, 1.093900, 1.095705, 1.097492, + 1.099259, 1.101006, 1.102732, 1.104435, 1.106115, + 1.107771, 1.109401, 1.111004, 1.112581, 1.114128, + 1.115647, 1.117134, 1.118590, 1.120014, 1.121404, + 1.122759, 1.124078, 1.125361, 1.126607, 1.127813, + 1.128981 } }, { - 69, 60.000000, 400.000000, + 181, 40.000000, 400.000000, 1.0, { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, @@ -5241,78 +6705,183 @@ static xspect illoc_Daylight_CIE_1964_10[3] = { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, - 1.000000, 1.000000, 1.000000, 1.000000 + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 } }, { - 69, 60.000000, 400.000000, + 181, 40.000000, 400.000000, 1.0, { - 1.736104, 1.699156, 1.662051, 1.624867, 1.587679, - 1.550555, 1.513559, 1.476750, 1.440182, 1.403904, - 1.367961, 1.332394, 1.297239, 1.262528, 1.228292, - 1.194555, 1.161341, 1.128728, 1.096782, 1.065445, - 1.034742, 1.004693, 0.975315, 0.946623, 0.918626, - 0.891332, 0.864747, 0.838873, 0.813712, 0.789262, - 0.765521, 0.742485, 0.720149, 0.698506, 0.677549, - 0.657271, 0.637662, 0.618713, 0.600415, 0.582756, - 0.565728, 0.549318, 0.533516, 0.518310, 0.503690, - 0.489644, 0.476161, 0.463230, 0.450839, 0.438977, - 0.427633, 0.416797, 0.406457, 0.396605, 0.387228, - 0.378318, 0.369864, 0.361858, 0.354290, 0.347151, - 0.340434, 0.334131, 0.328233, 0.322735, 0.317629, - 0.312911, 0.308575, 0.304616, 0.301031 + 1.945100, 1.929640, 1.914098, 1.898479, 1.882791, + 1.867042, 1.851240, 1.835389, 1.819499, 1.803574, + 1.787622, 1.771648, 1.755660, 1.739661, 1.723659, + 1.707659, 1.691666, 1.675685, 1.659721, 1.643779, + 1.627864, 1.611981, 1.596132, 1.580324, 1.564559, + 1.548842, 1.533176, 1.517564, 1.502011, 1.486520, + 1.471093, 1.455733, 1.440444, 1.425228, 1.410088, + 1.395026, 1.380044, 1.365145, 1.350331, 1.335604, + 1.320965, 1.306416, 1.291960, 1.277597, 1.263330, + 1.249158, 1.235085, 1.221110, 1.207236, 1.193462, + 1.179790, 1.166222, 1.152787, 1.139490, 1.126302, + 1.113225, 1.100260, 1.087407, 1.074669, 1.062047, + 1.049542, 1.037153, 1.024884, 1.012733, 1.000701, + 0.988790, 0.977000, 0.965330, 0.953782, 0.942355, + 0.931050, 0.919867, 0.908805, 0.897866, 0.887048, + 0.876351, 0.865776, 0.855322, 0.844989, 0.834777, + 0.824684, 0.814712, 0.804859, 0.795125, 0.785509, + 0.776012, 0.766631, 0.757368, 0.748221, 0.739189, + 0.730272, 0.721470, 0.712781, 0.704205, 0.695742, + 0.687390, 0.679148, 0.671017, 0.662995, 0.655081, + 0.647275, 0.639576, 0.631984, 0.624496, 0.617113, + 0.609834, 0.602658, 0.595584, 0.588611, 0.581739, + 0.574967, 0.568293, 0.561718, 0.555239, 0.548858, + 0.542572, 0.536381, 0.530283, 0.524280, 0.518368, + 0.512549, 0.506820, 0.501181, 0.495632, 0.490171, + 0.484799, 0.479513, 0.474313, 0.469200, 0.464171, + 0.459226, 0.454364, 0.449586, 0.444889, 0.440273, + 0.435739, 0.431284, 0.426908, 0.422611, 0.418392, + 0.414250, 0.410184, 0.406195, 0.402281, 0.398442, + 0.394677, 0.390986, 0.387368, 0.383822, 0.380348, + 0.376946, 0.373614, 0.370353, 0.367162, 0.364039, + 0.360986, 0.358001, 0.355084, 0.352234, 0.349451, + 0.346735, 0.344085, 0.341501, 0.338982, 0.336528, + 0.334139, 0.331814, 0.329553, 0.327356, 0.325222, + 0.323151, 0.321143, 0.319198, 0.317315, 0.315494, + 0.313734, 0.312037, 0.310401, 0.308827, 0.307314, + 0.305862 } } }; static xspect illoc_Plankian_CIE_1964_10[3] = { { - 189, 60.000000, 1000.000000, + 481, 40.000000, 1000.000000, 1.0, { - 0.974241, 0.972539, 0.970952, 0.969490, 0.968163, - 0.966977, 0.965941, 0.965060, 0.964340, 0.963785, - 0.963398, 0.963183, 0.963140, 0.963272, 0.963578, - 0.964058, 0.964713, 0.965540, 0.966539, 0.967707, - 0.969041, 0.970540, 0.972201, 0.974020, 0.975994, - 0.978121, 0.980396, 0.982816, 0.985378, 0.988077, - 0.990911, 0.993876, 0.996967, 1.000182, 1.003517, - 1.006968, 1.010533, 1.014206, 1.017986, 1.021868, - 1.025851, 1.029929, 1.034101, 1.038362, 1.042711, - 1.047144, 1.051659, 1.056252, 1.060921, 1.065663, - 1.070476, 1.075357, 1.080304, 1.085314, 1.090384, - 1.095514, 1.100699, 1.105939, 1.111231, 1.116573, - 1.121962, 1.127398, 1.132878, 1.138400, 1.143962, - 1.149564, 1.155202, 1.160875, 1.166582, 1.172320, - 1.178090, 1.183888, 1.189713, 1.195565, 1.201441, - 1.207340, 1.213262, 1.219204, 1.225165, 1.231144, - 1.237140, 1.243152, 1.249179, 1.255219, 1.261272, - 1.267336, 1.273410, 1.279494, 1.285586, 1.291686, - 1.297792, 1.303903, 1.310020, 1.316140, 1.322264, - 1.328390, 1.334517, 1.340646, 1.346774, 1.352902, - 1.359028, 1.365152, 1.371274, 1.377392, 1.383506, - 1.389615, 1.395720, 1.401819, 1.407911, 1.413996, - 1.420075, 1.426145, 1.432207, 1.438260, 1.444304, - 1.450337, 1.456361, 1.462374, 1.468376, 1.474367, - 1.480346, 1.486312, 1.492266, 1.498207, 1.504134, - 1.510048, 1.515948, 1.521834, 1.527705, 1.533561, - 1.539402, 1.545228, 1.551037, 1.556831, 1.562609, - 1.568370, 1.574114, 1.579842, 1.585552, 1.591245, - 1.596920, 1.602578, 1.608217, 1.613839, 1.619442, - 1.625026, 1.630592, 1.636139, 1.641668, 1.647177, - 1.652666, 1.658137, 1.663587, 1.669019, 1.674430, - 1.679822, 1.685193, 1.690544, 1.695876, 1.701187, - 1.706477, 1.711747, 1.716997, 1.722226, 1.727434, - 1.732621, 1.737788, 1.742934, 1.748058, 1.753162, - 1.758245, 1.763306, 1.768347, 1.773366, 1.778364, - 1.783341, 1.788296, 1.793230, 1.798143, 1.803034, - 1.807904, 1.812753, 1.817580, 1.822386, 1.827170, - 1.831933, 1.836674, 1.841394, 1.846092 + 0.981980, 0.981153, 0.980335, 0.979528, 0.978732, + 0.977948, 0.977178, 0.976421, 0.975679, 0.974952, + 0.974241, 0.973547, 0.972870, 0.972212, 0.971572, + 0.970952, 0.970352, 0.969772, 0.969214, 0.968677, + 0.968163, 0.967671, 0.967202, 0.966758, 0.966337, + 0.965941, 0.965570, 0.965224, 0.964903, 0.964609, + 0.964340, 0.964098, 0.963883, 0.963694, 0.963532, + 0.963398, 0.963291, 0.963212, 0.963160, 0.963136, + 0.963140, 0.963172, 0.963231, 0.963319, 0.963434, + 0.963578, 0.963749, 0.963948, 0.964175, 0.964430, + 0.964713, 0.965023, 0.965361, 0.965726, 0.966119, + 0.966539, 0.966986, 0.967460, 0.967960, 0.968487, + 0.969041, 0.969621, 0.970227, 0.970859, 0.971517, + 0.972201, 0.972910, 0.973644, 0.974402, 0.975186, + 0.975994, 0.976827, 0.977683, 0.978564, 0.979468, + 0.980396, 0.981347, 0.982320, 0.983317, 0.984336, + 0.985378, 0.986441, 0.987526, 0.988633, 0.989762, + 0.990911, 0.992081, 0.993272, 0.994484, 0.995715, + 0.996967, 0.998238, 0.999529, 1.000840, 1.002169, + 1.003517, 1.004884, 1.006269, 1.007672, 1.009094, + 1.010533, 1.011989, 1.013463, 1.014954, 1.016462, + 1.017986, 1.019527, 1.021084, 1.022657, 1.024246, + 1.025851, 1.027470, 1.029106, 1.030756, 1.032421, + 1.034101, 1.035795, 1.037503, 1.039225, 1.040961, + 1.042711, 1.044475, 1.046251, 1.048041, 1.049844, + 1.051659, 1.053487, 1.055327, 1.057180, 1.059045, + 1.060921, 1.062809, 1.064709, 1.066621, 1.068543, + 1.070476, 1.072421, 1.074376, 1.076342, 1.078318, + 1.080304, 1.082300, 1.084307, 1.086323, 1.088349, + 1.090384, 1.092429, 1.094483, 1.096546, 1.098618, + 1.100699, 1.102789, 1.104887, 1.106993, 1.109108, + 1.111231, 1.113362, 1.115500, 1.117647, 1.119801, + 1.121962, 1.124131, 1.126307, 1.128491, 1.130681, + 1.132878, 1.135082, 1.137292, 1.139509, 1.141733, + 1.143962, 1.146198, 1.148440, 1.150688, 1.152942, + 1.155202, 1.157467, 1.159737, 1.162013, 1.164295, + 1.166582, 1.168873, 1.171170, 1.173472, 1.175778, + 1.178090, 1.180405, 1.182726, 1.185051, 1.187380, + 1.189713, 1.192051, 1.194392, 1.196738, 1.199088, + 1.201441, 1.203798, 1.206159, 1.208523, 1.210891, + 1.213262, 1.215636, 1.218014, 1.220394, 1.222778, + 1.225165, 1.227554, 1.229947, 1.232342, 1.234740, + 1.237140, 1.239543, 1.241949, 1.244357, 1.246767, + 1.249179, 1.251594, 1.254010, 1.256429, 1.258849, + 1.261272, 1.263696, 1.266122, 1.268550, 1.270979, + 1.273410, 1.275843, 1.278276, 1.280712, 1.283148, + 1.285586, 1.288025, 1.290465, 1.292906, 1.295348, + 1.297792, 1.300236, 1.302681, 1.305126, 1.307573, + 1.310020, 1.312468, 1.314916, 1.317365, 1.319814, + 1.322264, 1.324714, 1.327165, 1.329615, 1.332066, + 1.334517, 1.336969, 1.339420, 1.341871, 1.344323, + 1.346774, 1.349225, 1.351676, 1.354127, 1.356578, + 1.359028, 1.361478, 1.363927, 1.366377, 1.368825, + 1.371274, 1.373721, 1.376168, 1.378615, 1.381061, + 1.383506, 1.385950, 1.388394, 1.390837, 1.393279, + 1.395720, 1.398160, 1.400599, 1.403038, 1.405475, + 1.407911, 1.410346, 1.412780, 1.415213, 1.417644, + 1.420075, 1.422504, 1.424931, 1.427358, 1.429783, + 1.432207, 1.434629, 1.437050, 1.439469, 1.441887, + 1.444304, 1.446718, 1.449131, 1.451543, 1.453953, + 1.456361, 1.458768, 1.461173, 1.463576, 1.465977, + 1.468376, 1.470774, 1.473170, 1.475564, 1.477956, + 1.480346, 1.482734, 1.485120, 1.487504, 1.489886, + 1.492266, 1.494644, 1.497020, 1.499393, 1.501765, + 1.504134, 1.506501, 1.508867, 1.511229, 1.513590, + 1.515948, 1.518304, 1.520658, 1.523009, 1.525358, + 1.527705, 1.530049, 1.532391, 1.534730, 1.537067, + 1.539402, 1.541734, 1.544064, 1.546391, 1.548715, + 1.551037, 1.553357, 1.555674, 1.557988, 1.560300, + 1.562609, 1.564915, 1.567219, 1.569520, 1.571818, + 1.574114, 1.576407, 1.578698, 1.580985, 1.583270, + 1.585552, 1.587831, 1.590108, 1.592381, 1.594652, + 1.596920, 1.599185, 1.601448, 1.603707, 1.605964, + 1.608217, 1.610468, 1.612716, 1.614961, 1.617203, + 1.619442, 1.621678, 1.623911, 1.626141, 1.628368, + 1.630592, 1.632813, 1.635031, 1.637247, 1.639459, + 1.641668, 1.643873, 1.646076, 1.648276, 1.650473, + 1.652666, 1.654857, 1.657044, 1.659228, 1.661409, + 1.663587, 1.665762, 1.667934, 1.670103, 1.672268, + 1.674430, 1.676589, 1.678745, 1.680897, 1.683047, + 1.685193, 1.687336, 1.689476, 1.691612, 1.693746, + 1.695876, 1.698003, 1.700126, 1.702246, 1.704363, + 1.706477, 1.708588, 1.710695, 1.712799, 1.714899, + 1.716997, 1.719091, 1.721182, 1.723269, 1.725353, + 1.727434, 1.729511, 1.731586, 1.733656, 1.735724, + 1.737788, 1.739849, 1.741906, 1.743960, 1.746011, + 1.748058, 1.750102, 1.752143, 1.754180, 1.756214, + 1.758245, 1.760272, 1.762296, 1.764316, 1.766333, + 1.768347, 1.770357, 1.772364, 1.774367, 1.776367, + 1.778364, 1.780357, 1.782347, 1.784334, 1.786317, + 1.788296, 1.790272, 1.792245, 1.794214, 1.796180, + 1.798143, 1.800102, 1.802058, 1.804010, 1.805959, + 1.807904, 1.809846, 1.811785, 1.813720, 1.815652, + 1.817580, 1.819505, 1.821426, 1.823344, 1.825259, + 1.827170, 1.829078, 1.830982, 1.832883, 1.834780, + 1.836674, 1.838565, 1.840452, 1.842335, 1.844216, + 1.846092 } }, { - 189, 60.000000, 1000.000000, + 481, 40.000000, 1000.000000, 1.0, { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, @@ -5352,51 +6921,745 @@ static xspect illoc_Plankian_CIE_1964_10[3] = { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, - 1.000000, 1.000000, 1.000000, 1.000000 + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 + } + }, + { + 481, 40.000000, 1000.000000, + 1.0, + { + 1.923654, 1.909157, 1.894584, 1.879941, 1.865235, + 1.850470, 1.835651, 1.820786, 1.805878, 1.790933, + 1.775958, 1.760956, 1.745934, 1.730896, 1.715848, + 1.700795, 1.685741, 1.670691, 1.655651, 1.640624, + 1.625615, 1.610629, 1.595669, 1.580741, 1.565847, + 1.550992, 1.536180, 1.521413, 1.506697, 1.492034, + 1.477427, 1.462880, 1.448395, 1.433975, 1.419624, + 1.405344, 1.391137, 1.377005, 1.362952, 1.348979, + 1.335088, 1.321281, 1.307560, 1.293927, 1.280383, + 1.266930, 1.253569, 1.240302, 1.227130, 1.214053, + 1.201074, 1.188192, 1.175410, 1.162727, 1.150144, + 1.137662, 1.125282, 1.113004, 1.100828, 1.088756, + 1.076786, 1.064920, 1.053158, 1.041499, 1.029944, + 1.018493, 1.007146, 0.995903, 0.984764, 0.973728, + 0.962796, 0.951967, 0.941240, 0.930617, 0.920096, + 0.909677, 0.899359, 0.889143, 0.879028, 0.869013, + 0.859098, 0.849282, 0.839565, 0.829947, 0.820426, + 0.811003, 0.801676, 0.792445, 0.783310, 0.774269, + 0.765323, 0.756470, 0.747710, 0.739042, 0.730466, + 0.721980, 0.713585, 0.705279, 0.697062, 0.688933, + 0.680891, 0.672936, 0.665067, 0.657283, 0.649583, + 0.641968, 0.634435, 0.626984, 0.619616, 0.612328, + 0.605120, 0.597991, 0.590942, 0.583970, 0.577075, + 0.570257, 0.563515, 0.556848, 0.550255, 0.543736, + 0.537290, 0.530916, 0.524614, 0.518382, 0.512221, + 0.506129, 0.500106, 0.494151, 0.488264, 0.482443, + 0.476688, 0.470999, 0.465374, 0.459814, 0.454317, + 0.448883, 0.443510, 0.438200, 0.432950, 0.427760, + 0.422630, 0.417559, 0.412547, 0.407592, 0.402694, + 0.397852, 0.393067, 0.388337, 0.383662, 0.379041, + 0.374473, 0.369959, 0.365497, 0.361086, 0.356728, + 0.352420, 0.348162, 0.343953, 0.339794, 0.335684, + 0.331622, 0.327607, 0.323639, 0.319718, 0.315842, + 0.312013, 0.308228, 0.304487, 0.300791, 0.297138, + 0.293529, 0.289961, 0.286436, 0.282953, 0.279511, + 0.276109, 0.272748, 0.269426, 0.266144, 0.262900, + 0.259696, 0.256529, 0.253400, 0.250308, 0.247252, + 0.244234, 0.241251, 0.238303, 0.235391, 0.232513, + 0.229670, 0.226861, 0.224085, 0.221343, 0.218633, + 0.215956, 0.213311, 0.210697, 0.208115, 0.205564, + 0.203043, 0.200553, 0.198092, 0.195661, 0.193260, + 0.190887, 0.188543, 0.186227, 0.183939, 0.181678, + 0.179445, 0.177238, 0.175059, 0.172905, 0.170778, + 0.168676, 0.166600, 0.164549, 0.162523, 0.160521, + 0.158544, 0.156590, 0.154660, 0.152754, 0.150871, + 0.149010, 0.147172, 0.145357, 0.143563, 0.141792, + 0.140042, 0.138313, 0.136605, 0.134918, 0.133252, + 0.131606, 0.129980, 0.128373, 0.126787, 0.125220, + 0.123672, 0.122142, 0.120632, 0.119140, 0.117666, + 0.116210, 0.114772, 0.113352, 0.111949, 0.110563, + 0.109194, 0.107842, 0.106507, 0.105188, 0.103885, + 0.102598, 0.101327, 0.100071, 0.098831, 0.097606, + 0.096397, 0.095202, 0.094021, 0.092856, 0.091704, + 0.090567, 0.089444, 0.088335, 0.087239, 0.086157, + 0.085088, 0.084032, 0.082989, 0.081960, 0.080942, + 0.079938, 0.078946, 0.077966, 0.076998, 0.076042, + 0.075098, 0.074166, 0.073245, 0.072335, 0.071437, + 0.070550, 0.069674, 0.068808, 0.067954, 0.067110, + 0.066276, 0.065453, 0.064640, 0.063837, 0.063044, + 0.062260, 0.061487, 0.060723, 0.059969, 0.059223, + 0.058488, 0.057761, 0.057043, 0.056334, 0.055634, + 0.054943, 0.054260, 0.053586, 0.052920, 0.052263, + 0.051613, 0.050972, 0.050338, 0.049713, 0.049095, + 0.048485, 0.047883, 0.047288, 0.046700, 0.046120, + 0.045547, 0.044981, 0.044422, 0.043870, 0.043325, + 0.042787, 0.042255, 0.041730, 0.041212, 0.040700, + 0.040194, 0.039695, 0.039202, 0.038715, 0.038234, + 0.037760, 0.037291, 0.036828, 0.036370, 0.035919, + 0.035473, 0.035032, 0.034597, 0.034168, 0.033744, + 0.033325, 0.032911, 0.032503, 0.032099, 0.031701, + 0.031308, 0.030919, 0.030536, 0.030157, 0.029783, + 0.029413, 0.029048, 0.028688, 0.028332, 0.027981, + 0.027634, 0.027291, 0.026953, 0.026619, 0.026289, + 0.025963, 0.025642, 0.025324, 0.025010, 0.024700, + 0.024394, 0.024092, 0.023794, 0.023499, 0.023208, + 0.022921, 0.022637, 0.022357, 0.022080, 0.021807, + 0.021537, 0.021270, 0.021007, 0.020747, 0.020491, + 0.020237, 0.019987, 0.019740, 0.019496, 0.019255, + 0.019017, 0.018782, 0.018550, 0.018321, 0.018094, + 0.017871, 0.017650, 0.017432, 0.017217, 0.017004, + 0.016795, 0.016587, 0.016383, 0.016181, 0.015981, + 0.015784, 0.015589, 0.015397, 0.015207, 0.015020, + 0.014835, 0.014652, 0.014471, 0.014293, 0.014117, + 0.013943, 0.013771, 0.013602, 0.013434, 0.013269, + 0.013106, 0.012944, 0.012785, 0.012628, 0.012473, + 0.012319, 0.012168, 0.012018, 0.011871, 0.011725, + 0.011581, 0.011438, 0.011298, 0.011159, 0.011022, + 0.010887, 0.010753, 0.010621, 0.010491, 0.010363, + 0.010235, 0.010110, 0.009986, 0.009864, 0.009743, + 0.009623, 0.009506, 0.009389, 0.009274, 0.009161, + 0.009048, 0.008938, 0.008828, 0.008720, 0.008614, + 0.008508, 0.008404, 0.008302, 0.008200, 0.008100, + 0.008001, 0.007903, 0.007807, 0.007712, 0.007617, + 0.007524, 0.007433, 0.007342, 0.007252, 0.007164, + 0.007077, 0.006990, 0.006905, 0.006821, 0.006738, + 0.006656, 0.006575, 0.006495, 0.006416, 0.006338, + 0.006261 + } + } +}; + +static xspect illoc_Daylight_CIE_1964_10[3] = { + { + 181, 40.000000, 400.000000, + 1.0, + { + 0.954594, 0.954039, 0.953491, 0.952950, 0.952416, + 0.951891, 0.951374, 0.950867, 0.950370, 0.949884, + 0.949409, 0.948945, 0.948494, 0.948056, 0.947632, + 0.947221, 0.946825, 0.946444, 0.946078, 0.945729, + 0.945395, 0.945079, 0.944780, 0.944498, 0.944235, + 0.943990, 0.943765, 0.943558, 0.943372, 0.943205, + 0.943059, 0.942934, 0.942830, 0.942748, 0.942687, + 0.942649, 0.942633, 0.942639, 0.942669, 0.942722, + 0.942799, 0.942900, 0.943024, 0.943174, 0.943347, + 0.943546, 0.943770, 0.944019, 0.944293, 0.944594, + 0.944920, 0.945273, 0.945651, 0.946054, 0.946484, + 0.946940, 0.947423, 0.947932, 0.948468, 0.949031, + 0.949620, 0.950237, 0.950880, 0.951550, 0.952247, + 0.952971, 0.953722, 0.954499, 0.955304, 0.956135, + 0.956992, 0.957876, 0.958787, 0.959724, 0.960688, + 0.961677, 0.962693, 0.963735, 0.964802, 0.965895, + 0.967013, 0.968157, 0.969326, 0.970520, 0.971739, + 0.972982, 0.974249, 0.975541, 0.976856, 0.978195, + 0.979557, 0.980943, 0.982351, 0.983782, 0.985235, + 0.986710, 0.988207, 0.989725, 0.991264, 0.992823, + 0.994403, 0.996003, 0.997623, 0.999262, 1.000920, + 1.002596, 1.004290, 1.006002, 1.007731, 1.009477, + 1.011239, 1.013018, 1.014811, 1.016620, 1.018443, + 1.020280, 1.022130, 1.023993, 1.025869, 1.027757, + 1.029655, 1.031565, 1.033485, 1.035414, 1.037353, + 1.039299, 1.041254, 1.043215, 1.045183, 1.047157, + 1.049136, 1.051120, 1.053107, 1.055098, 1.057090, + 1.059085, 1.061080, 1.063076, 1.065071, 1.067064, + 1.069055, 1.071044, 1.073028, 1.075009, 1.076983, + 1.078952, 1.080913, 1.082866, 1.084811, 1.086746, + 1.088670, 1.090583, 1.092484, 1.094371, 1.096244, + 1.098102, 1.099944, 1.101768, 1.103575, 1.105363, + 1.107131, 1.108878, 1.110603, 1.112305, 1.113984, + 1.115638, 1.117266, 1.118867, 1.120440, 1.121985, + 1.123500, 1.124984, 1.126436, 1.127856, 1.129241, + 1.130592, 1.131908, 1.133186, 1.134427, 1.135629, + 1.136792 + } + }, + { + 181, 40.000000, 400.000000, + 1.0, + { + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 + } + }, + { + 181, 40.000000, 400.000000, + 1.0, + { + 1.879446, 1.865348, 1.851156, 1.836877, 1.822518, + 1.808084, 1.793581, 1.779017, 1.764398, 1.749728, + 1.735014, 1.720261, 1.705476, 1.690662, 1.675827, + 1.660974, 1.646108, 1.631236, 1.616360, 1.601486, + 1.586618, 1.571761, 1.556919, 1.542095, 1.527294, + 1.512519, 1.497775, 1.483064, 1.468390, 1.453756, + 1.439166, 1.424623, 1.410129, 1.395688, 1.381302, + 1.366973, 1.352705, 1.338499, 1.324359, 1.310286, + 1.296282, 1.282349, 1.268490, 1.254705, 1.240998, + 1.227369, 1.213820, 1.200353, 1.186968, 1.173668, + 1.160454, 1.147326, 1.134316, 1.121427, 1.108633, + 1.095933, 1.083332, 1.070830, 1.058428, 1.046129, + 1.033933, 1.021842, 1.009857, 0.997979, 0.986209, + 0.974548, 0.962996, 0.951555, 0.940225, 0.929007, + 0.917901, 0.906907, 0.896026, 0.885259, 0.874605, + 0.864065, 0.853639, 0.843326, 0.833128, 0.823044, + 0.813073, 0.803217, 0.793474, 0.783845, 0.774329, + 0.764926, 0.755636, 0.746458, 0.737392, 0.728439, + 0.719596, 0.710865, 0.702244, 0.693733, 0.685332, + 0.677040, 0.668856, 0.660780, 0.652812, 0.644950, + 0.637194, 0.629545, 0.622000, 0.614559, 0.607222, + 0.599989, 0.592857, 0.585828, 0.578899, 0.572071, + 0.565342, 0.558713, 0.552181, 0.545747, 0.539410, + 0.533170, 0.527024, 0.520973, 0.515017, 0.509153, + 0.503382, 0.497703, 0.492115, 0.486617, 0.481209, + 0.475890, 0.470659, 0.465515, 0.460458, 0.455487, + 0.450602, 0.445801, 0.441084, 0.436451, 0.431899, + 0.427430, 0.423042, 0.418734, 0.414506, 0.410357, + 0.406287, 0.402294, 0.398378, 0.394539, 0.390776, + 0.387087, 0.383474, 0.379934, 0.376467, 0.373074, + 0.369752, 0.366502, 0.363322, 0.360213, 0.357174, + 0.354204, 0.351303, 0.348469, 0.345704, 0.343005, + 0.340373, 0.337807, 0.335306, 0.332871, 0.330501, + 0.328194, 0.325951, 0.323772, 0.321656, 0.319602, + 0.317611, 0.315681, 0.313813, 0.312005, 0.310259, + 0.308574, 0.306948, 0.305383, 0.303877, 0.302431, + 0.301045 + } + } +}; + +static xspect illoc_OPlankian_CIE_1964_10[3] = { + { + 481, 40.000000, 1000.000000, + 1.0, + { + 0.982024, 0.981198, 0.980382, 0.979576, 0.978782, + 0.978000, 0.977230, 0.976474, 0.975733, 0.975007, + 0.974297, 0.973603, 0.972927, 0.972268, 0.971629, + 0.971008, 0.970408, 0.969828, 0.969269, 0.968731, + 0.968216, 0.967723, 0.967253, 0.966807, 0.966385, + 0.965987, 0.965613, 0.965265, 0.964942, 0.964645, + 0.964374, 0.964129, 0.963911, 0.963719, 0.963554, + 0.963416, 0.963305, 0.963222, 0.963166, 0.963138, + 0.963138, 0.963165, 0.963220, 0.963302, 0.963413, + 0.963551, 0.963717, 0.963911, 0.964133, 0.964382, + 0.964659, 0.964963, 0.965295, 0.965654, 0.966040, + 0.966453, 0.966894, 0.967361, 0.967855, 0.968375, + 0.968922, 0.969495, 0.970094, 0.970719, 0.971369, + 0.972045, 0.972746, 0.973473, 0.974224, 0.975000, + 0.975800, 0.976625, 0.977473, 0.978346, 0.979242, + 0.980161, 0.981103, 0.982069, 0.983057, 0.984068, + 0.985100, 0.986155, 0.987232, 0.988330, 0.989450, + 0.990590, 0.991752, 0.992934, 0.994136, 0.995359, + 0.996601, 0.997864, 0.999146, 1.000447, 1.001767, + 1.003106, 1.004463, 1.005839, 1.007233, 1.008645, + 1.010075, 1.011522, 1.012986, 1.014468, 1.015966, + 1.017481, 1.019012, 1.020560, 1.022123, 1.023703, + 1.025298, 1.026908, 1.028534, 1.030175, 1.031830, + 1.033500, 1.035184, 1.036883, 1.038596, 1.040322, + 1.042063, 1.043816, 1.045583, 1.047363, 1.049156, + 1.050962, 1.052781, 1.054611, 1.056454, 1.058309, + 1.060176, 1.062055, 1.063945, 1.065847, 1.067760, + 1.069684, 1.071618, 1.073564, 1.075520, 1.077487, + 1.079463, 1.081450, 1.083447, 1.085454, 1.087470, + 1.089496, 1.091532, 1.093576, 1.095630, 1.097692, + 1.099764, 1.101844, 1.103933, 1.106030, 1.108135, + 1.110249, 1.112370, 1.114500, 1.116637, 1.118782, + 1.120934, 1.123094, 1.125260, 1.127435, 1.129616, + 1.131804, 1.133998, 1.136200, 1.138408, 1.140622, + 1.142843, 1.145070, 1.147303, 1.149542, 1.151787, + 1.154037, 1.156293, 1.158555, 1.160823, 1.163095, + 1.165373, 1.167656, 1.169944, 1.172237, 1.174535, + 1.176838, 1.179145, 1.181457, 1.183773, 1.186094, + 1.188419, 1.190748, 1.193081, 1.195418, 1.197759, + 1.200104, 1.202453, 1.204805, 1.207161, 1.209521, + 1.211884, 1.214250, 1.216619, 1.218992, 1.221367, + 1.223746, 1.226128, 1.228512, 1.230899, 1.233289, + 1.235682, 1.238077, 1.240475, 1.242875, 1.245277, + 1.247682, 1.250088, 1.252497, 1.254908, 1.257321, + 1.259736, 1.262153, 1.264571, 1.266992, 1.269414, + 1.271837, 1.274262, 1.276689, 1.279116, 1.281546, + 1.283976, 1.286408, 1.288841, 1.291275, 1.293710, + 1.296146, 1.298583, 1.301021, 1.303460, 1.305899, + 1.308340, 1.310780, 1.313222, 1.315664, 1.318106, + 1.320549, 1.322993, 1.325437, 1.327881, 1.330325, + 1.332770, 1.335214, 1.337659, 1.340104, 1.342549, + 1.344994, 1.347438, 1.349883, 1.352328, 1.354772, + 1.357216, 1.359660, 1.362103, 1.364546, 1.366989, + 1.369431, 1.371872, 1.374314, 1.376754, 1.379194, + 1.381633, 1.384072, 1.386509, 1.388946, 1.391383, + 1.393818, 1.396252, 1.398686, 1.401119, 1.403550, + 1.405981, 1.408410, 1.410839, 1.413266, 1.415692, + 1.418117, 1.420541, 1.422963, 1.425384, 1.427804, + 1.430222, 1.432640, 1.435055, 1.437469, 1.439882, + 1.442293, 1.444703, 1.447111, 1.449518, 1.451923, + 1.454326, 1.456728, 1.459128, 1.461526, 1.463922, + 1.466317, 1.468710, 1.471101, 1.473490, 1.475877, + 1.478263, 1.480646, 1.483028, 1.485407, 1.487785, + 1.490160, 1.492534, 1.494905, 1.497274, 1.499642, + 1.502007, 1.504370, 1.506730, 1.509089, 1.511445, + 1.513799, 1.516151, 1.518501, 1.520848, 1.523193, + 1.525536, 1.527876, 1.530214, 1.532549, 1.534883, + 1.537213, 1.539541, 1.541867, 1.544191, 1.546511, + 1.548830, 1.551145, 1.553459, 1.555769, 1.558077, + 1.560383, 1.562686, 1.564986, 1.567284, 1.569579, + 1.571871, 1.574160, 1.576447, 1.578732, 1.581013, + 1.583292, 1.585568, 1.587841, 1.590111, 1.592379, + 1.594644, 1.596906, 1.599165, 1.601422, 1.603675, + 1.605926, 1.608173, 1.610418, 1.612660, 1.614899, + 1.617135, 1.619369, 1.621599, 1.623826, 1.626051, + 1.628272, 1.630490, 1.632706, 1.634918, 1.637127, + 1.639334, 1.641537, 1.643737, 1.645935, 1.648129, + 1.650320, 1.652508, 1.654693, 1.656875, 1.659053, + 1.661229, 1.663401, 1.665571, 1.667737, 1.669900, + 1.672060, 1.674217, 1.676370, 1.678521, 1.680668, + 1.682812, 1.684953, 1.687091, 1.689225, 1.691357, + 1.693485, 1.695609, 1.697731, 1.699849, 1.701965, + 1.704076, 1.706185, 1.708290, 1.710393, 1.712491, + 1.714587, 1.716679, 1.718768, 1.720854, 1.722936, + 1.725016, 1.727091, 1.729164, 1.731233, 1.733299, + 1.735362, 1.737421, 1.739477, 1.741530, 1.743579, + 1.745625, 1.747667, 1.749707, 1.751743, 1.753775, + 1.755804, 1.757830, 1.759853, 1.761872, 1.763888, + 1.765900, 1.767909, 1.769915, 1.771917, 1.773916, + 1.775911, 1.777904, 1.779892, 1.781878, 1.783860, + 1.785838, 1.787814, 1.789785, 1.791754, 1.793719, + 1.795680, 1.797639, 1.799593, 1.801545, 1.803493, + 1.805437, 1.807379, 1.809316, 1.811251, 1.813182, + 1.815109, 1.817034, 1.818954, 1.820872, 1.822786, + 1.824696, 1.826603, 1.828507, 1.830407, 1.832304, + 1.834197, 1.836087, 1.837974, 1.839857, 1.841737, + 1.843613 + } + }, + { + 481, 40.000000, 1000.000000, + 1.0, + { + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 + } + }, + { + 481, 40.000000, 1000.000000, + 1.0, + { + 1.924417, 1.909963, 1.895433, 1.880833, 1.866169, + 1.851446, 1.836670, 1.821847, 1.806982, 1.792079, + 1.777145, 1.762185, 1.747204, 1.732207, 1.717200, + 1.702186, 1.687172, 1.672162, 1.657160, 1.642171, + 1.627200, 1.612250, 1.597327, 1.582434, 1.567576, + 1.552755, 1.537977, 1.523244, 1.508560, 1.493928, + 1.479353, 1.464836, 1.450380, 1.435990, 1.421667, + 1.407414, 1.393233, 1.379128, 1.365099, 1.351151, + 1.337283, 1.323499, 1.309801, 1.296189, 1.282666, + 1.269233, 1.255891, 1.242643, 1.229488, 1.216429, + 1.203466, 1.190600, 1.177833, 1.165164, 1.152595, + 1.140127, 1.127759, 1.115493, 1.103328, 1.091266, + 1.079307, 1.067450, 1.055696, 1.044046, 1.032499, + 1.021055, 1.009714, 0.998477, 0.987344, 0.976313, + 0.965385, 0.954560, 0.943837, 0.933217, 0.922698, + 0.912282, 0.901966, 0.891751, 0.881636, 0.871622, + 0.861707, 0.851891, 0.842173, 0.832554, 0.823032, + 0.813606, 0.804277, 0.795044, 0.785906, 0.776862, + 0.767912, 0.759056, 0.750292, 0.741619, 0.733038, + 0.724548, 0.716148, 0.707836, 0.699613, 0.691478, + 0.683430, 0.675469, 0.667593, 0.659802, 0.652096, + 0.644473, 0.636932, 0.629474, 0.622098, 0.614802, + 0.607586, 0.600449, 0.593390, 0.586410, 0.579507, + 0.572679, 0.565928, 0.559252, 0.552649, 0.546121, + 0.539665, 0.533281, 0.526969, 0.520728, 0.514556, + 0.508454, 0.502421, 0.496455, 0.490557, 0.484726, + 0.478960, 0.473260, 0.467625, 0.462053, 0.456545, + 0.451100, 0.445716, 0.440394, 0.435133, 0.429932, + 0.424791, 0.419708, 0.414684, 0.409718, 0.404808, + 0.399955, 0.395158, 0.390417, 0.385730, 0.381097, + 0.376517, 0.371991, 0.367517, 0.363095, 0.358724, + 0.354404, 0.350135, 0.345915, 0.341744, 0.337621, + 0.333547, 0.329520, 0.325540, 0.321607, 0.317720, + 0.313878, 0.310081, 0.306329, 0.302621, 0.298956, + 0.295335, 0.291756, 0.288219, 0.284723, 0.281269, + 0.277856, 0.274483, 0.271149, 0.267855, 0.264600, + 0.261384, 0.258205, 0.255064, 0.251961, 0.248894, + 0.245864, 0.242869, 0.239910, 0.236986, 0.234097, + 0.231243, 0.228422, 0.225635, 0.222881, 0.220161, + 0.217472, 0.214816, 0.212191, 0.209598, 0.207035, + 0.204504, 0.202002, 0.199531, 0.197089, 0.194677, + 0.192293, 0.189938, 0.187612, 0.185313, 0.183042, + 0.180798, 0.178581, 0.176391, 0.174227, 0.172090, + 0.169978, 0.167891, 0.165830, 0.163794, 0.161782, + 0.159794, 0.157831, 0.155891, 0.153975, 0.152082, + 0.150211, 0.148364, 0.146539, 0.144736, 0.142954, + 0.141195, 0.139457, 0.137739, 0.136043, 0.134367, + 0.132712, 0.131077, 0.129462, 0.127866, 0.126290, + 0.124733, 0.123194, 0.121675, 0.120174, 0.118692, + 0.117227, 0.115781, 0.114352, 0.112940, 0.111546, + 0.110169, 0.108808, 0.107465, 0.106137, 0.104826, + 0.103531, 0.102252, 0.100988, 0.099740, 0.098508, + 0.097290, 0.096087, 0.094899, 0.093726, 0.092567, + 0.091422, 0.090291, 0.089174, 0.088071, 0.086981, + 0.085905, 0.084842, 0.083792, 0.082755, 0.081731, + 0.080719, 0.079720, 0.078733, 0.077759, 0.076796, + 0.075845, 0.074906, 0.073978, 0.073062, 0.072157, + 0.071264, 0.070381, 0.069509, 0.068648, 0.067798, + 0.066958, 0.066128, 0.065309, 0.064500, 0.063701, + 0.062911, 0.062132, 0.061362, 0.060602, 0.059851, + 0.059109, 0.058376, 0.057653, 0.056938, 0.056233, + 0.055536, 0.054848, 0.054168, 0.053497, 0.052834, + 0.052179, 0.051532, 0.050893, 0.050263, 0.049640, + 0.049025, 0.048417, 0.047817, 0.047224, 0.046639, + 0.046061, 0.045490, 0.044927, 0.044370, 0.043820, + 0.043277, 0.042741, 0.042211, 0.041688, 0.041172, + 0.040662, 0.040158, 0.039660, 0.039169, 0.038684, + 0.038205, 0.037731, 0.037264, 0.036802, 0.036347, + 0.035897, 0.035452, 0.035013, 0.034579, 0.034151, + 0.033728, 0.033311, 0.032899, 0.032491, 0.032089, + 0.031692, 0.031300, 0.030912, 0.030530, 0.030152, + 0.029779, 0.029411, 0.029047, 0.028688, 0.028333, + 0.027982, 0.027636, 0.027295, 0.026957, 0.026624, + 0.026295, 0.025970, 0.025649, 0.025332, 0.025019, + 0.024709, 0.024404, 0.024103, 0.023805, 0.023511, + 0.023221, 0.022934, 0.022651, 0.022371, 0.022095, + 0.021822, 0.021553, 0.021287, 0.021024, 0.020765, + 0.020509, 0.020256, 0.020006, 0.019759, 0.019515, + 0.019275, 0.019037, 0.018803, 0.018571, 0.018342, + 0.018116, 0.017893, 0.017672, 0.017455, 0.017240, + 0.017028, 0.016818, 0.016611, 0.016406, 0.016205, + 0.016005, 0.015808, 0.015614, 0.015422, 0.015232, + 0.015045, 0.014860, 0.014677, 0.014497, 0.014319, + 0.014143, 0.013969, 0.013798, 0.013628, 0.013461, + 0.013296, 0.013132, 0.012971, 0.012812, 0.012655, + 0.012500, 0.012346, 0.012195, 0.012046, 0.011898, + 0.011752, 0.011608, 0.011466, 0.011325, 0.011187, + 0.011050, 0.010915, 0.010781, 0.010649, 0.010519, + 0.010390, 0.010263, 0.010137, 0.010013, 0.009891, + 0.009770, 0.009651, 0.009533, 0.009416, 0.009301, + 0.009188, 0.009076, 0.008965, 0.008856, 0.008747, + 0.008641, 0.008535, 0.008431, 0.008328, 0.008227, + 0.008127, 0.008028, 0.007930, 0.007833, 0.007738, + 0.007644, 0.007551, 0.007459, 0.007368, 0.007278, + 0.007190, 0.007102, 0.007016, 0.006931, 0.006847, + 0.006763, 0.006681, 0.006600, 0.006520, 0.006441, + 0.006363 + } + } +}; + +static xspect illoc_ODaylight_CIE_1964_10[3] = { + { + 181, 40.000000, 400.000000, + 1.0, + { + 0.954689, 0.954137, 0.953592, 0.953054, 0.952523, + 0.952001, 0.951488, 0.950984, 0.950490, 0.950007, + 0.949535, 0.949074, 0.948627, 0.948192, 0.947770, + 0.947363, 0.946970, 0.946591, 0.946229, 0.945882, + 0.945551, 0.945238, 0.944942, 0.944663, 0.944402, + 0.944161, 0.943938, 0.943734, 0.943550, 0.943386, + 0.943243, 0.943120, 0.943019, 0.942939, 0.942880, + 0.942844, 0.942831, 0.942840, 0.942872, 0.942927, + 0.943006, 0.943109, 0.943235, 0.943387, 0.943562, + 0.943763, 0.943988, 0.944239, 0.944516, 0.944818, + 0.945146, 0.945500, 0.945880, 0.946285, 0.946716, + 0.947174, 0.947658, 0.948168, 0.948706, 0.949270, + 0.949861, 0.950478, 0.951123, 0.951794, 0.952492, + 0.953217, 0.953969, 0.954747, 0.955552, 0.956384, + 0.957242, 0.958127, 0.959039, 0.959976, 0.960940, + 0.961930, 0.962946, 0.963988, 0.965056, 0.966149, + 0.967268, 0.968412, 0.969581, 0.970775, 0.971994, + 0.973237, 0.974504, 0.975796, 0.977111, 0.978450, + 0.979812, 0.981197, 0.982605, 0.984035, 0.985488, + 0.986963, 0.988459, 0.989976, 0.991515, 0.993074, + 0.994653, 0.996252, 0.997871, 0.999509, 1.001166, + 1.002842, 1.004535, 1.006246, 1.007974, 1.009719, + 1.011480, 1.013257, 1.015050, 1.016857, 1.018679, + 1.020514, 1.022363, 1.024225, 1.026100, 1.027986, + 1.029883, 1.031791, 1.033710, 1.035637, 1.037574, + 1.039519, 1.041472, 1.043432, 1.045399, 1.047371, + 1.049348, 1.051330, 1.053315, 1.055304, 1.057295, + 1.059288, 1.061281, 1.063275, 1.065268, 1.067259, + 1.069249, 1.071235, 1.073218, 1.075196, 1.077168, + 1.079135, 1.081094, 1.083046, 1.084988, 1.086921, + 1.088844, 1.090754, 1.092653, 1.094538, 1.096409, + 1.098265, 1.100105, 1.101927, 1.103732, 1.105518, + 1.107284, 1.109029, 1.110752, 1.112453, 1.114129, + 1.115781, 1.117407, 1.119007, 1.120578, 1.122121, + 1.123634, 1.125116, 1.126567, 1.127985, 1.129369, + 1.130718, 1.132032, 1.133309, 1.134548, 1.135749, + 1.136910 + } + }, + { + 181, 40.000000, 400.000000, + 1.0, + { + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, + 1.000000 } }, { - 189, 60.000000, 1000.000000, + 181, 40.000000, 400.000000, 1.0, { - 1.775958, 1.738417, 1.700795, 1.663169, 1.625615, - 1.588201, 1.550992, 1.514049, 1.477427, 1.441177, - 1.405344, 1.369969, 1.335088, 1.300732, 1.266930, - 1.233704, 1.201074, 1.169056, 1.137662, 1.106903, - 1.076786, 1.047315, 1.018493, 0.990321, 0.962796, - 0.935916, 0.909677, 0.884073, 0.859098, 0.834744, - 0.811003, 0.787866, 0.765323, 0.743365, 0.721980, - 0.701159, 0.680891, 0.661164, 0.641968, 0.623290, - 0.605120, 0.587446, 0.570257, 0.553542, 0.537290, - 0.521489, 0.506129, 0.491199, 0.476688, 0.462586, - 0.448883, 0.435567, 0.422630, 0.410062, 0.397852, - 0.385993, 0.374473, 0.363285, 0.352420, 0.341868, - 0.331622, 0.321672, 0.312013, 0.302634, 0.293529, - 0.284689, 0.276109, 0.267780, 0.259696, 0.251849, - 0.244234, 0.236843, 0.229670, 0.222710, 0.215956, - 0.209402, 0.203043, 0.196873, 0.190887, 0.185079, - 0.179445, 0.173979, 0.168676, 0.163533, 0.158544, - 0.153704, 0.149010, 0.144457, 0.140042, 0.135759, - 0.131606, 0.127578, 0.123672, 0.119884, 0.116210, - 0.112648, 0.109194, 0.105845, 0.102598, 0.099449, - 0.096397, 0.093437, 0.090567, 0.087785, 0.085088, - 0.082473, 0.079938, 0.077480, 0.075098, 0.072788, - 0.070550, 0.068380, 0.066276, 0.064237, 0.062260, - 0.060345, 0.058488, 0.056688, 0.054943, 0.053252, - 0.051613, 0.050025, 0.048485, 0.046993, 0.045547, - 0.044145, 0.042787, 0.041470, 0.040194, 0.038958, - 0.037760, 0.036598, 0.035473, 0.034382, 0.033325, - 0.032300, 0.031308, 0.030346, 0.029413, 0.028510, - 0.027634, 0.026786, 0.025963, 0.025166, 0.024394, - 0.023646, 0.022921, 0.022218, 0.021537, 0.020877, - 0.020237, 0.019618, 0.019017, 0.018435, 0.017871, - 0.017324, 0.016795, 0.016281, 0.015784, 0.015302, - 0.014835, 0.014382, 0.013943, 0.013518, 0.013106, - 0.012706, 0.012319, 0.011944, 0.011581, 0.011228, - 0.010887, 0.010556, 0.010235, 0.009925, 0.009623, - 0.009331, 0.009048, 0.008774, 0.008508, 0.008251, - 0.008001, 0.007759, 0.007524, 0.007297, 0.007077, - 0.006863, 0.006656, 0.006455, 0.006261 + 1.880550, 1.866451, 1.852259, 1.837979, 1.823618, + 1.809182, 1.794679, 1.780113, 1.765491, 1.750820, + 1.736104, 1.721349, 1.706561, 1.691745, 1.676907, + 1.662051, 1.647182, 1.632306, 1.617427, 1.602550, + 1.587679, 1.572818, 1.557971, 1.543143, 1.528338, + 1.513559, 1.498810, 1.484094, 1.469415, 1.454777, + 1.440182, 1.425633, 1.411134, 1.396687, 1.382295, + 1.367961, 1.353687, 1.339475, 1.325329, 1.311249, + 1.297239, 1.283299, 1.269433, 1.255642, 1.241928, + 1.228292, 1.214736, 1.201262, 1.187870, 1.174563, + 1.161341, 1.148206, 1.135188, 1.122292, 1.109489, + 1.096782, 1.084173, 1.071663, 1.059253, 1.046946, + 1.034742, 1.022643, 1.010649, 0.998763, 0.986985, + 0.975315, 0.963755, 0.952306, 0.940967, 0.929740, + 0.918626, 0.907623, 0.896734, 0.885958, 0.875296, + 0.864747, 0.854312, 0.843991, 0.833784, 0.823691, + 0.813712, 0.803847, 0.794095, 0.784457, 0.774933, + 0.765521, 0.756222, 0.747036, 0.737962, 0.729000, + 0.720149, 0.711409, 0.702779, 0.694260, 0.685850, + 0.677549, 0.669357, 0.661272, 0.653296, 0.645425, + 0.637662, 0.630004, 0.622450, 0.615002, 0.607657, + 0.600415, 0.593275, 0.586237, 0.579301, 0.572464, + 0.565728, 0.559090, 0.552551, 0.546109, 0.539764, + 0.533516, 0.527363, 0.521304, 0.515340, 0.509469, + 0.503690, 0.498004, 0.492408, 0.486903, 0.481488, + 0.476161, 0.470923, 0.465772, 0.460709, 0.455731, + 0.450839, 0.446031, 0.441307, 0.436667, 0.432109, + 0.427633, 0.423238, 0.418924, 0.414689, 0.410534, + 0.406457, 0.402459, 0.398537, 0.394691, 0.390922, + 0.387228, 0.383608, 0.380063, 0.376591, 0.373191, + 0.369864, 0.366608, 0.363424, 0.360309, 0.357265, + 0.354290, 0.351383, 0.348545, 0.345774, 0.343071, + 0.340434, 0.337863, 0.335359, 0.332919, 0.330544, + 0.328233, 0.325986, 0.323803, 0.321683, 0.319625, + 0.317629, 0.315696, 0.313824, 0.312014, 0.310264, + 0.308575, 0.306946, 0.305378, 0.303869, 0.302420, + 0.301031 } } }; @@ -5453,16 +7716,13 @@ static double cct2_func(void *fdata, double tp[]) { } -/* Given a choice of temperature dependent illuminant (icxIT_Dtemp or icxIT_Ptemp), */ -/* return the closest correlated color temperature to the XYZ. */ -/* An observer type can be chosen for interpretting the spectrum of the input and */ -/* the illuminant. */ +/* Given a particular locus indexed in Mired, */ +/* return the closest color temperature to the XYZ. */ /* Return -1.0 on erorr */ -double icx_XYZ2ill_ct2( +static double icx_XYZ2ill_ct3( double txyz[3], /* If not NULL, return the XYZ of the locus temperature */ -icxIllumeType ilType, /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ -icxObserverType obType, /* Observer, CIE_1931_2 or CIE_1964_10 */ -double xyz[3], /* Input XYZ value */ +xspect *iloc, /* Locus to match to */ +double xyz[3], /* Input XYZ value in given observer space. */ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ ) { cct2ctx x; /* Context for callback */ @@ -5472,27 +7732,7 @@ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ double tc, ber, bct = 0.0; x.viscct = viscct; - - if (ilType != icxIT_Dtemp && ilType != icxIT_Ptemp) - return -1.0; - if (obType != icxOT_CIE_1931_2 && obType != icxOT_CIE_1964_10) - return -1.0; - - /* Locus to use */ - if (obType == icxOT_CIE_1931_2) { - if (ilType == icxIT_Dtemp) { - x.iloc = illoc_Daylight_CIE_1931_2; - } else { - x.iloc = illoc_Plankian_CIE_1931_2; - } - } else { - if (ilType == icxIT_Dtemp) { - x.iloc = illoc_Daylight_CIE_1964_10; - } else { - x.iloc = illoc_Plankian_CIE_1964_10; - } - } - + x.iloc = iloc; icmAry2Ary(x.xyz, xyz); /* Normalise target */ @@ -5536,14 +7776,61 @@ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ return 1e6/cp[0]; } -/* Given a choice of temperature dependent illuminant (icxIT_Dtemp or icxIT_Ptemp), */ +/* Given a choice of temperature dependent illuminant (icxIT_[O]Dtemp or icxIT_[O]Ptemp), */ +/* return the closest correlated color temperature to the XYZ. */ +/* An observer type can be chosen for interpretting the spectrum of the input and */ +/* the illuminant. */ +/* Return -1.0 on erorr */ +double icx_XYZ2ill_ct2( +double txyz[3], /* If not NULL, return the XYZ of the locus temperature */ +icxIllumeType ilType, /* Type of illuminant, icxIT_[O]Dtemp or icxIT_[O]Ptemp */ +icxObserverType obType, /* Observer, CIE_1931_2 or CIE_1964_10 */ +double xyz[3], /* Input XYZ value in given observer space. */ +int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ +) { + xspect *iloc = NULL; + + if (ilType != icxIT_Dtemp && ilType != icxIT_Ptemp + && ilType != icxIT_ODtemp && ilType != icxIT_OPtemp) + return -1.0; + if (obType != icxOT_CIE_1931_2 && obType != icxOT_CIE_1964_10) + return -1.0; + + /* Locus to use */ + if (obType == icxOT_CIE_1931_2) { + if (ilType == icxIT_Dtemp) { + iloc = illoc_Daylight_CIE_1931_2; + } else if (ilType == icxIT_Ptemp) { + iloc = illoc_Plankian_CIE_1931_2; + } else if (ilType == icxIT_ODtemp) { + iloc = illoc_ODaylight_CIE_1931_2; + } else if (ilType == icxIT_OPtemp) { + iloc = illoc_OPlankian_CIE_1931_2; + } + } else { + if (ilType == icxIT_Dtemp) { + iloc = illoc_Daylight_CIE_1964_10; + } else if (ilType == icxIT_Ptemp) { + iloc = illoc_Plankian_CIE_1964_10; + } else if (ilType == icxIT_ODtemp) { + iloc = illoc_ODaylight_CIE_1964_10; + } else if (ilType == icxIT_OPtemp) { + iloc = illoc_OPlankian_CIE_1964_10; + } + } + + /* Let icx_XYZ2ill_ct3() do all the hard work */ + return icx_XYZ2ill_ct3(txyz, iloc, xyz, viscct); +} + +/* Given a choice of temperature dependent illuminant (icxIT_[O]Dtemp or icxIT_[O]Ptemp), */ /* a color temperature and a Y value, return the corresponding XYZ */ /* An observer type can be chosen for interpretting the spectrum of the input and */ /* the illuminant. */ /* Return xyz[0] = -1.0 on erorr */ void icx_ill_ct2XYZ( double xyz[3], /* Return the XYZ value */ -icxIllumeType ilType, /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ +icxIllumeType ilType, /* Type of illuminant, icxIT_[O]Dtemp or icxIT_[O]Ptemp */ icxObserverType obType, /* Observer, CIE_1931_2 or CIE_1964_10 */ int viscct, /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ double tin, /* Input temperature */ @@ -5553,7 +7840,8 @@ double Yin /* Input Y value */ double cp[1], s[1]; - if (ilType != icxIT_Dtemp && ilType != icxIT_Ptemp) { + if (ilType != icxIT_Dtemp && ilType != icxIT_Ptemp + && ilType != icxIT_ODtemp && ilType != icxIT_OPtemp) { xyz[0] = -1.0; return; } @@ -5566,14 +7854,22 @@ double Yin /* Input Y value */ if (obType == icxOT_CIE_1931_2) { if (ilType == icxIT_Dtemp) { iloc = illoc_Daylight_CIE_1931_2; - } else { + } else if (ilType == icxIT_Ptemp) { iloc = illoc_Plankian_CIE_1931_2; + } else if (ilType == icxIT_ODtemp) { + iloc = illoc_ODaylight_CIE_1931_2; + } else if (ilType == icxIT_OPtemp) { + iloc = illoc_OPlankian_CIE_1931_2; } } else { if (ilType == icxIT_Dtemp) { iloc = illoc_Daylight_CIE_1964_10; - } else { + } else if (ilType == icxIT_Ptemp) { iloc = illoc_Plankian_CIE_1964_10; + } else if (ilType == icxIT_ODtemp) { + iloc = illoc_ODaylight_CIE_1964_10; + } else if (ilType == icxIT_OPtemp) { + iloc = illoc_OPlankian_CIE_1964_10; } } @@ -6491,7 +8787,7 @@ int icx_ill_sp2XYZ( double xyz[3], /* Return XYZ value with Y == 1 */ icxObserverType obType, /* Observer */ xspect custObserver[3], /* Optional custom observer */ -icxIllumeType ilType, /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ +icxIllumeType ilType, /* Type of illuminant, icxIT_[O]Dtemp or icxIT_[O]Ptemp */ double ct, /* Input temperature in degrees K */ xspect *custIllum /* Optional custom illuminant */ ) { @@ -6519,10 +8815,48 @@ xspect *custIllum /* Optional custom illuminant */ } /* - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* Aproximate CCT using polinomial. No good < 3000K */ +/* Use this for sanity check */ +#ifdef NEVER +static double aprox_CCT(double xyz[3]) { + double xe = 0.3366; + double ye = 0.1735; + double A0 = -949.86315; + double A1 = 6253.80338; + double t1 = 0.92159; + double A2 = 28.70599; + double t2 = 0.20039; + double A3 = 0.00004; + double t3 = 0.07125; + double Yxy[3]; + double n; + double cct; + + icmXYZ2Yxy(Yxy, xyz); + n = (Yxy[1] - xe)/(Yxy[2] - ye); + cct = A0 + A1 * exp(-n/t1) + A2 * exp(-n/t2) + A3 * exp(-n/t3); + + return cct; +} +#else +static double aprox_CCT(double xyz[3]) { + double Yxy[3]; + double n; + double cct; + + icmXYZ2Yxy(Yxy, xyz); + n = (Yxy[1] - 0.3320)/(Yxy[2] - 0.1858); + cct = -449.0 * n * n * n + 3525.0 * n * n - 6823.3 * n + 5520.33; + return cct; +} +#endif + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* Full precision CCT */ /* Context for optimiser callback */ typedef struct { - icxIllumeType ilType; /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ + icxIllumeType ilType; /* Type of illuminant, icxIT_[O]Dtemp or icx[O]IT_Ptemp */ double xyz[3]; /* Target XYZ */ icmXYZNumber XYZ; /* Target as XYZ number */ xsp2cie *conv; /* Means of converting spectrum to XYZ */ @@ -6541,9 +8875,15 @@ static double cct_func(void *fdata, double tp[]) { if (x->ilType == icxIT_Dtemp) { if (daylight_il(&sp, tp[0]) != 0) rv = 1e6; - } else { + } else if (x->ilType == icxIT_Ptemp) { if (planckian_il(&sp, tp[0]) != 0) rv = 1e6; + } else if (x->ilType == icxIT_ODtemp) { + if (daylight_old_il(&sp, tp[0]) != 0) + rv = 1e6; + } else if (x->ilType == icxIT_OPtemp) { + if (planckian_old_il(&sp, tp[0]) != 0) + rv = 1e6; } if (rv == 0.0) { @@ -6570,14 +8910,14 @@ static double cct_func(void *fdata, double tp[]) { } -/* Given a choice of temperature dependent illuminant (icxIT_Dtemp or icxIT_Ptemp), */ +/* Given a choice of temperature dependent illuminant (icxIT_[O]Dtemp or icxIT_[O]Ptemp), */ /* return the closest correlated color temperature to the given spectrum or XYZ. */ /* An observer type can be chosen for interpretting the spectrum of the input and */ /* the illuminant. */ /* Return -1 on erorr */ double icx_XYZ2ill_ct( double txyz[3], /* If not NULL, return the XYZ of the locus temperature */ -icxIllumeType ilType, /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ +icxIllumeType ilType, /* Type of illuminant, icxIT_[O]Dtemp or icx[O]IT_Ptemp */ icxObserverType obType, /* Observer */ xspect custObserver[3], /* Optional custom observer */ double xyz[3], /* Input XYZ value, NULL if spectrum intead */ @@ -6592,7 +8932,8 @@ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ x.viscct = viscct; - if (ilType != icxIT_Dtemp && ilType != icxIT_Ptemp) + if (ilType != icxIT_Dtemp && ilType != icxIT_Ptemp + && ilType != icxIT_ODtemp && ilType != icxIT_OPtemp) return -1.0; x.ilType = ilType; @@ -6606,6 +8947,7 @@ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ } else { icmAry2Ary(x.xyz, xyz); } +//printf("~1 aprox CCT = %f\n",aprox_CCT(x.xyz)); /* Normalise target */ x.xyz[0] /= x.xyz[1]; @@ -6640,12 +8982,24 @@ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ txyz[0] = txyz[2] = txyz[1] = cp[0] = 0.0; return cp[0]; } - } else { + } else if (x.ilType == icxIT_Ptemp) { if (planckian_il(&sp, cp[0]) != 0) { x.conv->del(x.conv); txyz[0] = txyz[2] = txyz[1] = cp[0] = 0.0; return cp[0]; } + } else if (x.ilType == icxIT_ODtemp) { + if (daylight_old_il(&sp, cp[0]) != 0) { + x.conv->del(x.conv); + txyz[0] = txyz[2] = txyz[1] = cp[0] = 0.0; + return cp[0]; + } + } else if (x.ilType == icxIT_OPtemp) { + if (planckian_old_il(&sp, cp[0]) != 0) { + x.conv->del(x.conv); + txyz[0] = txyz[2] = txyz[1] = cp[0] = 0.0; + return cp[0]; + } } x.conv->convert(x.conv, txyz, &sp); /* Make sure locus XYZ is Normalised */ @@ -6655,7 +9009,7 @@ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ } x.conv->del(x.conv); -//DBGF((DBGA,"returning %f with error %f delta E94 %f\n",cp[0],sqrt(rv))); +//DBGF((DBGA,"returning CT %f with error %f\n",cp[0],sqrt(rv))); return cp[0]; } @@ -6671,14 +9025,13 @@ static void UCSYuv2Ycd(double *out, double *in) { out[2] = (1.708 * v - 1.481 * u + 0.404)/v; } - - /* Compute the CIE1995 CRI: Ra */ /* Return < 0.0 on error */ /* If invalid is not NULL, set it to nz if CRI */ /* is invalid because the sample is not white enough. */ double icx_CIE1995_CRI( int *invalid, /* if not NULL, set to nz if invalid */ +double cris[14], /* If not NULL, return the TCS01-14 CRI's */ xspect *sample /* Illuminant sample to compute CRI of */ ) { int i; @@ -6691,15 +9044,21 @@ xspect *sample /* Illuminant sample to compute CRI of */ double sa[3]; /* Sample white in CIE 1960 UCS */ double sa_Ycd[3]; /* Ycd sample white */ double dc; /* delta of sample to reference white in 1960 UCS */ - double ref[8][3]; /* reference XYZ/1964 color space */ - double sam[8][3]; /* sample XYZ/1964 color space */ + double ref[14][3]; /* reference XYZ/1964 color space */ + double sam[14][3]; /* sample XYZ/1964 color space */ double c_ad, d_ad; /* Chromatic adaptation scaling factors */ double cri = 0.0; + double sampnorm; /* Original sample norm value */ //DBGF((DBGA,"icx_CIE1995_CRI called\n")); - /* First find the standard 2 degree observer plankian CCT */ - if ((cct = icx_XYZ2ill_ct(NULL, icxIT_Ptemp, icxOT_CIE_1931_2, NULL, NULL, sample, 0)) < 0.0) + if ((tocie = new_xsp2cie(icxIT_none, NULL, icxOT_CIE_1931_2, NULL, icSigXYZData, 1)) == NULL) + return -1.0; + + /* Compute the XYZ of the sample */ + tocie->convert(tocie, sa, sample); + + if ((cct = icx_XYZ2ill_ct(NULL, icxIT_Ptemp, icxOT_CIE_1931_2, NULL, sa, NULL, 0)) < 0.0) return -1.0; //DBGF((DBGA,"CCT = %f\n", cct)); @@ -6713,19 +9072,16 @@ xspect *sample /* Illuminant sample to compute CRI of */ return -1.0; } - if ((tocie = new_xsp2cie(icxIT_none, NULL, icxOT_CIE_1931_2, NULL, icSigXYZData, 1)) == NULL) - return -1.0; - - /* Compute the XYZ of the reference white and sample */ + /* Compute the XYZ of the reference white */ tocie->convert(tocie, wt, &wts); - tocie->convert(tocie, sa, sample); //DBGF((DBGA,"XYZ white = %f %f %f\n",wt[0],wt[1],wt[2])); //DBGF((DBGA,"XYZ sampl = %f %f %f\n",sa[0],sa[1],sa[2])); /* Normalize the spectra so as to create a normalized white */ wts.norm *= wt[1]; - sample->norm *= sa[1]; /* ~~~ shouldn't change sample!!!! ~~~~ */ + sampnorm = sample->norm; /* Save this so we can restore it */ + sample->norm *= sa[1]; tocie->convert(tocie, wt, &wts); tocie->convert(tocie, sa, sample); tocie->del(tocie); @@ -6761,18 +9117,25 @@ xspect *sample /* Illuminant sample to compute CRI of */ } /* Check out the delta E for each reflective sample */ - if ((tocie = new_xsp2cie(icxIT_custom, &wts, icxOT_CIE_1931_2, NULL, icSigXYZData, 1)) == NULL) + if ((tocie = new_xsp2cie(icxIT_custom, &wts, icxOT_CIE_1931_2, NULL, icSigXYZData, 1)) == NULL) { + sample->norm = sampnorm; /* Restore this */ return -1.0; - for (i = 0; i < 8; i++) { + } + + /* We compute the CRI of each of the 14 samples, */ + /* even though only the first 8 are used to compute Ra */ + for (i = 0; i < 14; i++) { tocie->convert(tocie, ref[i], &CIE1995_TCS[i]); icmXYZ21964WUV(&wtn, ref[i], ref[i]); //DBGF((DBGA,"ref samp %d = WUV %f %f %f\n", i,ref[i][0],ref[i][1],ref[i][2])); } tocie->del(tocie); - if ((tocie = new_xsp2cie(icxIT_custom, sample, icxOT_CIE_1931_2, NULL, icSigXYZData, 1)) == NULL) + if ((tocie = new_xsp2cie(icxIT_custom, sample, icxOT_CIE_1931_2, NULL, icSigXYZData, 1)) == NULL) { + sample->norm = sampnorm; /* Restore this */ return -1.0; - for (i = 0; i < 8; i++) { + } + for (i = 0; i < 14; i++) { double c, d; tocie->convert(tocie, sam[i], &CIE1995_TCS[i]); @@ -6794,24 +9157,315 @@ xspect *sample /* Illuminant sample to compute CRI of */ } tocie->del(tocie); - /* Compute the CRI */ - for (i = 0; i < 8; i++) { + /* Compute the CRI of all 14, but only average the first 8. */ + for (i = 0; i < 14; i++) { double de, tcri; de = icmLabDE(ref[i], sam[i]); tcri = 100.0 - 4.6 * de; //DBGF((DBGA,"sample %d: de = %f, CRI = %f\n",i,de,tcri)); - cri += tcri; + if (cris != NULL) { + /* Should we clip -ve values ? */ + cris[i] = tcri; + } + if (i < 8) + cri += tcri; } cri /= 8.0; -//DBGF((DBGA,"average CRI = %f\n",cri)); +//DBGF((DBGA,"average CRI of first 8 = %f\n",cri)); if (cri < 0.0) cri = -1.0; //DBGF((DBGA,"returning CRI = %f\n",cri)); + sample->norm = sampnorm; /* Restore this */ return cri; } + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/* EBU TLCI-2012 - used for the assessment of light sources for use in television lighting */ + +/* Camera and display model. Converts camera RGB into XYZ */ +static void TLCI_camdisp(double *out, double *in, double *wb) { + double cam[3][3] = { + { 1.182, -0.209, 0.027 }, + { 0.107, 0.890, 0.003 }, + { 0.040, -0.134, 1.094 } + }; + double a = (1.0 - 90.0/100)/3.0; + double aa = 1.0 - 2.0 * a; + double sat[3][3] = { + { aa, a, a }, + { a, aa, a }, + { a, a, aa } + }; + double disp[3][3] = { + { 0.412391, 0.357584, 0.180481 }, + { 0.212639, 0.715169, 0.072192 }, + { 0.019331, 0.119195, 0.950532 } + }; + int i; + +//DBGF((DBGA,"raw camera RGB %f %f %f\n",in[0],in[1],in[2])); + icmMul3(out, wb, in); /* Apply white balance */ +//DBGF((DBGA,"white balanced camera RGB %f %f %f\n",out[0],out[1],out[2])); + icmMulBy3x3(out, cam, out); /* Camera matrix RGB->RGB*/ +//DBGF((DBGA,"Rec709 optimized camera RGB %f %f %f\n",out[0],out[1],out[2])); + icmMulBy3x3(out, sat, out); /* Saturation matrix */ +//DBGF((DBGA,"Sat adjusted Rec709 camera RGB %f %f %f\n",out[0],out[1],out[2])); + + for (i = 0; i < 3; i++) { /* Camera OETF */ + if (out[i] < 0.018) + out[i] = 4.5 * out[i]; + else + out[i] = 1.099 * pow(out[i], 0.45) - 0.099; + } +//DBGF((DBGA,"Gamma encoded Rec709 camera RGB %f %f %f\n",out[0],out[1],out[2])); + for (i = 0; i < 3; i++) { /* Display OETF */ + if (out[i] < 0.0) + out[i] = 0.0; + else + out[i] = pow(out[i], 2.4); + } +//DBGF((DBGA,"Display RGB %f %f %f\n",out[0],out[1],out[2])); + icmMulBy3x3(out, disp, out); /* Display matrix RGB->XYZ */ + { + double lab[3]; + icmXYZ2Lab(&icmD65, lab, out); +//DBGF((DBGA,"Lab %f %f %f\n", lab[0], lab[1], lab[2])); + } +} + +/* Compute the EBU Television Lighting Consistency Index TLCI-2012 Qa (R 137) */ +/* Return < 0.0 on error */ +/* If invalid is not NULL, set it to nz if TLCI is invalid because the sample is */ +/* not white enough. */ +/* While it is not clear from the specification itself, it appears that it is expected */ +/* that the accuracy of this computation be deliberately crippled to 5nm integration, */ +/* resulting in agreement with TLCI-2012.exe is within 0.01 Qa. */ +/* When computed to higher 1nm accuracy, the resulting Qa values are typically 0.6-0.8 greater. */ +double icx_EBU2012_TLCI( +int *invalid, /* if not NULL, set to nz if invalid */ +xspect *sample /* Illuminant sample to compute TLCI of */ +) { + int i; + double cct; + + xsp2cie *tocie; /* spectral to XYZ conversion */ + + xspect wts; /* Reference white spectrum */ + double wt[3]; /* Reference white in CIE 1960 UCS */ + xsp2cie *reftoRGB; /* Spectrum to reference camera RGB */ + double refwb[3]; /* Reference camera RGB white balance scale */ + icmXYZNumber wtn; /* Lab reference white XYZ */ + + double sa[3]; /* Sample white in CIE 1960 UCS */ + xsp2cie *satoRGB; /* Spectrum to sample camera RGB */ + double sawb[3]; /* Sample camera RGB white balance scale */ + + double dc; /* delta of sample to reference white in 1960 UCS */ + double ref[24][3]; /* reference XYZ/1964 color space */ + double sam[24][3]; /* sample XYZ/1964 color space */ + double c_ad, d_ad; /* Chromatic adaptation scaling factors */ + double tlci = 0.0; + double sampnorm; /* Original sample norm value */ + + int dolowres = 1; /* [1] Use 5nm integration for better match with TLCI-2012.exe */ + +//DBGF((DBGA,"icx_EBU2012_TLCI called\n")); + + /* Create spectral to XYZ for UCS space delta */ + if ((tocie = new_xsp2cie(icxIT_none, NULL, icxOT_CIE_1931_2, NULL, icSigXYZData, 1)) == NULL) { +//DBGF((DBGA,"Ref new_xsp2cie failed\n")); + return -1.0; + } + + /* Compute the XYZ of the sample */ + tocie->convert(tocie, sa, sample); + + /* Find the standard 2 degree observer (Old) Plankian CCT */ + /* (This is a few degrees lower than the current Plankian CCT) */ + if ((cct = icx_XYZ2ill_ct(NULL, icxIT_OPtemp, icxOT_CIE_1931_2, NULL, sa, NULL, 0)) < 0.0) + { +//DBGF((DBGA,"Ref icx_XYZ2ill_ct failed\n")); + return -1.0; + } +//DBGF((DBGA,"CCT = %f\n", cct)); + + /* If it is 5000 or over, use the CDT instead, */ + if (cct > 5000.0) { + if ((cct = icx_XYZ2ill_ct(NULL, icxIT_Dtemp, icxOT_CIE_1931_2, NULL, sa, NULL, 0)) < 0.0) + { +//DBGF((DBGA,"Ref icx_XYZ2ill_ct failed\n")); + return -1.0; + } +//DBGF((DBGA,"CDT = %f\n", cct)); + } + + /* Create a reference white spectrum with the same CCT. */ + if (cct < 3400.0) { + if (planckian_old_il(&wts, cct)) { +//DBGF((DBGA,"planckian_old_il failed\n")); + return -1.0; + } + } else if (cct > 5000.0) { + if (daylight_il(&wts, cct)) { +//DBGF((DBGA,"daylight_il failed\n")); + return -1.0; + } + /* It's a blend between plankian(3400) and daylight(5000) */ + } else { + double dwt; /* Blend weight */ + xspect dwts; + if (planckian_old_il(&wts, 3400.0)) { +//DBGF((DBGA,"planckian_il failed\n")); + return -1.0; + } + if (daylight_il(&dwts, 5000.0)) { +//DBGF((DBGA,"daylight_il failed\n")); + return -1.0; + } + + dwt = (cct - 3400)/(5000.0 - 3400.0); +//DBGF((DBGA,"creating hybrid spectrum with %f Plankian & %f Daylight\n",(1.0 - dwt),dwt)); + for (i = 0; i < wts.spec_n; i++) { + double wl = XSPECT_XWL(&wts, i); /* Wavelength in meters */ + wts.spec[i] = dwt * value_xspect(&dwts, wl) + (1.0 - dwt) * wts.spec[i]; + } + } + + /* Compute the XYZ of the reference white */ + tocie->convert(tocie, wt, &wts); + +//DBGF((DBGA,"XYZ white = %f %f %f\n",wt[0],wt[1],wt[2])); +//DBGF((DBGA,"XYZ sampl = %f %f %f\n",sa[0],sa[1],sa[2])); + + /* Normalize the spectra so as to create a normalized white */ + wts.norm *= wt[1]; + sampnorm = sample->norm; /* Save this so we can restore it */ + sample->norm *= sa[1]; + tocie->convert(tocie, wt, &wts); + tocie->convert(tocie, sa, sample); + tocie->del(tocie); + tocie = NULL; + +//DBGF((DBGA,"norm XYZ white = %f %f %f\n",wt[0],wt[1],wt[2])); +//DBGF((DBGA,"norm XYZ sampl = %f %f %f\n",sa[0],sa[1],sa[2])); + + /* Convert to perceptual CIE 1960 UCS */ + icmXYZ21960UCS(wt, wt); /* 1960 UCS Yuv reference white */ + icmXYZ21960UCS(sa, sa); /* 1960 UCS Yuv sample white */ + +//DBGF((DBGA,"UCS white = %f %f %f\n",wt[0],wt[1],wt[2])); +//DBGF((DBGA,"UCS sampl = %f %f %f\n",sa[0],sa[1],sa[2])); + + dc = sqrt((wt[1] - sa[1]) * (wt[1] - sa[1]) + (wt[2] - sa[2]) * (wt[2] - sa[2])); + +//DBGF((DBGA,"dc = %f (normalized dist %f)\n",dc,dc/0.0054)); +//if (dc > 0.0054) DBGF((DBGA,"TLCI is invalid\n")); + + /* If dc > 0.0054 we should abort computing the TLCI, */ + /* but this means we fail on lots of real world lighting. */ + if (invalid != NULL) { + if (dc > 0.0054) + *invalid = 1; + else + *invalid = 0; + } + + /* Create spectral to camera RGB conversion for reference and sample illuminants */ + /* Note that xsp2cie will normalise the values such that the "Y" value */ + /* (actually G here) to be 1.0 for the perfect diffusor for the given illuminant, */ + /* but that the white balancing scaling would do this anyway. */ + if ((reftoRGB = new_xsp2cie(icxIT_custom, &wts, icxOT_EBU_2012, NULL, icSigXYZData, 1)) == NULL) { +//DBGF((DBGA,"new_xsp2cie for ref failed\n")); + sample->norm = sampnorm; /* Restore this */ + return -1.0; + } + if ((satoRGB = new_xsp2cie(icxIT_custom, sample, icxOT_EBU_2012, NULL, icSigXYZData, 1)) == NULL) { +//DBGF((DBGA,"new_xsp2cie for samp failed\n")); + sample->norm = sampnorm; /* Restore this */ + reftoRGB->del(reftoRGB); + return -1.0; + } + + /* Emulate TLCI-2012.exe */ + if (dolowres) { + reftoRGB->set_int_steps(reftoRGB, 5.0, 380.0, 760.0); + satoRGB->set_int_steps(satoRGB, 5.0, 380.0, 760.0); + } + + /* Compute a white balance for the reference and sample illuminants */ + /* such that 90% spectral flat produce camera RGB = 1.0 for the perfect reflector */ + reftoRGB->convert(reftoRGB, refwb, &il_none); +//DBGF((DBGA,"Ref white RGB = %f %f %f\n",refwb[0],refwb[1],refwb[2])); + refwb[0] = 1.0/(0.9 * refwb[0]); /* White balance scale factors */ + refwb[1] = 1.0/(0.9 * refwb[1]); + refwb[2] = 1.0/(0.9 * refwb[2]); +//DBGF((DBGA,"Ref white balance scale = %f %f %f\n",refwb[0],refwb[1],refwb[2])); + + satoRGB->convert(satoRGB, sawb, &il_none); +//DBGF((DBGA,"Samp white RGB = %f %f %f\n",sawb[0],sawb[1],sawb[2])); + sawb[0] = 1.0/(0.9 * sawb[0]); /* White balance scale factors */ + sawb[1] = 1.0/(0.9 * sawb[1]); + sawb[2] = 1.0/(0.9 * sawb[2]); +//DBGF((DBGA,"Samp white balance scale = %f %f %f\n",sawb[0],sawb[1],sawb[2])); + + /* Compute the display reference white (should be D65) */ + { + double dispw[3] = { 1.0, 1.0, 1.0 }; + + TLCI_camdisp(dispw, dispw, dispw); /* Display white XYZ */ + icmAry2XYZ(wtn, dispw); /* Reference Lab white */ +//DBGF((DBGA,"display white XYZ %f %f %f\n", dispw[0], dispw[1], dispw[2])); + } + + /* Compute the XYZ and DE for all 24 samples, */ + /* but sum TLCI for only the first 18 samples */ + tlci = 0.0; + for (i = 0; i < 24; i++) { + double de; + +//DBGF((DBGA,"\npatch %d\n",i+1)); + reftoRGB->convert(reftoRGB, ref[i], &TLCI_2012_TCS[i]); + TLCI_camdisp(ref[i], ref[i], refwb); +//DBGF((DBGA,"Ref[%d] XYZ = %f %f %f\n\n",i,ref[i][0],ref[i][1],ref[i][2])); + + satoRGB->convert(satoRGB, sam[i], &TLCI_2012_TCS[i]); + TLCI_camdisp(sam[i], sam[i], sawb); +//DBGF((DBGA,"Samp[%d] XYZ = %f %f %f\n\n",i,sam[i][0],sam[i][1],sam[i][2])); + +#ifdef DEBUG +// { +// double lab[3]; +// icmXYZ2Lab(&wtn, lab, ref[i]); +// fprintf(stderr,"~1 ref Lab %f %f %f\n", lab[0], lab[1], lab[2]); +// icmXYZ2Lab(&wtn, lab, sam[i]); +// fprintf(stderr,"~1 sam Lab %f %f %f\n", lab[0], lab[1], lab[2]); +// } +#endif /* DEBUG */ + + de = icmXYZCIE2K(&wtn, ref[i], sam[i]); +//DBGF((DBGA,"%d: DE2K = %f\n",i+1,de)); +//DBGF((DBGA,"%d: Q = %f\n",i+1,100.0/(1.0 + pow(de/3.16, 2.4)))); + + if (i < 18) + tlci += pow(de, 4.0); + } + tlci = pow(tlci/18.0, 1.0/4.0); /* Power average */ +//DBGF((DBGA,"Power average = %f\n",tlci)); + + tlci = 100.0/(1.0 + pow(tlci/3.16, 2.4)); + + reftoRGB->del(reftoRGB); + satoRGB->del(satoRGB); + +//DBGF((DBGA,"returning TLCI = %f\n",tlci)); + sample->norm = sampnorm; /* Restore this */ + return tlci; +} + /* - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Compute Australian Radiation Protection and Nuclear Safety Agency (ARPANSA) */ /* Exposure to Ultraviolet Radiation exposure limits from a spectrum in mw/m-2/nm. */ diff --git a/xicc/xspect.h b/xicc/xspect.h index 75c98f3..3e0caeb 100644..100755 --- a/xicc/xspect.h +++ b/xicc/xspect.h @@ -116,6 +116,10 @@ void xspect2xspect(xspect *dst, xspect *targ, xspect *src); /* Plot up to 3 spectra */ void xspect_plot(xspect *sp1, xspect *sp2, xspect *sp3); + +/* Plot up to 10 spectra */ +void xspect_plot10(xspect *sp, int n); + #endif /* !SALONEINSTLIB*/ /* ------------------------------------------------------------------------------ */ @@ -141,9 +145,11 @@ typedef enum { icxIT_F8 = 12, /* Fluorescent, Broad Band 5000K, CRI 95 */ icxIT_F10 = 13, /* Fluorescent Narrow Band 5000K, CRI 81 */ icxIT_Spectrocam = 14, /* Spectrocam Xenon Lamp */ - icxIT_Dtemp = 15, /* Daylight at specified temperature */ + icxIT_ODtemp = 15, /* Daylight at specified temperature */ + icxIT_Dtemp = 16, /* 15:2004 Daylight at specified temperature */ #endif /* !SALONEINSTLIB*/ - icxIT_Ptemp = 16 /* Planckian at specified temperature */ + icxIT_OPtemp = 17, /* Planckian at specified temperature */ + icxIT_Ptemp = 18 /* 15:2004 Planckian at specified temperature */ } icxIllumeType; /* Fill in an xpsect with a standard illuminant spectrum */ @@ -170,7 +176,8 @@ typedef enum { icxOT_Stiles_Burch_2 = 5, /* Stiles & Burch 1955 2 degree */ icxOT_Judd_Voss_2 = 6, /* Judd & Voss 1978 2 degree */ icxOT_CIE_1964_10c = 7, /* Standard CIE 1964 10 degree, 2 degree compatible */ - icxOT_Shaw_Fairchild_2 = 8 /* Shaw & Fairchild 1997 2 degree */ + icxOT_Shaw_Fairchild_2 = 8, /* Shaw & Fairchild 1997 2 degree */ + icxOT_EBU_2012 = 9 /* EBU standard camera curves 2012 */ #endif /* !SALONEINSTLIB*/ } icxObserverType; @@ -197,9 +204,14 @@ struct _xsp2cie { int doLab; /* Return D50 Lab result */ icxClamping clamp; /* Clamp XYZ and Lab to be +ve */ + /* Integration range and steps - set to observer range and 1nm by default. */ + int spec_bw; /* Integration bandwidth (nm) */ + double spec_wl_short; /* Start wavelength (nm) */ + double spec_wl_long; /* End wavelength (nm) */ + #ifndef SALONEINSTLIB /* FWA compensation */ - double bw; /* Integration bandwidth */ + double fwa_bw; /* Integration bandwidth */ xspect iillum; /* Y = 1 Normalised instrument illuminant spectrum */ xspect imedia; /* Instrument measured media */ xspect emits; /* Estimated FWA emmission spectrum */ @@ -215,6 +227,13 @@ struct _xsp2cie { /* Public: */ void (*del)(struct _xsp2cie *p); + /* Override the integration wavelength range and step size */ + void (*set_int_steps)(struct _xsp2cie *p, /* this */ + double bw, /* Integration step size (nm) */ + double shortwl, /* Starting nm */ + double longwl /* Ending nm */ + ); + /* Convert (and possibly fwa correct) reflectance spectrum */ /* Note that the input spectrum normalisation value is used. */ /* Note that the returned XYZ is 0..1 range for reflectanc. */ @@ -310,27 +329,27 @@ xsp2cie *new_xsp2cie( #ifndef SALONEINSTLIB /* --------------------------- */ -/* Given a choice of temperature dependent illuminant (icxIT_Dtemp or icxIT_Ptemp), */ +/* Given a choice of temperature dependent illuminant (icxIT_[O]Dtemp or icxIT_[O]Ptemp), */ /* return the closest correlated color temperature to the XYZ. */ /* An observer type can be chosen for interpretting the spectrum of the input and */ /* the illuminant. */ /* Return -1.0 on erorr */ double icx_XYZ2ill_ct2( double txyz[3], /* If not NULL, return the XYZ of the locus temperature */ -icxIllumeType ilType, /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ +icxIllumeType ilType, /* Type of illuminant, icxIT_[O]Dtemp or icxIT_[O]Ptemp */ icxObserverType obType, /* Observer, CIE_1931_2 or CIE_1964_10 */ double xyz[3], /* Input XYZ value */ int viscct /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ ); -/* Given a choice of temperature dependent illuminant (icxIT_Dtemp or icxIT_Ptemp), */ +/* Given a choice of temperature dependent illuminant (icxIT_[O]Dtemp or icxIT_[O]Ptemp), */ /* a color temperature and a Y value, return the corresponding XYZ */ /* An observer type can be chosen for interpretting the spectrum of the input and */ /* the illuminant. */ /* Return xyz[0] = -1.0 on erorr */ void icx_ill_ct2XYZ( double xyz[3], /* Return the XYZ value */ -icxIllumeType ilType, /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ +icxIllumeType ilType, /* Type of illuminant, icxIT_[O]Dtemp or icx[O]IT_Ptemp */ icxObserverType obType, /* Observer, CIE_1931_2 or CIE_1964_10 */ int viscct, /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ double tin, /* Input temperature */ @@ -440,14 +459,14 @@ double temp, /* Input temperature in degrees K */ xspect *custIllum); /* Optional custom illuminant */ -/* Given a choice of temperature dependent illuminant (icxIT_Dtemp or icxIT_Ptemp), */ +/* Given a choice of temperature dependent illuminant (icxIT_[O]Dtemp or icxIT_[O]Ptemp), */ /* return the closest correlated color temperature to the given spectrum or XYZ. */ /* An observer type can be chosen for interpretting the spectrum of the input and */ /* the illuminant. */ /* Return -1 on erorr */ double icx_XYZ2ill_ct( double txyz[3], /* If not NULL, return the XYZ of the black body temperature */ -icxIllumeType ilType, /* Type of illuminant, icxIT_Dtemp or icxIT_Ptemp */ +icxIllumeType ilType, /* Type of illuminant, icxIT_[O]Dtemp or icxIT_[O]Ptemp */ icxObserverType obType, /* Observer */ xspect custObserver[3], /* Optional custom observer */ double xyz[3], /* Input XYZ value, NULL if spectrum intead */ @@ -460,9 +479,18 @@ int viscct); /* nz to use visual CIEDE2000, 0 to use CCT CIE 1960 UCS. */ /* is invalid because the sample is not white enough. */ double icx_CIE1995_CRI( int *invalid, /* if not NULL, set to nz if invalid */ +double cris[14], /* If not NULL, return the TCS01-14 CRI's */ xspect *sample /* Illuminant sample to compute CRI of */ ); +/* Compute the EBU TLCI-2012 Qa */ +/* Return < 0.0 on error */ +/* If invalid is not NULL, set it to nz if TLCI */ +/* is invalid because the sample is not white enough. */ +double icx_EBU2012_TLCI( +int *invalid, /* if not NULL, set to nz if invalid */ +xspect *sample /* Illuminant sample to compute TLCI of */ +); /* Return the maximum 24 hour exposure in seconds. */ /* Limit is 8 hours */ diff --git a/xicc/xutils.c b/xicc/xutils.c index 019cee6..019cee6 100644..100755 --- a/xicc/xutils.c +++ b/xicc/xutils.c diff --git a/xicc/xutils.h b/xicc/xutils.h index 27de570..27de570 100644..100755 --- a/xicc/xutils.h +++ b/xicc/xutils.h |