summaryrefslogtreecommitdiffstats
path: root/tcliis/util.c
blob: 6b6814b310f02373783ba1dd38c3a593df064553 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "iis.h"
#include "xim.h"

/* Definitions for the supported ISM Modules. */
int	  ism_nmodules  = 0;

ismModule ism_modules[] = {
   {"wcspix", "", NULL, NULL, NULL, 0},
};

/* BSWAP2 - Move bytes from array "a" to array "b", swapping successive
 * pairs of bytes.  The two arrays may be the same but may not be offset
 * and overlapping.
 */
void bswap2 (char* a, char* b, int nbytes)
{
	register char *ip=a, *op=b, *otop;
	register unsigned temp;

	/* Swap successive pairs of bytes.
	 */
	for (otop = op + (nbytes & ~1);  op < otop;  ) {
	    temp  = *ip++;
	    *op++ = *ip++;
	    *op++ = temp;
	}

	/* If there is an odd byte left, move it to the output array.
	 */
	if (nbytes & 1)
	    *op = *ip;
}

/* GET_FBCONFIG -- Read the XIMTOOL startup file to get the set of possible
 * frame buffer sizes.
 *
 * File format:		configno nframes width height [extra fields]
 *	e.g.,			1  2  512  512
 *				2  2  800  800
 *				3  1 1024 1024		# comment
 */
void get_fbconfig (register XimDataPtr xim)
{
	register char	*ip;
	register FILE	*fp = NULL;
	int	config, nframes, width, height, i;
	char	lbuf[SZ_LINE+1], *fname;
	static char *fb_paths[] = {
		"/usr/local/lib/imtoolrc",
		"/opt/local/lib/imtoolrc",
		"/iraf/iraf/dev/imtoolrc",
		"/local/lib/imtoolrc",
		"/usr/iraf/dev/imtoolrc",
		"/usr/local/iraf/dev/imtoolrc",
		NULL};

	/* Initialize the config table. */
	xim->fb_configno = 1;
	for (i=0;  i < MAX_FBCONFIG;  i++) {
	    xim->fb_config[i].nframes = 1;
	    xim->fb_config[i].width = DEF_FRAME_WIDTH;
	    xim->fb_config[i].height = DEF_FRAME_HEIGHT;
	}

	/* Now add in some defaults for commonly used sizes based on the
 	 * standard IRAF imtoolrc file, we'll avoid any instrument specific
	 * configurations.
	 */
	xim->fb_config[0].width = xim->fb_config[0].height =  512;
	xim->fb_config[1].width = xim->fb_config[1].height =  800;
	xim->fb_config[2].width = xim->fb_config[2].height = 1024;
	xim->fb_config[3].width = xim->fb_config[3].height = 1600;
	xim->fb_config[4].width = xim->fb_config[4].height = 2048;
	xim->fb_config[5].width = xim->fb_config[5].height = 4096;

	/* Attempt to open the config file. */
	if ((fname=getenv(FBCONFIG_ENV1)) || (fname=getenv(FBCONFIG_ENV2)))
	    fp = fopen (fname, "r");
	if (!fp && (fname = getenv ("HOME"))) {
	    sprintf (lbuf, "%s/%s", fname, FBCONFIG_1);
	    fp = fopen (fname = lbuf, "r");
	    if (fp) {
	      if (xim->imtoolrc)
		free(xim->imtoolrc);
	      xim->imtoolrc = (char *) calloc (SZ_LINE, sizeof(char));
	      strncpy (xim->imtoolrc, fname, strlen(fname));
	    }
	}
	if (!fp)
	    fp = fopen (fname = xim->imtoolrc, "r");
 	for (i=0; !fp && fb_paths[i]; i++) {
	    if ((fp = fopen (fname = fb_paths[i], "r"))) {
	      if (xim->imtoolrc)
		free(xim->imtoolrc);
	      
	      xim->imtoolrc = calloc(strlen(fb_paths[i])+1,sizeof(char));
	      strncpy (xim->imtoolrc, fb_paths[i],strlen(fb_paths[i]));
	      break;
	    }
	}
	if (!fp) {
	  default_imtoolrc(xim);
	    return;
	}

	/* Scan the frame buffer configuration file.
	 */
	while (fgets (lbuf, SZ_LINE, fp) != NULL) {
	    /* Skip comment lines and blank lines. */
	    for (ip=lbuf;  *ip == ' ' || *ip == '\t';  ip++)
		;
	    if (*ip == '\n' || *ip == '#')
		continue;
	    if (!isdigit (*ip))
		continue;
	    switch (sscanf (ip, "%d%d%d%d", &config,&nframes,&width,&height)) {
	    case 4:
		break;			/* normal case */
	    case 3:
		height = width;		/* default to square format */
		break;
	    default:
		fprintf (stderr, "ximtool: bad config `%s'\n", ip);
		continue;
	    }

	    nframes = max (1, nframes);
	    width   = max (1, width);
	    height  = max (1, height);

	    /* Since the frame buffer is stored in a memory pixrect
	     * (effectively), the line length should be an integral number
	     * of 16 bit words.
	     */
	    if (width & 1) {
		fprintf (stderr, "imtool warning: fb config %d [%d-%dx%d] - ",
		    config, nframes, width, height);
		fprintf (stderr, "frame width should be even, reset to %d\n",
		    --width);
	    }

	    config = max(1, min(MAX_FBCONFIG, config)) - 1;
	    xim->fb_config[config].nframes = nframes;
	    xim->fb_config[config].width   = width;
	    xim->fb_config[config].height  = height;
	}

	if (fp) fclose (fp);
}

