summaryrefslogtreecommitdiff
path: root/spectro/dispread.c
diff options
context:
space:
mode:
Diffstat (limited to 'spectro/dispread.c')
-rw-r--r--spectro/dispread.c114
1 files changed, 90 insertions, 24 deletions
diff --git a/spectro/dispread.c b/spectro/dispread.c
index 4a8d364..990501f 100644
--- a/spectro/dispread.c
+++ b/spectro/dispread.c
@@ -84,7 +84,7 @@ static int gcc_bug_fix(int i) {
Flags used:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- upper .. . .... .. .. ...
+ upper .... .... .. .. ...
lower .. . . . . .. .
*/
@@ -129,6 +129,9 @@ void usage(char *diag, ...) {
}
free_disppaths(dp);
fprintf(stderr," -dweb[:port] Display via a web server at port (default 8080)\n");
+#ifdef NT
+ fprintf(stderr," -dmadvr Display via MadVR Video Renderer\n");
+#endif
// fprintf(stderr," -d fake Use a fake display device for testing, fake%s if present\n",ICC_FILE_EXT);
fprintf(stderr," -c listno Set communication port from the following list (default %d)\n",COMPORT);
if ((icmps = new_icompaths(g_log)) != NULL) {
@@ -150,6 +153,9 @@ void usage(char *diag, ...) {
cap2 = inst_show_disptype_options(stderr, " -y ", icmps, 0);
fprintf(stderr," -k file.cal Load calibration file into display while reading\n");
fprintf(stderr," -K file.cal Apply calibration file to test values while reading\n");
+#ifdef NT
+ fprintf(stderr," -V Enable MadVR color management (3dLut)\n");
+#endif
fprintf(stderr," -s Save spectral information (default don't save)\n");
fprintf(stderr," -P ho,vo,ss[,vs] Position test window and scale it\n");
fprintf(stderr," ho,vi: 0.0 = left/top, 0.5 = center, 1.0 = right/bottom etc.\n");
@@ -158,6 +164,7 @@ void usage(char *diag, ...) {
#if defined(UNIX_X11)
fprintf(stderr," -n Don't set override redirect on test window\n");
#endif
+ fprintf(stderr," -E Encode the test values for video range 16..235/255\n");
fprintf(stderr," -J Run instrument calibration first (used rarely)\n");
fprintf(stderr," -N Disable initial calibration of instrument if possible\n");
fprintf(stderr," -H Use high resolution spectrum mode (if available)\n");
@@ -171,7 +178,9 @@ void usage(char *diag, ...) {
fprintf(stderr," 1931_2 (def), 1964_10, S&B 1955_2, shaw, J&V 1978_2, 1964_10c\n");
}
fprintf(stderr," -I b|w Drift compensation, Black: -Ib, White: -Iw, Both: -Ibw\n");
+ fprintf(stderr," -Y R:rate Override measured refresh rate with rate Hz\n");
fprintf(stderr," -Y A Use non-adaptive integration time mode (if available).\n");
+ fprintf(stderr," -Y p Don't wait for the instrument to be placed on the display\n");
fprintf(stderr," -C \"command\" Invoke shell \"command\" each time a color is set\n");
fprintf(stderr," -M \"command\" Invoke shell \"command\" each time a color is measured\n");
fprintf(stderr," -W n|h|x Override serial port flow control: n = none, h = HW, x = Xon/Xoff\n");
@@ -188,6 +197,7 @@ int main(int argc, char *argv[]) {
disppath *disp = NULL; /* Display being used */
double hpatscale = 1.0, vpatscale = 1.0; /* scale factor for test patch size */
double ho = 0.0, vo = 0.0; /* Test window offsets, -1.0 to 1.0 */
+ int out_tvenc = 0; /* 1 to use RGB Video Level encoding */
int blackbg = 0; /* NZ if whole screen should be filled with black */
int verb = 0;
int debug = 0;
@@ -199,12 +209,14 @@ int main(int argc, char *argv[]) {
flow_control fc = fc_nc; /* Default flow control */
int docalib = 0; /* Do a calibration */
int highres = 0; /* Use high res mode if available */
+ double refrate = 0.0; /* 0.0 = default, > 0.0 = override refresh rate */
int nadaptive = 0; /* Use non-adaptive mode if available */
int bdrift = 0; /* Flag, nz for black drift compensation */
int wdrift = 0; /* Flag, nz for white drift compensation */
int dtype = 0; /* Display type selection charater */
int tele = 0; /* NZ if telephoto mode */
int noautocal = 0; /* Disable auto calibration */
+ int noplace = 0; /* Disable user instrument placement */
int nonorm = 0; /* Disable normalisation */
char ccxxname[MAXNAMEL+1] = "\000"; /* Colorimeter Correction Matrix name */
ccmx *cmx = NULL; /* Colorimeter Correction Matrix */
@@ -212,12 +224,18 @@ int main(int argc, char *argv[]) {
int spec = 0; /* Don't save spectral information */
icxObserverType obType = icxOT_default;
int webdisp = 0; /* NZ for web display, == port number */
+#ifdef NT
+ int madvrdisp = 0; /* NZ for MadVR display */
+#endif
char *ccallout = NULL; /* Change color Shell callout */
char *mcallout = NULL; /* Measure color Shell callout */
char inname[MAXNAMEL+1] = "\000"; /* Input cgats file base name */
char outname[MAXNAMEL+1] = "\000"; /* Output cgats file base name */
char calname[MAXNAMEL+1] = "\000"; /* Calibration file name (if any) */
- int softcal = 0; /* nz if cal applied to values rather than hardware */
+ int native = 2; /* X0 = use current per channel calibration curve */
+ /* X1 = set native linear output and use ramdac high prec */
+ /* 0X = use current color management cLut (MadVR) */
+ /* 1X = disable color management cLUT (MadVR) */
double cal[3][MAX_CAL_ENT]; /* Display calibration */
int ncal = 256; /* number of cal entries used */
cgats *icg; /* input cgats structure */
@@ -237,6 +255,7 @@ int main(int argc, char *argv[]) {
cgats_set_elem *setel; /* Array of set value elements */
disprd *dr; /* Display patch read object */
int noramdac = 0; /* Will be set to nz if can't set ramdac */
+ int nocm = 0; /* Will be set to nz if can't set color management */
int errc; /* Return value from new_disprd() */
int rv;
@@ -295,6 +314,12 @@ int main(int argc, char *argv[]) {
usage("Web port number must be in range 1..65535");
}
fa = nfa;
+#ifdef NT
+ } else if (strncmp(na,"madvr",5) == 0
+ || strncmp(na,"MADVR",5) == 0) {
+ madvrdisp = 1;
+ fa = nfa;
+#endif
} else {
#if defined(UNIX_X11)
int ix, iv;
@@ -358,17 +383,24 @@ int main(int argc, char *argv[]) {
dtype = na[0];
/* Calibration file */
- } else if (argv[fa][1] == 'k' || argv[fa][1] == 'K') {
- fa = nfa;
- if (na == NULL) usage("Parameter expected after -k/-K");
+ } else if (argv[fa][1] == 'k'
+ || argv[fa][1] == 'K') {
+ if (na == NULL) usage("Parameter expected after -%c",argv[fa][1]);
strncpy(calname,na,MAXNAMEL); calname[MAXNAMEL] = '\000';
- softcal = 0;
if (argv[fa][1] == 'K')
- softcal = 1;
- }
+ native |= 1; /* Use native linear & soft cal */
+ else
+ native &= ~1; /* Use HW cal */
+ fa = nfa;
+
+#ifdef NT
+ /* MadVR verify mode */
+ } else if (argv[fa][1] == 'V') {
+ native &= ~2;
+#endif
/* Save spectral data */
- else if (argv[fa][1] == 's') {
+ } else if (argv[fa][1] == 's') {
spec = 1;
/* Test patch offset and size */
@@ -394,6 +426,10 @@ int main(int argc, char *argv[]) {
} else if (argv[fa][1] == 'F') {
blackbg = 1;
+ /* Video encoded output */
+ } else if (argv[fa][1] == 'E') {
+ out_tvenc = 1;
+
/* Force calibration */
} else if (argv[fa][1] == 'J') {
docalib = 1;
@@ -406,10 +442,6 @@ int main(int argc, char *argv[]) {
} else if (argv[fa][1] == 'H') {
highres = 1;
- /* Adaptive mode - default, so flag is deprecated */
- } else if (argv[fa][1] == 'V') {
- warning("dispread -V flag is deprecated");
-
/* No normalisation */
} else if (argv[fa][1] == 'w') {
nonorm = 1;
@@ -495,11 +527,20 @@ int main(int argc, char *argv[]) {
if (na == NULL)
usage("Flag '-Y' expects extra flag");
- if (na[0] == 'A') {
+ if (na[0] == 'R') {
+ if (na[1] != ':')
+ usage("-Y R:rate syntax incorrect");
+ refrate = atof(na+2);
+ if (refrate < 5.0 || refrate > 150.0)
+ usage("-Y R:rate %f Hz not in valid range",refrate);
+ } else if (na[0] == 'p') {
+ noplace = 1;
+ } else if (na[0] == 'A') {
nadaptive = 1;
} else {
usage("Flag '-Y %c' not recognised",na[0]);
}
+ fa = nfa;
} else
usage("Flag '-%c' not recognised",argv[fa][1]);
@@ -560,15 +601,19 @@ int main(int argc, char *argv[]) {
}
if (fake)
- comport = -99;
+ comport = FAKE_DEVICE_PORT;
if ((icmps = new_icompaths(g_log)) == NULL)
error("Finding instrument paths failed");
if ((ipath = icmps->get_path(icmps, comport)) == NULL)
error("No instrument at port %d",comport);
if (docalib) {
- if ((rv = disprd_calibration(ipath, fc, dtype, 0, tele, nadaptive, noautocal, disp,
- webdisp, blackbg, override,
+ if ((rv = disprd_calibration(ipath, fc, dtype, 0, tele, nadaptive, noautocal,
+ disp, webdisp,
+#ifdef NT
+ madvrdisp,
+#endif
+ out_tvenc, blackbg, override,
100.0 * hpatscale, 100.0 * vpatscale, ho, vo,
g_log)) != 0) {
error("docalibration failed with return value %d\n",rv);
@@ -619,6 +664,9 @@ int main(int argc, char *argv[]) {
if ((ti = icg->find_kword(icg, 0, "FULL_SPREAD_PATCHES")) >= 0)
ocg->add_kword(ocg, 0, "FULL_SPREAD_PATCHES",icg->t[0].kdata[ti], NULL);
+ if ((ti = icg->find_kword(icg, 0, "DARK_REGION_EMPHASIS")) >= 0)
+ ocg->add_kword(ocg, 0, "DARK_REGION_EMPHASIS",icg->t[0].kdata[ti], NULL);
+
if (verb) {
printf("Number of patches = %d\n",npat);
}
@@ -717,11 +765,19 @@ int main(int argc, char *argv[]) {
if ((fi = ccg->find_kword(ccg, 0, "VIDEO_LUT_CALIBRATION_POSSIBLE")) >= 0) {
if (stricmp(ccg->t[0].kdata[fi],"NO") == 0) {
- softcal = 1;
+ native = 1;
if (verb) printf("Switching to soft cal because there is no access to VideoLUTs\n");
}
}
+ if ((fi = ccg->find_kword(ccg, 0, "TV_OUTPUT_ENCODING")) >= 0) {
+ if (!out_tvenc && (strcmp(ccg->t[0].kdata[fi], "YES") == 0
+ || strcmp(ccg->t[0].kdata[fi], "yes")) == 0) {
+ if (verb) printf("Using Video range (16-235)/255 range encoding because cal. used it\n");
+ out_tvenc = 1;
+ }
+ }
+
if ((fi = ccg->find_kword(ccg, 0, "COLOR_REP")) < 0)
error ("Calibration file '%s' doesn't contain keyword COLOR_REP",calname);
if (strcmp(ccg->t[0].kdata[fi],"RGB") != 0)
@@ -753,9 +809,14 @@ int main(int argc, char *argv[]) {
cal[0][0] = -1.0; /* Not used */
}
- if ((dr = new_disprd(&errc, ipath, fc, dtype, 0, tele, nadaptive, noautocal,
- highres, 0, &noramdac, cal, ncal, softcal, disp, blackbg, override,
- webdisp, ccallout, mcallout, 100.0 * hpatscale, 100.0 * vpatscale, ho, vo,
+ if ((dr = new_disprd(&errc, ipath, fc, dtype, 0, tele, nadaptive, noautocal, noplace,
+ highres, refrate, native, &noramdac, &nocm, cal, ncal, disp,
+ out_tvenc, blackbg, override, webdisp,
+#ifdef NT
+ madvrdisp,
+#endif
+ ccallout, mcallout,
+ 100.0 * hpatscale, 100.0 * vpatscale, ho, vo,
cmx != NULL ? cmx->matrix : NULL,
ccs != NULL ? ccs->samples : NULL, ccs != NULL ? ccs->no_samp : 0,
spec, obType, NULL, bdrift, wdrift,
@@ -768,7 +829,7 @@ int main(int argc, char *argv[]) {
ccs->del(ccs);
/* Test the CRT with all of the test points */
- if ((rv = dr->read(dr, cols, npat + xpat, 1, npat + xpat, 1, 0, instClamp)) != 0) {
+ if ((rv = dr->read(dr, cols, npat + xpat, 1, npat + xpat, 1, 0, instNoClamp)) != 0) {
dr->del(dr);
error("test_crt returned error code %d\n",rv);
}
@@ -824,7 +885,7 @@ int main(int argc, char *argv[]) {
nn = 1.0;
else {
if (cols[wpat].XYZ_v == 0)
- error("XYZ of white patch is not valid!",i);
+ error("XYZ of white patch is not valid!\nCan't normalise value to white",i);
nn = 100.0 / cols[wpat].XYZ[1]; /* Normalise Y of white to 100 */
}
@@ -832,7 +893,7 @@ int main(int argc, char *argv[]) {
for (i = 0; i < npat; i++) {
if (cols[i].XYZ_v == 0)
- error("XYZ %d is not valid!",i);
+ warning("XYZ patch %d is not valid!",i+1);
for (j = 0; j < 3; j++)
cols[i].XYZ[j] = nn * cols[i].XYZ[j];
@@ -881,6 +942,11 @@ int main(int argc, char *argv[]) {
for (i = 0; i < npat; i++) {
int k = 0;
+ if (cols[i].XYZ_v == 0) {
+ warning("Omitting patch %d from .ti3 file!",i+1);
+ continue;
+ }
+
setel[k++].c = cols[i].id;
setel[k++].d = 100.0 * cols[i].r;
setel[k++].d = 100.0 * cols[i].g;