1 /*
2 Copyright (C) 1994-1995 Apogee Software, Ltd.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 
19 */
20 #include "rt_def.h"
21 #include "rt_util.h"
22 #include "rt_view.h"
23 #include <math.h>
24 #include <dos.h>
25 #include <stdio.h>
26 #include <stdarg.h>
27 #include <fcntl.h>
28 #include <errno.h>
29 #include <conio.h>
30 #include <string.h>
31 #include <stdio.h>
32 #include <ctype.h>
33 #include <io.h>
34 #include <stdlib.h>
35 #include <sys\stat.h>
36 
37 //MED
38 #include "memcheck.h"
39 
40 #define PANGLES 512
41 #define NUMSINANGLES FINEANGLES+FINEANGLEQUAD+1
42 
43 fixed  pangle[PANGLES];
44 long   sintable[NUMSINANGLES];
45 short  tantable[FINEANGLES];
46 byte   gammatable[GAMMAENTRIES];
47 
48 extern  int      _argc;
49 extern  char **  _argv;
50 
51 /*
52 =================
53 =
54 = Error
55 =
56 = For abnormal program terminations
57 =
58 =================
59 */
60 
Error(char * error,...)61 void Error (char *error, ...)
62 {
63 	va_list	argptr;
64 
65 	va_start (argptr,error);
66 	vprintf (error,argptr);
67 	va_end (argptr);
68 	printf ("\n");
69 	exit (1);
70 }
71 
72 
SafeOpenWrite(char * _filename)73 int SafeOpenWrite (char *_filename)
74 {
75 	int	handle;
76     char filename[MAX_PATH];
77     strncpy(filename, _filename, sizeof (filename));
78     filename[sizeof (filename) - 1] = '\0';
79     FixFilePath(filename);
80 
81 	handle = open(filename,O_RDWR | O_BINARY | O_CREAT | O_TRUNC
82 	, S_IREAD | S_IWRITE);
83 
84 	if (handle == -1)
85 		Error ("Error opening %s: %s",filename,strerror(errno));
86 
87 	return handle;
88 }
89 
90 
SafeWrite(int handle,void * buffer,long count)91 void SafeWrite (int handle, void *buffer, long count)
92 {
93 	unsigned	iocount;
94 
95 	while (count)
96 	{
97 		iocount = count > 0x8000 ? 0x8000 : count;
98 		if (write (handle,buffer,iocount) != iocount)
99 			Error ("File write failure");
100 		buffer = (void *)( (byte *)buffer + iocount );
101 		count -= iocount;
102 	}
103 }
104 
105 
106 
107 
CalcPixelAngles(void)108 void CalcPixelAngles ( void )
109 {
110     int   i;
111     long  intang;
112     double  angle;
113     double  tang;
114 
115     const   double radtoint = (double)FINEANGLES/2/PI;
116 
117 
118     for (i=0;i<PANGLES;i++)
119        {
120        // start 1/2 pixel over, so viewangle bisects two middle pixels
121        tang = ((((double)i*160.0)+80.0)/(FPFOCALWIDTH*(double)PANGLES));
122        angle = atan(tang);
123        intang = ((long)(angle*radtoint));
124        pangle[i] = intang;
125        }
126 }
127 
128 
129 
BuildSinTable(void)130 void BuildSinTable (void)
131 {
132    int   i;
133    double  angle,anglestep;
134    double  sinangle;
135    fixed  value;
136 
137    angle = 0;
138    anglestep = (double)(PI/2/FINEANGLEQUAD);
139    for (i=0;i<=FINEANGLEQUAD;i++)
140       {
141       sinangle=sin(angle);
142       value=(fixed)((double)GLOBAL1*sinangle);
143       sintable[i]     =
144       sintable[i+FINEANGLES]  =
145       sintable[FINEANGLES/2-i] = value;
146       sintable[FINEANGLES-i] = -value;
147       sintable[FINEANGLES/2+i] = -value;
148       angle += anglestep;
149       }
150 }
151 
BuildTanTable(void)152 void BuildTanTable (void)
153 {
154    int   i;
155    double  angle,anglestep;
156    double  tanangle;
157    fixed  value;
158 
159    angle = 0;
160    anglestep = (double)(PI*2/FINEANGLES);
161    for (i=0;i<FINEANGLES;i++)
162       {
163       tanangle=tan(angle);
164       value=(fixed)((double)GLOBAL1*tanangle);
165       tantable[i] =(short) (value>>1);
166       angle += anglestep;
167       }
168 }
169 
BuildGammaTable(void)170 void BuildGammaTable (void)
171 {
172    int     l, i, inf;
173    int     j;
174    int     gGamma=0x100;
175    j=0;
176    for (l=0 ; l<NUMGAMMALEVELS ; l++,gGamma+=32)
177       {
178       double nGamma = (double)256 / gGamma;
179       double nScale = (double)63  / pow(63, nGamma);
180 
181       for ( i = 0; i < 64; i++ )
182          {
183          inf = pow(i, nGamma) * nScale;
184          if (inf < 0)
185             inf = 0;
186          if (inf > 63)
187             inf = 63;
188          gammatable[j++]=inf;
189          }
190       }
191 }
192 
main()193 void main ()
194 {
195    int handle;
196    int size;
197 
198    if (_argc!=2)
199       {
200       printf("LOOKUPS -- Apogee Software (c) 1994\n");
201       printf("\n USAGE:    lookups <name.dat>\n");
202       exit(0);
203       }
204    handle=SafeOpenWrite (_argv[1]);
205    CalcPixelAngles();
206    BuildSinTable();
207    BuildTanTable();
208    BuildGammaTable();
209    size=PANGLES;
210    SafeWrite(handle,&size,sizeof(int));
211    SafeWrite(handle,&pangle[0],sizeof(fixed)*size);
212    size=NUMSINANGLES;
213    SafeWrite(handle,&size,sizeof(int));
214    SafeWrite(handle,&sintable[0],sizeof(fixed)*size);
215    size=FINEANGLES;
216    SafeWrite(handle,&size,sizeof(int));
217    SafeWrite(handle,&tantable[0],sizeof(short)*size);
218    size=GAMMAENTRIES;
219    SafeWrite(handle,&size,sizeof(int));
220    SafeWrite(handle,&gammatable[0],sizeof(byte)*size);
221    close (handle);
222 }
223