ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/lamps.c
Revision: 2.10
Committed: Mon Feb 18 23:35:51 2008 UTC (16 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R1, rad4R0, rad3R9, rad4R2P1, rad5R3, HEAD
Changes since 2.9: +1 -2 lines
Log Message:
Removed unnecessary declaration

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: lamps.c,v 2.9 2003/06/08 12:03:09 schorsch Exp $";
3 #endif
4 /*
5 * Load lamp data.
6 */
7
8 #include "copyright.h"
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <ctype.h>
13
14 #include "standard.h"
15 #include "color.h"
16
17 extern char *eindex(), *expsave();
18
19 typedef struct lamp {
20 char *pattern; /* search pattern */
21 float *color; /* pointer to lamp value */
22 struct lamp *next; /* next lamp in list */
23 } LAMP; /* a lamp entry */
24
25 static LAMP *lamps = NULL; /* lamp list */
26
27
28 float *
29 matchlamp( /* see if string matches any lamp */
30 char *s
31 )
32 {
33 register LAMP *lp;
34
35 for (lp = lamps; lp != NULL; lp = lp->next) {
36 expset(lp->pattern);
37 if (eindex(s) != NULL)
38 return(lp->color);
39 }
40 return(NULL);
41 }
42
43
44 int
45 loadlamps( /* load lamp type file */
46 char *file
47 )
48 {
49 LAMP *lastp;
50 register LAMP *lp;
51 FILE *fp;
52 float xyz[3];
53 char buf[128], str[128];
54 register char *cp1, *cp2;
55
56 if ((fp = frlibopen(file)) == NULL)
57 return(0);
58 lastp = NULL;
59 while (fgets(buf, sizeof(buf), fp) != NULL) {
60 /* work on a copy of buffer */
61 strcpy(str, buf);
62 /* get pattern for this entry */
63 for (cp1 = str; isspace(*cp1); cp1++)
64 ;
65 if (!*cp1 || *cp1 == '#')
66 continue;
67 for (cp2 = cp1+1; *cp2; cp2++)
68 if (*cp2 == *cp1 && cp2[-1] != '\\')
69 break;
70 if (!*cp2) {
71 cp1 = "unclosed pattern";
72 goto fmterr;
73 }
74 cp1++; *cp2++ = '\0';
75 if (ecompile(cp1, 1, 0) < 0) {
76 cp1 = "bad regular expression";
77 goto fmterr;
78 }
79 if ((lp = (LAMP *)malloc(sizeof(LAMP))) == NULL)
80 goto memerr;
81 if ((lp->pattern = expsave()) == NULL)
82 goto memerr;
83 /* get specification */
84 for (cp1 = cp2; isspace(*cp1); cp1++)
85 ;
86 if (!isdigit(*cp1) && *cp1 != '.' && *cp1 != '(') {
87 cp1 = "missing lamp specification";
88 goto fmterr;
89 }
90 if (*cp1 == '(') { /* find alias */
91 for (cp2 = ++cp1; *cp2; cp2++)
92 if (*cp2 == ')' && cp2[-1] != '\\')
93 break;
94 *cp2 = '\0';
95 if ((lp->color = matchlamp(cp1)) == NULL) {
96 cp1 = "unmatched alias";
97 goto fmterr;
98 }
99 } else { /* or read specificaion */
100 if ((lp->color=(float *)malloc(6*sizeof(float)))==NULL)
101 goto memerr;
102 if (sscanf(cp1, "%f %f %f", &lp->color[3], &
103 lp->color[4], &lp->color[5]) != 3) {
104 cp1 = "bad lamp data";
105 goto fmterr;
106 }
107 /* convert xyY to XYZ */
108 xyz[1] = lp->color[5];
109 xyz[0] = lp->color[3]/lp->color[4] * xyz[1];
110 xyz[2] = xyz[1]*(1./lp->color[4] - 1.) - xyz[0];
111 /* XYZ to RGB */
112 cie_rgb(lp->color, xyz);
113 }
114 if (lastp == NULL)
115 lamps = lp;
116 else
117 lastp->next = lp;
118 lp->next = NULL;
119 lastp = lp;
120 }
121 fclose(fp);
122 return(lastp != NULL);
123 memerr:
124 fputs("Out of memory in loadlamps\n", stderr);
125 return(-1);
126 fmterr:
127 fputs(buf, stderr);
128 fprintf(stderr, "%s: %s\n", file, cp1);
129 return(-1);
130 }
131
132
133 void
134 freelamps(void) /* free our lamps list */
135 {
136 register LAMP *lp1, *lp2;
137
138 for (lp1 = lamps; lp1 != NULL; lp1 = lp2) {
139 free(lp1->pattern);
140 if (lp1->color != NULL) {
141 for (lp2 = lp1->next; lp2 != NULL; lp2 = lp2->next)
142 if (lp2->color == lp1->color)
143 lp2->color = NULL;
144 free((void *)lp1->color);
145 }
146 lp2 = lp1->next;
147 free((void *)lp1);
148 }
149 lamps = NULL;
150 }