--- ray/src/util/rmatrix.c 2021/01/19 23:32:00 2.46 +++ ray/src/util/rmatrix.c 2022/03/03 03:55:13 2.49 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rmatrix.c,v 2.46 2021/01/19 23:32:00 greg Exp $"; +static const char RCSid[] = "$Id: rmatrix.c,v 2.49 2022/03/03 03:55:13 greg Exp $"; #endif /* * General matrix operations. @@ -209,7 +209,9 @@ rmx_load(const char *inspec, RMPref rmp) RMATRIX dinfo; RMATRIX *dnew; - if (!inspec || !*inspec) + if (!inspec) + inspec = stdin_name; + else if (!*inspec) return(NULL); if (inspec == stdin_name) { /* reading from stdin? */ fp = stdin; @@ -396,6 +398,23 @@ rmx_write_rgbe(const RMATRIX *rm, FILE *fp) return(1); } +/* Check if CIE XYZ primaries were specified */ +static int +findCIEprims(const char *info) +{ + RGBPRIMS prims; + + if (!info) + return(0); + info = strstr(info, PRIMARYSTR); + if (!info || !primsval(prims, info)) + return(0); + + return((prims[RED][CIEX] > .99) & (prims[RED][CIEY] < .01) && + (prims[GRN][CIEX] < .01) & (prims[GRN][CIEY] > .99) && + (prims[BLU][CIEX] < .01) & (prims[BLU][CIEY] < .01)); +} + /* Write matrix to file type indicated by dtype */ int rmx_write(const RMATRIX *rm, int dtype, FILE *fp) @@ -413,7 +432,8 @@ rmx_write(const RMATRIX *rm, int dtype, FILE *fp) fputs(rm->info, fp); if (dtype == DTfromHeader) dtype = rm->dtype; - else if ((dtype == DTrgbe) & (rm->dtype == DTxyze)) + else if (dtype == DTrgbe && (rm->dtype == DTxyze || + findCIEprims(rm->info))) dtype = DTxyze; else if ((dtype == DTxyze) & (rm->dtype == DTrgbe)) dtype = DTrgbe; @@ -433,7 +453,7 @@ rmx_write(const RMATRIX *rm, int dtype, FILE *fp) } if ((dtype == DTfloat) | (dtype == DTdouble)) fputendian(fp); /* important to record */ - fputformat((char *)cm_fmt_id[dtype], fp); + fputformat(cm_fmt_id[dtype], fp); fputc('\n', fp); switch (dtype) { /* write data */ case DTascii: