diff --git a/libsrc/format/Makefile.am b/libsrc/format/Makefile.am index 91b25126..dc01f7f2 100644 --- a/libsrc/format/Makefile.am +++ b/libsrc/format/Makefile.am @@ -1,13 +1,9 @@ noinst_LTLIBRARIES = libformat.la libformat_la_SOURCES = \ - color.h \ - color.c \ - copyright.h \ dbh.h \ format.c \ format_dispatch.c \ - header.c \ im_analyze2vips.c \ im_csv2vips.c \ im_exr2vips.c \ @@ -25,9 +21,6 @@ libformat_la_SOURCES = \ im_vips2png.c \ im_vips2ppm.c \ im_vips2tiff.c \ - im_vips2raw.c \ - resolu.c \ - resolu.h \ - rtio.h + im_vips2raw.c INCLUDES = -I${top_srcdir}/include @VIPS_CFLAGS@ @VIPS_INCLUDES@ diff --git a/libsrc/format/color.c b/libsrc/format/color.c deleted file mode 100644 index c459addf..00000000 --- a/libsrc/format/color.c +++ /dev/null @@ -1,315 +0,0 @@ -#ifndef lint -static const char RCSid[] = "$Id: color.c,v 2.16 2005/02/09 00:00:17 greg Exp $"; -#endif -/* - * color.c - routines for color calculations. - * - * Externals declared in color.h - */ - -#include "copyright.h" - -#include - -#include - -#include - -#include "color.h" - -#ifdef getc_unlocked /* avoid horrendous overhead of flockfile */ -#undef getc -#undef putc -#define getc getc_unlocked -#define putc putc_unlocked -#endif - -#define MINELEN 8 /* minimum scanline length for encoding */ -#define MAXELEN 0x7fff /* maximum scanline length for encoding */ -#define MINRUN 4 /* minimum run length */ - - -char * -tempbuffer(len) /* get a temporary buffer */ -unsigned int len; -{ - static char *tempbuf = NULL; - static unsigned tempbuflen = 0; - - if (len > tempbuflen) { - if (tempbuflen > 0) - tempbuf = (char *)realloc((void *)tempbuf, len); - else - tempbuf = (char *)malloc(len); - tempbuflen = tempbuf==NULL ? 0 : len; - } - return(tempbuf); -} - - -int -fwritecolrs(scanline, len, fp) /* write out a colr scanline */ -register COLR *scanline; -int len; -register FILE *fp; -{ - register int i, j, beg, cnt = 1; - int c2; - - if ((len < MINELEN) | (len > MAXELEN)) /* OOBs, write out flat */ - return(fwrite((char *)scanline,sizeof(COLR),len,fp) - len); - /* put magic header */ - putc(2, fp); - putc(2, fp); - putc(len>>8, fp); - putc(len&255, fp); - /* put components seperately */ - for (i = 0; i < 4; i++) { - for (j = 0; j < len; j += cnt) { /* find next run */ - for (beg = j; beg < len; beg += cnt) { - for (cnt = 1; cnt < 127 && beg+cnt < len && - scanline[beg+cnt][i] == scanline[beg][i]; cnt++) - ; - if (cnt >= MINRUN) - break; /* long enough */ - } - if (beg-j > 1 && beg-j < MINRUN) { - c2 = j+1; - while (scanline[c2++][i] == scanline[j][i]) - if (c2 == beg) { /* short run */ - putc(128+beg-j, fp); - putc(scanline[j][i], fp); - j = beg; - break; - } - } - while (j < beg) { /* write out non-run */ - if ((c2 = beg-j) > 128) c2 = 128; - putc(c2, fp); - while (c2--) - putc(scanline[j++][i], fp); - } - if (cnt >= MINRUN) { /* write out run */ - putc(128+cnt, fp); - putc(scanline[beg][i], fp); - } else - cnt = 0; - } - } - return(ferror(fp) ? -1 : 0); -} - - -static int -oldreadcolrs(scanline, len, fp) /* read in an old colr scanline */ -register COLR *scanline; -int len; -register FILE *fp; -{ - int rshift; - register int i; - - rshift = 0; - - while (len > 0) { - scanline[0][RED] = getc(fp); - scanline[0][GRN] = getc(fp); - scanline[0][BLU] = getc(fp); - scanline[0][EXP] = getc(fp); - if (feof(fp) || ferror(fp)) - return(-1); - if (scanline[0][RED] == 1 && - scanline[0][GRN] == 1 && - scanline[0][BLU] == 1) { - for (i = scanline[0][EXP] << rshift; i > 0; i--) { - copycolr(scanline[0], scanline[-1]); - scanline++; - len--; - } - rshift += 8; - } else { - scanline++; - len--; - rshift = 0; - } - } - return(0); -} - - -int -freadcolrs(scanline, len, fp) /* read in an encoded colr scanline */ -register COLR *scanline; -int len; -register FILE *fp; -{ - register int i, j; - int code, val; - /* determine scanline type */ - if ((len < MINELEN) | (len > MAXELEN)) - return(oldreadcolrs(scanline, len, fp)); - if ((i = getc(fp)) == EOF) - return(-1); - if (i != 2) { - ungetc(i, fp); - return(oldreadcolrs(scanline, len, fp)); - } - scanline[0][GRN] = getc(fp); - scanline[0][BLU] = getc(fp); - if ((i = getc(fp)) == EOF) - return(-1); - if (scanline[0][GRN] != 2 || scanline[0][BLU] & 128) { - scanline[0][RED] = 2; - scanline[0][EXP] = i; - return(oldreadcolrs(scanline+1, len-1, fp)); - } - if ((scanline[0][BLU]<<8 | i) != len) - return(-1); /* length mismatch! */ - /* read each component */ - for (i = 0; i < 4; i++) - for (j = 0; j < len; ) { - if ((code = getc(fp)) == EOF) - return(-1); - if (code > 128) { /* run */ - code &= 127; - if ((val = getc(fp)) == EOF) - return -1; - if (j + code > len) - return -1; /* overrun */ - while (code--) - scanline[j++][i] = val; - } else { /* non-run */ - if (j + code > len) - return -1; /* overrun */ - while (code--) { - if ((val = getc(fp)) == EOF) - return -1; - scanline[j++][i] = val; - } - } - } - return(0); -} - - -int -fwritescan(scanline, len, fp) /* write out a scanline */ -register COLOR *scanline; -int len; -FILE *fp; -{ - COLR *clrscan; - int n; - register COLR *sp; - /* get scanline buffer */ - if ((sp = (COLR *)tempbuffer(len*sizeof(COLR))) == NULL) - return(-1); - clrscan = sp; - /* convert scanline */ - n = len; - while (n-- > 0) { - setcolr(sp[0], scanline[0][RED], - scanline[0][GRN], - scanline[0][BLU]); - scanline++; - sp++; - } - return(fwritecolrs(clrscan, len, fp)); -} - - -int -freadscan(scanline, len, fp) /* read in a scanline */ -register COLOR *scanline; -int len; -FILE *fp; -{ - register COLR *clrscan; - - if ((clrscan = (COLR *)tempbuffer(len*sizeof(COLR))) == NULL) - return(-1); - if (freadcolrs(clrscan, len, fp) < 0) - return(-1); - /* convert scanline */ - colr_color(scanline[0], clrscan[0]); - while (--len > 0) { - scanline++; clrscan++; - if (clrscan[0][RED] == clrscan[-1][RED] && - clrscan[0][GRN] == clrscan[-1][GRN] && - clrscan[0][BLU] == clrscan[-1][BLU] && - clrscan[0][EXP] == clrscan[-1][EXP]) - copycolor(scanline[0], scanline[-1]); - else - colr_color(scanline[0], clrscan[0]); - } - return(0); -} - - -void -setcolr(clr, r, g, b) /* assign a short color value */ -register COLR clr; -double r, g, b; -{ - double d; - int e; - - d = r > g ? r : g; - if (b > d) d = b; - - if (d <= 1e-32) { - clr[RED] = clr[GRN] = clr[BLU] = 0; - clr[EXP] = 0; - return; - } - - d = frexp(d, &e) * 255.9999 / d; - - if (r > 0.0) - clr[RED] = r * d; - else - clr[RED] = 0; - if (g > 0.0) - clr[GRN] = g * d; - else - clr[GRN] = 0; - if (b > 0.0) - clr[BLU] = b * d; - else - clr[BLU] = 0; - - clr[EXP] = e + COLXS; -} - - -void -colr_color(col, clr) /* convert short to float color */ -register COLOR col; -register COLR clr; -{ - double f; - - if (clr[EXP] == 0) - col[RED] = col[GRN] = col[BLU] = 0.0; - else { - f = ldexp(1.0, (int)clr[EXP]-(COLXS+8)); - col[RED] = (clr[RED] + 0.5)*f; - col[GRN] = (clr[GRN] + 0.5)*f; - col[BLU] = (clr[BLU] + 0.5)*f; - } -} - - -int -bigdiff(c1, c2, md) /* c1 delta c2 > md? */ -register COLOR c1, c2; -double md; -{ - register int i; - - for (i = 0; i < 3; i++) - if (colval(c1,i)-colval(c2,i) > md*colval(c2,i) || - colval(c2,i)-colval(c1,i) > md*colval(c1,i)) - return(1); - return(0); -} diff --git a/libsrc/format/color.h b/libsrc/format/color.h index 1137f426..fb4315b4 100644 --- a/libsrc/format/color.h +++ b/libsrc/format/color.h @@ -200,43 +200,6 @@ extern COLOR cblack, cwhite; /* black (0,0,0) and white (1,1,1) */ #define cpcolormat(md,ms) memcpy((void *)md,(void *)ms,sizeof(COLORMAT)) - /* defined in color.c */ -extern char *tempbuffer(unsigned int len); -extern int fwritecolrs(COLR *scanline, int len, FILE *fp); -extern int freadcolrs(COLR *scanline, int len, FILE *fp); -extern int fwritescan(COLOR *scanline, int len, FILE *fp); -extern int freadscan(COLOR *scanline, int len, FILE *fp); -extern void setcolr(COLR clr, double r, double g, double b); -extern void colr_color(COLOR col, COLR clr); -extern int bigdiff(COLOR c1, COLOR c2, double md); - /* defined in spec_rgb.c */ -extern void spec_rgb(COLOR col, int s, int e); -extern void spec_cie(COLOR col, int s, int e); -extern void cie_rgb(COLOR rgb, COLOR xyz); -extern int clipgamut(COLOR col, double brt, int gamut, - COLOR lower, COLOR upper); -extern void colortrans(COLOR c2, COLORMAT mat, COLOR c1); -extern void multcolormat(COLORMAT m3, COLORMAT m2, - COLORMAT m1); -extern int colorprimsOK(RGBPRIMS pr); -extern int compxyz2rgbmat(COLORMAT mat, RGBPRIMS pr); -extern int comprgb2xyzmat(COLORMAT mat, RGBPRIMS pr); -extern int comprgb2rgbmat(COLORMAT mat, RGBPRIMS pr1, RGBPRIMS pr2); -extern int compxyzWBmat(COLORMAT mat, float wht1[2], - float wht2[2]); -extern int compxyz2rgbWBmat(COLORMAT mat, RGBPRIMS pr); -extern int comprgb2xyzWBmat(COLORMAT mat, RGBPRIMS pr); -extern int comprgb2rgbWBmat(COLORMAT mat, RGBPRIMS pr1, RGBPRIMS pr2); - /* defined in colrops.c */ -extern int setcolrcor(double (*f)(double, double), double a2); -extern int setcolrinv(double (*f)(double, double), double a2); -extern int setcolrgam(double g); -extern int colrs_gambs(COLR *scan, int len); -extern int gambs_colrs(COLR *scan, int len); -extern void shiftcolrs(COLR *scan, int len, int adjust); -extern void normcolrs(COLR *scan, int len, int adjust); - - #ifdef __cplusplus } #endif diff --git a/libsrc/format/copyright.h b/libsrc/format/copyright.h deleted file mode 100644 index a59f1365..00000000 --- a/libsrc/format/copyright.h +++ /dev/null @@ -1,58 +0,0 @@ -/* RCSid: $Id: copyright.h,v 3.2 2008/12/06 01:08:53 greg Exp $ */ -/* ==================================================================== - * The Radiance Software License, Version 1.0 - * - * Copyright (c) 1990 - 2009 The Regents of the University of California, - * through Lawrence Berkeley National Laboratory. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes Radiance software - * (http://radsite.lbl.gov/) - * developed by the Lawrence Berkeley National Laboratory - * (http://www.lbl.gov/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" - * and "The Regents of the University of California" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact radiance@radsite.lbl.gov. - * - * 5. Products derived from this software may not be called "Radiance", - * nor may "Radiance" appear in their name, without prior written - * permission of Lawrence Berkeley National Laboratory. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of Lawrence Berkeley National Laboratory. For more - * information on Lawrence Berkeley National Laboratory, please see - * . - */ - diff --git a/libsrc/format/header.c b/libsrc/format/header.c deleted file mode 100644 index 08b5528d..00000000 --- a/libsrc/format/header.c +++ /dev/null @@ -1,340 +0,0 @@ -#ifndef lint -static const char RCSid[] = "$Id: header.c,v 2.23 2005/02/01 01:28:16 greg Exp $"; -#endif -/* - * header.c - routines for reading and writing information headers. - * - * Externals declared in resolu.h - * - * newheader(t,fp) start new information header identified by string t - * isheadid(s) returns true if s is a header id line - * headidval(r,s) copy header identifier value in s to r - * dateval(t,s) get capture date value - * isdate(s) returns true if s is a date line - * fputdate(t,fp) put out the given capture date and time - * fputnow(fp) put out the current date and time - * printargs(ac,av,fp) print an argument list to fp, followed by '\n' - * isformat(s) returns true if s is of the form "FORMAT=*" - * formatval(r,s) copy the format value in s to r - * fputformat(s,fp) write "FORMAT=%s" to fp - * getheader(fp,f,p) read header from fp, calling f(s,p) on each line - * globmatch(pat, str) check for glob match of str against pat - * checkheader(i,p,o) check header format from i against p and copy to o - * - * To copy header from input to output, use getheader(fin, fputs, fout) - */ - -#include "copyright.h" - -#include - -#include "rtio.h" -#include "resolu.h" - -#define MAXLINE 512 - -char HDRSTR[] = "#?"; /* information header magic number */ - -char FMTSTR[] = "FORMAT="; /* format identifier */ - -char TMSTR[] = "CAPDATE="; /* capture date identifier */ - -static gethfunc mycheck; - - -extern void -newheader( /* identifying line of information header */ - char *s, - register FILE *fp -) -{ - fputs(HDRSTR, fp); - fputs(s, fp); - putc('\n', fp); -} - - -extern int -headidval( /* get header id (return true if is id) */ - register char *r, - register char *s -) -{ - register char *cp = HDRSTR; - - while (*cp) if (*cp++ != *s++) return(0); - if (r == NULL) return(1); - while (*s && !isspace(*s)) *r++ = *s++; - *r = '\0'; - return(1); -} - - -extern int -isheadid( /* check to see if line is header id */ - char *s -) -{ - return(headidval(NULL, s)); -} - - -extern int -dateval( /* get capture date value */ - time_t *tloc, - char *s -) -{ - struct tm tms; - register char *cp = TMSTR; - - while (*cp) if (*cp++ != *s++) return(0); - while (isspace(*s)) s++; - if (!*s) return(0); - if (sscanf(s, "%d:%d:%d %d:%d:%d", - &tms.tm_year, &tms.tm_mon, &tms.tm_mday, - &tms.tm_hour, &tms.tm_min, &tms.tm_sec) != 6) - return(0); - if (tloc == NULL) - return(1); - tms.tm_mon--; - tms.tm_year -= 1900; - tms.tm_isdst = -1; /* ask mktime() to figure out DST */ - *tloc = mktime(&tms); - return(1); -} - - -extern int -isdate( /* is the given line a capture date? */ - char *s -) -{ - return(dateval(NULL, s)); -} - - -extern void -fputdate( /* write out the given time value */ - time_t tv, - FILE *fp -) -{ - struct tm *tm = localtime(&tv); - if (tm == NULL) - return; - fprintf(fp, "%s %04d:%02d:%02d %02d:%02d:%02d\n", TMSTR, - tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); -} - - -extern void -fputnow( /* write out the current time */ - FILE *fp -) -{ - time_t tv; - time(&tv); - fputdate(tv, fp); -} - - -extern void -printargs( /* print arguments to a file */ - int ac, - char **av, - FILE *fp -) -{ - while (ac-- > 0) { - fputword(*av++, fp); - fputc(ac ? ' ' : '\n', fp); - } -} - - -extern int -formatval( /* get format value (return true if format) */ - register char *r, - register char *s -) -{ - register char *cp = FMTSTR; - - while (*cp) if (*cp++ != *s++) return(0); - while (isspace(*s)) s++; - if (!*s) return(0); - if (r == NULL) return(1); - do - *r++ = *s++; - while(*s && !isspace(*s)); - *r = '\0'; - return(1); -} - - -extern int -isformat( /* is line a format line? */ - char *s -) -{ - return(formatval(NULL, s)); -} - - -extern void -fputformat( /* put out a format value */ - char *s, - FILE *fp -) -{ - fputs(FMTSTR, fp); - fputs(s, fp); - putc('\n', fp); -} - - -extern int -getheader( /* get header from file */ - FILE *fp, - gethfunc *f, - void *p -) -{ - char buf[MAXLINE]; - - for ( ; ; ) { - buf[MAXLINE-2] = '\n'; - if (fgets(buf, MAXLINE, fp) == NULL) - return(-1); - if (buf[0] == '\n') - return(0); -#ifdef MSDOS - if (buf[0] == '\r' && buf[1] == '\n') - return(0); -#endif - if (buf[MAXLINE-2] != '\n') { - ungetc(buf[MAXLINE-2], fp); /* prevent false end */ - buf[MAXLINE-2] = '\0'; - } - if (f != NULL && (*f)(buf, p) < 0) - return(-1); - } -} - - -struct check { - FILE *fp; - char fs[64]; -}; - - -static int -mycheck( /* check a header line for format info. */ - char *s, - void *cp -) -{ - if (!formatval(((struct check*)cp)->fs, s) - && ((struct check*)cp)->fp != NULL) { - fputs(s, ((struct check*)cp)->fp); - } - return(0); -} - - -extern int -globmatch( /* check for match of s against pattern p */ - register char *p, - register char *s -) -{ - int setmatch; - - do { - switch (*p) { - case '?': /* match any character */ - if (!*s++) - return(0); - break; - case '*': /* match any string */ - while (p[1] == '*') p++; - do - if ( (p[1]=='?' || p[1]==*s) && - globmatch(p+1,s) ) - return(1); - while (*s++); - return(0); - case '[': /* character set */ - setmatch = *s == *++p; - if (!*p) - return(0); - while (*++p != ']') { - if (!*p) - return(0); - if (*p == '-') { - setmatch += p[-1] <= *s && *s <= p[1]; - if (!*++p) - break; - } else - setmatch += *p == *s; - } - if (!setmatch) - return(0); - s++; - break; - case '\\': /* literal next */ - p++; - /* fall through */ - default: /* normal character */ - if (*p != *s) - return(0); - s++; - break; - } - } while (*p++); - return(1); -} - - -/* - * Checkheader(fin,fmt,fout) returns a value of 1 if the input format - * matches the specification in fmt, 0 if no input format was found, - * and -1 if the input format does not match or there is an - * error reading the header. If fmt is empty, then -1 is returned - * if any input format is found (or there is an error), and 0 otherwise. - * If fmt contains any '*' or '?' characters, then checkheader - * does wildcard expansion and copies a matching result into fmt. - * Be sure that fmt is big enough to hold the match in such cases, - * and that it is not a static, read-only string! - * The input header (minus any format lines) is copied to fout - * if fout is not NULL. - */ - -extern int -checkheader( - FILE *fin, - char *fmt, - FILE *fout -) -{ - struct check cdat; - register char *cp; - - cdat.fp = fout; - cdat.fs[0] = '\0'; - if (getheader(fin, mycheck, &cdat) < 0) - return(-1); - if (!cdat.fs[0]) - return(0); - for (cp = fmt; *cp; cp++) /* check for globbing */ - if ((*cp == '?') | (*cp == '*')) { - if (globmatch(fmt, cdat.fs)) { - strcpy(fmt, cdat.fs); - return(1); - } else - return(-1); - } - return(strcmp(fmt, cdat.fs) ? -1 : 1); /* literal match */ -} diff --git a/libsrc/format/im_rad2vips.c b/libsrc/format/im_rad2vips.c index b80425d3..1f713f33 100644 --- a/libsrc/format/im_rad2vips.c +++ b/libsrc/format/im_rad2vips.c @@ -46,18 +46,626 @@ #include #include #include +#include +#include +#include #include #include -#include "rtio.h" -#include "resolu.h" -#include "color.h" - #ifdef WITH_DMALLOC #include #endif /*WITH_DMALLOC*/ +/* Begin copy-paste from Radiance sources. + */ + + /* flags for scanline ordering */ +#define XDECR 1 +#define YDECR 2 +#define YMAJOR 4 + + /* standard scanline ordering */ +#define PIXSTANDARD (YMAJOR|YDECR) +#define PIXSTDFMT "-Y %d +X %d\n" + + /* structure for image dimensions */ +typedef struct { + int rt; /* orientation (from flags above) */ + int xr, yr; /* x and y resolution */ +} RESOLU; + + /* macros to get scanline length and number */ +#define scanlen(rs) ((rs)->rt & YMAJOR ? (rs)->xr : (rs)->yr) +#define numscans(rs) ((rs)->rt & YMAJOR ? (rs)->yr : (rs)->xr) + + /* resolution string buffer and its size */ +#define RESOLU_BUFLEN 32 + + /* macros for reading/writing resolution struct */ +#define fputsresolu(rs,fp) fputs(resolu2str(resolu_buf,rs),fp) +#define fgetsresolu(rs,fp) str2resolu(rs, \ + fgets(resolu_buf,RESOLU_BUFLEN,fp)) + + /* reading/writing of standard ordering */ +#define fprtresolu(sl,ns,fp) fprintf(fp,PIXSTDFMT,ns,sl) +#define fscnresolu(sl,ns,fp) (fscanf(fp,PIXSTDFMT,ns,sl)==2) + + /* defined in resolu.c */ +typedef int gethfunc(char *s, void *p); /* callback to process header lines */ + + +#define RED 0 +#define GRN 1 +#define BLU 2 +#define CIEX 0 /* or, if input is XYZ... */ +#define CIEY 1 +#define CIEZ 2 +#define EXP 3 /* exponent same for either format */ +#define COLXS 128 /* excess used for exponent */ +#define WHT 3 /* used for RGBPRIMS type */ + +#undef BYTE +#define BYTE unsigned char /* 8-bit unsigned integer */ + +typedef BYTE COLR[4]; /* red, green, blue (or X,Y,Z), exponent */ + +typedef float COLORV; +typedef COLORV COLOR[3]; /* red, green, blue (or X,Y,Z) */ + +typedef float RGBPRIMS[4][2]; /* (x,y) chromaticities for RGBW */ +typedef float (*RGBPRIMP)[2]; /* pointer to RGBPRIMS array */ + +typedef float COLORMAT[3][3]; /* color coordinate conversion matrix */ + +#define copycolr(c1,c2) (c1[0]=c2[0],c1[1]=c2[1], \ + c1[2]=c2[2],c1[3]=c2[3]) + +#define colval(col,pri) ((col)[pri]) + +#define setcolor(col,r,g,b) ((col)[RED]=(r),(col)[GRN]=(g),(col)[BLU]=(b)) + +#define copycolor(c1,c2) ((c1)[0]=(c2)[0],(c1)[1]=(c2)[1],(c1)[2]=(c2)[2]) + +#define scalecolor(col,sf) ((col)[0]*=(sf),(col)[1]*=(sf),(col)[2]*=(sf)) + +#define addcolor(c1,c2) ((c1)[0]+=(c2)[0],(c1)[1]+=(c2)[1],(c1)[2]+=(c2)[2]) + +#define multcolor(c1,c2) ((c1)[0]*=(c2)[0],(c1)[1]*=(c2)[1],(c1)[2]*=(c2)[2]) + +#ifdef NTSC +#define CIE_x_r 0.670 /* standard NTSC primaries */ +#define CIE_y_r 0.330 +#define CIE_x_g 0.210 +#define CIE_y_g 0.710 +#define CIE_x_b 0.140 +#define CIE_y_b 0.080 +#define CIE_x_w 0.3333 /* use true white */ +#define CIE_y_w 0.3333 +#else +#define CIE_x_r 0.640 /* nominal CRT primaries */ +#define CIE_y_r 0.330 +#define CIE_x_g 0.290 +#define CIE_y_g 0.600 +#define CIE_x_b 0.150 +#define CIE_y_b 0.060 +#define CIE_x_w 0.3333 /* use true white */ +#define CIE_y_w 0.3333 +#endif + +#define STDPRIMS {{CIE_x_r,CIE_y_r},{CIE_x_g,CIE_y_g}, \ + {CIE_x_b,CIE_y_b},{CIE_x_w,CIE_y_w}} + +#define CIE_D ( CIE_x_r*(CIE_y_g - CIE_y_b) + \ + CIE_x_g*(CIE_y_b - CIE_y_r) + \ + CIE_x_b*(CIE_y_r - CIE_y_g) ) +#define CIE_C_rD ( (1./CIE_y_w) * \ + ( CIE_x_w*(CIE_y_g - CIE_y_b) - \ + CIE_y_w*(CIE_x_g - CIE_x_b) + \ + CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g ) ) +#define CIE_C_gD ( (1./CIE_y_w) * \ + ( CIE_x_w*(CIE_y_b - CIE_y_r) - \ + CIE_y_w*(CIE_x_b - CIE_x_r) - \ + CIE_x_r*CIE_y_b + CIE_x_b*CIE_y_r ) ) +#define CIE_C_bD ( (1./CIE_y_w) * \ + ( CIE_x_w*(CIE_y_r - CIE_y_g) - \ + CIE_y_w*(CIE_x_r - CIE_x_g) + \ + CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r ) ) + +#define CIE_rf (CIE_y_r*CIE_C_rD/CIE_D) +#define CIE_gf (CIE_y_g*CIE_C_gD/CIE_D) +#define CIE_bf (CIE_y_b*CIE_C_bD/CIE_D) + +/* As of 9-94, CIE_rf=.265074126, CIE_gf=.670114631 and CIE_bf=.064811243 */ + +/***** The following definitions are valid for RGB colors only... *****/ + +#define bright(col) (CIE_rf*(col)[RED]+CIE_gf*(col)[GRN]+CIE_bf*(col)[BLU]) +#define normbright(c) ( ( (long)(CIE_rf*256.+.5)*(c)[RED] + \ + (long)(CIE_gf*256.+.5)*(c)[GRN] + \ + (long)(CIE_bf*256.+.5)*(c)[BLU] ) >> 8 ) + + /* luminous efficacies over visible spectrum */ +#define MAXEFFICACY 683. /* defined maximum at 550 nm */ +#define WHTEFFICACY 179. /* uniform white light */ +#define D65EFFICACY 203. /* standard illuminant D65 */ +#define INCEFFICACY 160. /* illuminant A (incand.) */ +#define SUNEFFICACY 208. /* illuminant B (solar dir.) */ +#define SKYEFFICACY D65EFFICACY /* skylight (should be 110) */ +#define DAYEFFICACY D65EFFICACY /* combined sky and solar */ + +#define luminance(col) (WHTEFFICACY * bright(col)) + +/***** ...end of stuff specific to RGB colors *****/ + +#define intens(col) ( (col)[0] > (col)[1] \ + ? (col)[0] > (col)[2] ? (col)[0] : (col)[2] \ + : (col)[1] > (col)[2] ? (col)[1] : (col)[2] ) + +#define colrval(c,p) ( (c)[EXP] ? \ + ldexp((c)[p]+.5,(int)(c)[EXP]-(COLXS+8)) : \ + 0. ) + +#define WHTCOLOR {1.0,1.0,1.0} +#define BLKCOLOR {0.0,0.0,0.0} +#define WHTCOLR {128,128,128,COLXS+1} +#define BLKCOLR {0,0,0,0} + + /* picture format identifier */ +#define COLRFMT "32-bit_rle_rgbe" +#define CIEFMT "32-bit_rle_xyze" +#define PICFMT "32-bit_rle_???e" /* matches either */ +#define LPICFMT 15 /* max format id len */ + + /* macros for exposures */ +#define EXPOSSTR "EXPOSURE=" +#define LEXPOSSTR 9 +#define isexpos(hl) (!strncmp(hl,EXPOSSTR,LEXPOSSTR)) +#define exposval(hl) atof((hl)+LEXPOSSTR) +#define fputexpos(ex,fp) fprintf(fp,"%s%e\n",EXPOSSTR,ex) + + /* macros for pixel aspect ratios */ +#define ASPECTSTR "PIXASPECT=" +#define LASPECTSTR 10 +#define isaspect(hl) (!strncmp(hl,ASPECTSTR,LASPECTSTR)) +#define aspectval(hl) atof((hl)+LASPECTSTR) +#define fputaspect(pa,fp) fprintf(fp,"%s%f\n",ASPECTSTR,pa) + + /* macros for primary specifications */ +#define PRIMARYSTR "PRIMARIES=" +#define LPRIMARYSTR 10 +#define isprims(hl) (!strncmp(hl,PRIMARYSTR,LPRIMARYSTR)) +#define primsval(p,hl) sscanf(hl+LPRIMARYSTR, \ + "%f %f %f %f %f %f %f %f", \ + &(p)[RED][CIEX],&(p)[RED][CIEY], \ + &(p)[GRN][CIEX],&(p)[GRN][CIEY], \ + &(p)[BLU][CIEX],&(p)[BLU][CIEY], \ + &(p)[WHT][CIEX],&(p)[WHT][CIEY]) +#define fputprims(p,fp) fprintf(fp, \ + "%s %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f\n",\ + PRIMARYSTR, \ + (p)[RED][CIEX],(p)[RED][CIEY], \ + (p)[GRN][CIEX],(p)[GRN][CIEY], \ + (p)[BLU][CIEX],(p)[BLU][CIEY], \ + (p)[WHT][CIEX],(p)[WHT][CIEY]) + + /* macros for color correction */ +#define COLCORSTR "COLORCORR=" +#define LCOLCORSTR 10 +#define iscolcor(hl) (!strncmp(hl,COLCORSTR,LCOLCORSTR)) +#define colcorval(cc,hl) sscanf(hl+LCOLCORSTR,"%f %f %f", \ + &(cc)[RED],&(cc)[GRN],&(cc)[BLU]) +#define fputcolcor(cc,fp) fprintf(fp,"%s %f %f %f\n",COLCORSTR, \ + (cc)[RED],(cc)[GRN],(cc)[BLU]) + +#define CGAMUT_LOWER 01 +#define CGAMUT_UPPER 02 +#define CGAMUT (CGAMUT_LOWER|CGAMUT_UPPER) + +#define rgb_cie(xyz,rgb) colortrans(xyz,rgb2xyzmat,rgb) + +#define cpcolormat(md,ms) memcpy((void *)md,(void *)ms,sizeof(COLORMAT)) + + + + +#define MAXLINE 512 + +char HDRSTR[] = "#?"; /* information header magic number */ + +char FMTSTR[] = "FORMAT="; /* format identifier */ + +char TMSTR[] = "CAPDATE="; /* capture date identifier */ + +static gethfunc mycheck; + + + +static int +formatval( /* get format value (return true if format) */ + register char *r, + register char *s +) +{ + register char *cp = FMTSTR; + + while (*cp) if (*cp++ != *s++) return(0); + while (isspace(*s)) s++; + if (!*s) return(0); + if (r == NULL) return(1); + do + *r++ = *s++; + while(*s && !isspace(*s)); + *r = '\0'; + return(1); +} + + +static int +isformat( /* is line a format line? */ + char *s +) +{ + return(formatval(NULL, s)); +} + + + +static int +getheader( /* get header from file */ + FILE *fp, + gethfunc *f, + void *p +) +{ + char buf[MAXLINE]; + + for ( ; ; ) { + buf[MAXLINE-2] = '\n'; + if (fgets(buf, MAXLINE, fp) == NULL) + return(-1); + if (buf[0] == '\n') + return(0); +#ifdef MSDOS + if (buf[0] == '\r' && buf[1] == '\n') + return(0); +#endif + if (buf[MAXLINE-2] != '\n') { + ungetc(buf[MAXLINE-2], fp); /* prevent false end */ + buf[MAXLINE-2] = '\0'; + } + if (f != NULL && (*f)(buf, p) < 0) + return(-1); + } +} + + +struct check { + FILE *fp; + char fs[64]; +}; + + +static int +mycheck( /* check a header line for format info. */ + char *s, + void *cp +) +{ + if (!formatval(((struct check*)cp)->fs, s) + && ((struct check*)cp)->fp != NULL) { + fputs(s, ((struct check*)cp)->fp); + } + return(0); +} + + +static int +globmatch( /* check for match of s against pattern p */ + register char *p, + register char *s +) +{ + int setmatch; + + do { + switch (*p) { + case '?': /* match any character */ + if (!*s++) + return(0); + break; + case '*': /* match any string */ + while (p[1] == '*') p++; + do + if ( (p[1]=='?' || p[1]==*s) && + globmatch(p+1,s) ) + return(1); + while (*s++); + return(0); + case '[': /* character set */ + setmatch = *s == *++p; + if (!*p) + return(0); + while (*++p != ']') { + if (!*p) + return(0); + if (*p == '-') { + setmatch += p[-1] <= *s && *s <= p[1]; + if (!*++p) + break; + } else + setmatch += *p == *s; + } + if (!setmatch) + return(0); + s++; + break; + case '\\': /* literal next */ + p++; + /* fall through */ + default: /* normal character */ + if (*p != *s) + return(0); + s++; + break; + } + } while (*p++); + return(1); +} + + +/* + * Checkheader(fin,fmt,fout) returns a value of 1 if the input format + * matches the specification in fmt, 0 if no input format was found, + * and -1 if the input format does not match or there is an + * error reading the header. If fmt is empty, then -1 is returned + * if any input format is found (or there is an error), and 0 otherwise. + * If fmt contains any '*' or '?' characters, then checkheader + * does wildcard expansion and copies a matching result into fmt. + * Be sure that fmt is big enough to hold the match in such cases, + * and that it is not a static, read-only string! + * The input header (minus any format lines) is copied to fout + * if fout is not NULL. + */ + +static int +checkheader( + FILE *fin, + char *fmt, + FILE *fout +) +{ + struct check cdat; + register char *cp; + + cdat.fp = fout; + cdat.fs[0] = '\0'; + if (getheader(fin, mycheck, &cdat) < 0) + return(-1); + if (!cdat.fs[0]) + return(0); + for (cp = fmt; *cp; cp++) /* check for globbing */ + if ((*cp == '?') | (*cp == '*')) { + if (globmatch(fmt, cdat.fs)) { + strcpy(fmt, cdat.fs); + return(1); + } else + return(-1); + } + return(strcmp(fmt, cdat.fs) ? -1 : 1); /* literal match */ +} + + +static char resolu_buf[RESOLU_BUFLEN]; /* resolution line buffer */ + + +static int +str2resolu(rp, buf) /* convert resolution line to struct */ +register RESOLU *rp; +char *buf; +{ + register char *xndx, *yndx; + register char *cp; + + if (buf == NULL) + return(0); + xndx = yndx = NULL; + for (cp = buf; *cp; cp++) + if (*cp == 'X') + xndx = cp; + else if (*cp == 'Y') + yndx = cp; + if (xndx == NULL || yndx == NULL) + return(0); + rp->rt = 0; + if (xndx > yndx) rp->rt |= YMAJOR; + if (xndx[-1] == '-') rp->rt |= XDECR; + if (yndx[-1] == '-') rp->rt |= YDECR; + if ((rp->xr = atoi(xndx+1)) <= 0) + return(0); + if ((rp->yr = atoi(yndx+1)) <= 0) + return(0); + return(1); +} + + +#ifdef getc_unlocked /* avoid horrendous overhead of flockfile */ +#undef getc +#undef putc +#define getc getc_unlocked +#define putc putc_unlocked +#endif + +#define MINELEN 8 /* minimum scanline length for encoding */ +#define MAXELEN 0x7fff /* maximum scanline length for encoding */ +#define MINRUN 4 /* minimum run length */ + + +static char * +tempbuffer(len) /* get a temporary buffer */ +unsigned int len; +{ + static char *tempbuf = NULL; + static unsigned tempbuflen = 0; + + if (len > tempbuflen) { + if (tempbuflen > 0) + tempbuf = (char *)realloc((void *)tempbuf, len); + else + tempbuf = (char *)malloc(len); + tempbuflen = tempbuf==NULL ? 0 : len; + } + return(tempbuf); +} + + + +static int +oldreadcolrs(scanline, len, fp) /* read in an old colr scanline */ +register COLR *scanline; +int len; +register FILE *fp; +{ + int rshift; + register int i; + + rshift = 0; + + while (len > 0) { + scanline[0][RED] = getc(fp); + scanline[0][GRN] = getc(fp); + scanline[0][BLU] = getc(fp); + scanline[0][EXP] = getc(fp); + if (feof(fp) || ferror(fp)) + return(-1); + if (scanline[0][RED] == 1 && + scanline[0][GRN] == 1 && + scanline[0][BLU] == 1) { + for (i = scanline[0][EXP] << rshift; i > 0; i--) { + copycolr(scanline[0], scanline[-1]); + scanline++; + len--; + } + rshift += 8; + } else { + scanline++; + len--; + rshift = 0; + } + } + return(0); +} + + +static int +freadcolrs(scanline, len, fp) /* read in an encoded colr scanline */ +register COLR *scanline; +int len; +register FILE *fp; +{ + register int i, j; + int code, val; + /* determine scanline type */ + if ((len < MINELEN) | (len > MAXELEN)) + return(oldreadcolrs(scanline, len, fp)); + if ((i = getc(fp)) == EOF) + return(-1); + if (i != 2) { + ungetc(i, fp); + return(oldreadcolrs(scanline, len, fp)); + } + scanline[0][GRN] = getc(fp); + scanline[0][BLU] = getc(fp); + if ((i = getc(fp)) == EOF) + return(-1); + if (scanline[0][GRN] != 2 || scanline[0][BLU] & 128) { + scanline[0][RED] = 2; + scanline[0][EXP] = i; + return(oldreadcolrs(scanline+1, len-1, fp)); + } + if ((scanline[0][BLU]<<8 | i) != len) + return(-1); /* length mismatch! */ + /* read each component */ + for (i = 0; i < 4; i++) + for (j = 0; j < len; ) { + if ((code = getc(fp)) == EOF) + return(-1); + if (code > 128) { /* run */ + code &= 127; + if ((val = getc(fp)) == EOF) + return -1; + if (j + code > len) + return -1; /* overrun */ + while (code--) + scanline[j++][i] = val; + } else { /* non-run */ + if (j + code > len) + return -1; /* overrun */ + while (code--) { + if ((val = getc(fp)) == EOF) + return -1; + scanline[j++][i] = val; + } + } + } + return(0); +} + + + +static void +colr_color(col, clr) /* convert short to float color */ +register COLOR col; +register COLR clr; +{ + double f; + + if (clr[EXP] == 0) + col[RED] = col[GRN] = col[BLU] = 0.0; + else { + f = ldexp(1.0, (int)clr[EXP]-(COLXS+8)); + col[RED] = (clr[RED] + 0.5)*f; + col[GRN] = (clr[GRN] + 0.5)*f; + col[BLU] = (clr[BLU] + 0.5)*f; + } +} + +static int +freadscan(scanline, len, fp) /* read in a scanline */ +register COLOR *scanline; +int len; +FILE *fp; +{ + register COLR *clrscan; + + if ((clrscan = (COLR *)tempbuffer(len*sizeof(COLR))) == NULL) + return(-1); + if (freadcolrs(clrscan, len, fp) < 0) + return(-1); + /* convert scanline */ + colr_color(scanline[0], clrscan[0]); + while (--len > 0) { + scanline++; clrscan++; + if (clrscan[0][RED] == clrscan[-1][RED] && + clrscan[0][GRN] == clrscan[-1][GRN] && + clrscan[0][BLU] == clrscan[-1][BLU] && + clrscan[0][EXP] == clrscan[-1][EXP]) + copycolor(scanline[0], scanline[-1]); + else + colr_color(scanline[0], clrscan[0]); + } + return(0); +} + + + + + + + +/* End copy-paste from Radiance sources. + */ + /* What we track during an radiance-file read. */ typedef struct { diff --git a/libsrc/format/resolu.c b/libsrc/format/resolu.c deleted file mode 100644 index 0c96fadd..00000000 --- a/libsrc/format/resolu.c +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef lint -static const char RCSid[] = "$Id: resolu.c,v 2.6 2006/06/07 17:52:03 schorsch Exp $"; -#endif -/* - * Read and write image resolutions. - * - * Externals declared in resolu.h - */ - -#include "copyright.h" - -#include -#include - -#include "resolu.h" - - -char resolu_buf[RESOLU_BUFLEN]; /* resolution line buffer */ - - -void -fputresolu(ord, sl, ns, fp) /* put out picture dimensions */ -int ord; /* scanline ordering */ -int sl, ns; /* scanline length and number */ -FILE *fp; -{ - RESOLU rs; - - if ((rs.rt = ord) & YMAJOR) { - rs.xr = sl; - rs.yr = ns; - } else { - rs.xr = ns; - rs.yr = sl; - } - fputsresolu(&rs, fp); -} - - -int -fgetresolu(sl, ns, fp) /* get picture dimensions */ -int *sl, *ns; /* scanline length and number */ -FILE *fp; -{ - RESOLU rs; - - if (!fgetsresolu(&rs, fp)) - return(-1); - if (rs.rt & YMAJOR) { - *sl = rs.xr; - *ns = rs.yr; - } else { - *sl = rs.yr; - *ns = rs.xr; - } - return(rs.rt); -} - - -char * -resolu2str(buf, rp) /* convert resolution struct to line */ -char *buf; -register RESOLU *rp; -{ - if (rp->rt&YMAJOR) - sprintf(buf, "%cY %d %cX %d\n", - rp->rt&YDECR ? '-' : '+', rp->yr, - rp->rt&XDECR ? '-' : '+', rp->xr); - else - sprintf(buf, "%cX %d %cY %d\n", - rp->rt&XDECR ? '-' : '+', rp->xr, - rp->rt&YDECR ? '-' : '+', rp->yr); - return(buf); -} - - -int -str2resolu(rp, buf) /* convert resolution line to struct */ -register RESOLU *rp; -char *buf; -{ - register char *xndx, *yndx; - register char *cp; - - if (buf == NULL) - return(0); - xndx = yndx = NULL; - for (cp = buf; *cp; cp++) - if (*cp == 'X') - xndx = cp; - else if (*cp == 'Y') - yndx = cp; - if (xndx == NULL || yndx == NULL) - return(0); - rp->rt = 0; - if (xndx > yndx) rp->rt |= YMAJOR; - if (xndx[-1] == '-') rp->rt |= XDECR; - if (yndx[-1] == '-') rp->rt |= YDECR; - if ((rp->xr = atoi(xndx+1)) <= 0) - return(0); - if ((rp->yr = atoi(yndx+1)) <= 0) - return(0); - return(1); -}