ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/lamps.c
Revision: 2.6
Committed: Sat Feb 22 02:07:22 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.5: +62 -7 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * Load lamp data.
6 */
7
8 /* ====================================================================
9 * The Radiance Software License, Version 1.0
10 *
11 * Copyright (c) 1990 - 2002 The Regents of the University of California,
12 * through Lawrence Berkeley National Laboratory. All rights reserved.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 *
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 *
21 * 2. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in
23 * the documentation and/or other materials provided with the
24 * distribution.
25 *
26 * 3. The end-user documentation included with the redistribution,
27 * if any, must include the following acknowledgment:
28 * "This product includes Radiance software
29 * (http://radsite.lbl.gov/)
30 * developed by the Lawrence Berkeley National Laboratory
31 * (http://www.lbl.gov/)."
32 * Alternately, this acknowledgment may appear in the software itself,
33 * if and wherever such third-party acknowledgments normally appear.
34 *
35 * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
36 * and "The Regents of the University of California" must
37 * not be used to endorse or promote products derived from this
38 * software without prior written permission. For written
39 * permission, please contact [email protected].
40 *
41 * 5. Products derived from this software may not be called "Radiance",
42 * nor may "Radiance" appear in their name, without prior written
43 * permission of Lawrence Berkeley National Laboratory.
44 *
45 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
46 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
47 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
48 * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
49 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
51 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
52 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
53 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
54 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
55 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56 * SUCH DAMAGE.
57 * ====================================================================
58 *
59 * This software consists of voluntary contributions made by many
60 * individuals on behalf of Lawrence Berkeley National Laboratory. For more
61 * information on Lawrence Berkeley National Laboratory, please see
62 * <http://www.lbl.gov/>.
63 */
64
65 #include <stdio.h>
66 #include <stdlib.h>
67 #include <ctype.h>
68 #include "color.h"
69
70 extern char *eindex(), *expsave();
71 extern FILE *frlibopen();
72
73 typedef struct lamp {
74 char *pattern; /* search pattern */
75 float *color; /* pointer to lamp value */
76 struct lamp *next; /* next lamp in list */
77 } LAMP; /* a lamp entry */
78
79 static LAMP *lamps = NULL; /* lamp list */
80
81
82 float *
83 matchlamp(s) /* see if string matches any lamp */
84 char *s;
85 {
86 register LAMP *lp;
87
88 for (lp = lamps; lp != NULL; lp = lp->next) {
89 expset(lp->pattern);
90 if (eindex(s) != NULL)
91 return(lp->color);
92 }
93 return(NULL);
94 }
95
96
97 loadlamps(file) /* load lamp type file */
98 char *file;
99 {
100 LAMP *lastp;
101 register LAMP *lp;
102 FILE *fp;
103 float xyz[3];
104 char buf[128], str[128];
105 register char *cp1, *cp2;
106
107 if ((fp = frlibopen(file)) == NULL)
108 return(0);
109 lastp = NULL;
110 while (fgets(buf, sizeof(buf), fp) != NULL) {
111 /* work on a copy of buffer */
112 strcpy(str, buf);
113 /* get pattern for this entry */
114 for (cp1 = str; isspace(*cp1); cp1++)
115 ;
116 if (!*cp1 || *cp1 == '#')
117 continue;
118 for (cp2 = cp1+1; *cp2; cp2++)
119 if (*cp2 == *cp1 && cp2[-1] != '\\')
120 break;
121 if (!*cp2) {
122 cp1 = "unclosed pattern";
123 goto fmterr;
124 }
125 cp1++; *cp2++ = '\0';
126 if (ecompile(cp1, 1, 0) < 0) {
127 cp1 = "bad regular expression";
128 goto fmterr;
129 }
130 if ((lp = (LAMP *)malloc(sizeof(LAMP))) == NULL)
131 goto memerr;
132 if ((lp->pattern = expsave()) == NULL)
133 goto memerr;
134 /* get specification */
135 for (cp1 = cp2; isspace(*cp1); cp1++)
136 ;
137 if (!isdigit(*cp1) && *cp1 != '.' && *cp1 != '(') {
138 cp1 = "missing lamp specification";
139 goto fmterr;
140 }
141 if (*cp1 == '(') { /* find alias */
142 for (cp2 = ++cp1; *cp2; cp2++)
143 if (*cp2 == ')' && cp2[-1] != '\\')
144 break;
145 *cp2 = '\0';
146 if ((lp->color = matchlamp(cp1)) == NULL) {
147 cp1 = "unmatched alias";
148 goto fmterr;
149 }
150 } else { /* or read specificaion */
151 if ((lp->color=(float *)malloc(6*sizeof(float)))==NULL)
152 goto memerr;
153 if (sscanf(cp1, "%f %f %f", &lp->color[3], &
154 lp->color[4], &lp->color[5]) != 3) {
155 cp1 = "bad lamp data";
156 goto fmterr;
157 }
158 /* convert xyY to XYZ */
159 xyz[1] = lp->color[5];
160 xyz[0] = lp->color[3]/lp->color[4] * xyz[1];
161 xyz[2] = xyz[1]*(1./lp->color[4] - 1.) - xyz[0];
162 /* XYZ to RGB */
163 cie_rgb(lp->color, xyz);
164 }
165 if (lastp == NULL)
166 lamps = lp;
167 else
168 lastp->next = lp;
169 lp->next = NULL;
170 lastp = lp;
171 }
172 fclose(fp);
173 return(lastp != NULL);
174 memerr:
175 fputs("Out of memory in loadlamps\n", stderr);
176 return(-1);
177 fmterr:
178 fputs(buf, stderr);
179 fprintf(stderr, "%s: %s\n", file, cp1);
180 return(-1);
181 }
182
183
184 freelamps() /* free our lamps list */
185 {
186 register LAMP *lp1, *lp2;
187
188 for (lp1 = lamps; lp1 != NULL; lp1 = lp2) {
189 free(lp1->pattern);
190 if (lp1->color != NULL) {
191 for (lp2 = lp1->next; lp2 != NULL; lp2 = lp2->next)
192 if (lp2->color == lp1->color)
193 lp2->color = NULL;
194 free((void *)lp1->color);
195 }
196 lp2 = lp1->next;
197 free((void *)lp1);
198 }
199 lamps = NULL;
200 }