/* 
 * Default imtoolrc file-- if a valid imtoolrc file can not be found, 
 * then fill out a default fb_config
 */

void default_imtoolrc(XimDataPtr xim)
{
  /* 1  2  512  512 # imt1|imt512 */
  xim->fb_config[0].nframes = 2;
  xim->fb_config[0].width = 512;
  xim->fb_config[0].height = 512;
  /* 2  2  800  800 # imt2|imt800 */
  xim->fb_config[1].nframes = 2;
  xim->fb_config[1].width = 800;
  xim->fb_config[1].height = 800;
  /* 3  2 1024 1024 # imt3|imt1024 */
  xim->fb_config[2].nframes = 2;
  xim->fb_config[2].width = 1024;
  xim->fb_config[2].height = 1024;
  /* 4  1 1600 1600 # imt4|imt1600 */
  xim->fb_config[3].nframes = 1;
  xim->fb_config[3].width = 1600;
  xim->fb_config[3].height = 1600;
  /* 5  1 2048 2048 # imt5|imt2048 */
  xim->fb_config[4].nframes = 1;
  xim->fb_config[4].width = 2048;
  xim->fb_config[4].height = 2048;
  /* 6  1 4096 4096 # imt6|imt4096 */
  xim->fb_config[5].nframes = 1;
  xim->fb_config[5].width = 4096;
  xim->fb_config[5].height = 4096;
  /* 7  1 8192 8192 # imt7|imt8192 */
  xim->fb_config[6].nframes = 1;
  xim->fb_config[6].width = 8192;
  xim->fb_config[6].height = 8192;
  /* 8  1 1024 4096 # imt8|imt1x4 */
  xim->fb_config[7].nframes = 1;
  xim->fb_config[7].width = 1024;
  xim->fb_config[7].height = 4096;
  /* 9  2 1144  880 # imt9|imtfs full screen (1152x900 minus frame) */
  xim->fb_config[8].nframes = 2;
  xim->fb_config[8].width = 1144;
  xim->fb_config[8].height = 880;
  /* 10  2 1144  764 # imt10|imtfs35 full screen at 35mm film aspect */
  xim->fb_config[9].nframes = 2;
  xim->fb_config[9].width = 1144;
  xim->fb_config[9].height = 764;
  /* 11  2  128  128 # imt11|imt128 */
  xim->fb_config[10].nframes = 2;
  xim->fb_config[10].width = 128;
  xim->fb_config[10].height = 128;
  /* 12  2  256  256 # imt12|imt256 */
  xim->fb_config[11].nframes = 2;
  xim->fb_config[11].width = 256;
  xim->fb_config[11].height = 256;
  /* 13  2  128 1056 # imt13|imttall128 tall & narrow for spectro. */
  xim->fb_config[12].nframes = 2;
  xim->fb_config[12].width = 128;
  xim->fb_config[12].height = 1056;
  /* 14  2  256 1056 # imt14|imttall256 tall & wider for spectro. */
  xim->fb_config[13].nframes = 2;
  xim->fb_config[13].width = 256;
  xim->fb_config[13].height = 1056;
  /* 15  2 1056  128 # imt15|imtwide128 wide & thin for spectro. */
  xim->fb_config[14].nframes = 2;
  xim->fb_config[14].width = 1056;
  xim->fb_config[14].height = 128;
  /* 16  2 1056  256 # imt16|imtwide256 wide & fatter for spectro. */
  xim->fb_config[15].nframes = 2;
  xim->fb_config[15].width = 1056;
  xim->fb_config[15].height = 256;
  /* 17  2 1008  648 # imt17|imtssy Solitaire fmt w/ imtool border */
  xim->fb_config[16].nframes = 2;
  xim->fb_config[16].width = 1008;
  xim->fb_config[16].height = 648;
  /* 18  2 1024  680 # imt18|imtssn Solitaire fmt w/out imtool border */
  xim->fb_config[17].nframes = 2;
  xim->fb_config[17].width = 1024;
  xim->fb_config[17].height = 680;
  /* 19  1 4096 1024 # imt19|imt4x1 */
  xim->fb_config[18].nframes = 1;
  xim->fb_config[18].width = 4096;
  xim->fb_config[18].height = 1024;
}

void wcspix_message (XimDataPtr xim, char* message) {}
void ism_message (XimDataPtr xim, char* object, char* command) {}