1 /* stdlib is needed for the abs function */
2 #include <stdlib.h>
3 /*
4 The following prototype code was provided by Doug Tody, NRAO, for
5 performing conversion between pixel arrays and line lists. The
6 compression technique is used in IRAF.
7 */
8 int pl_p2li (int *pxsrc, int xs, short *lldst, int npix);
9 int pl_l2pi (short *ll_src, int xs, int *px_dst, int npix);
10
11
12 /*
13 * PL_P2L -- Convert a pixel array to a line list. The length of the list is
14 * returned as the function value.
15 *
16 * Translated from the SPP version using xc -f, f2c. 8Sep99 DCT.
17 */
18
19 #ifndef min
20 #define min(a,b) (((a)<(b))?(a):(b))
21 #endif
22 #ifndef max
23 #define max(a,b) (((a)>(b))?(a):(b))
24 #endif
25
pl_p2li(int * pxsrc,int xs,short * lldst,int npix)26 int pl_p2li (int *pxsrc, int xs, short *lldst, int npix)
27 /* int *pxsrc; input pixel array */
28 /* int xs; starting index in pxsrc (?) */
29 /* short *lldst; encoded line list */
30 /* int npix; number of pixels to convert */
31 {
32 /* System generated locals */
33 int ret_val, i__1, i__2, i__3;
34
35 /* Local variables */
36 int zero, v, x1, hi, ip, dv, xe, np, op, iz, nv = 0, pv, nz;
37
38 /* Parameter adjustments */
39 --lldst;
40 --pxsrc;
41
42 /* Function Body */
43 if (! (npix <= 0)) {
44 goto L110;
45 }
46 ret_val = 0;
47 goto L100;
48 L110:
49 lldst[3] = -100;
50 lldst[2] = 7;
51 lldst[1] = 0;
52 lldst[6] = 0;
53 lldst[7] = 0;
54 xe = xs + npix - 1;
55 op = 8;
56 zero = 0;
57 /* Computing MAX */
58 i__1 = zero, i__2 = pxsrc[xs];
59 pv = max(i__1,i__2);
60 x1 = xs;
61 iz = xs;
62 hi = 1;
63 i__1 = xe;
64 for (ip = xs; ip <= i__1; ++ip) {
65 if (! (ip < xe)) {
66 goto L130;
67 }
68 /* Computing MAX */
69 i__2 = zero, i__3 = pxsrc[ip + 1];
70 nv = max(i__2,i__3);
71 if (! (nv == pv)) {
72 goto L140;
73 }
74 goto L120;
75 L140:
76 if (! (pv == 0)) {
77 goto L150;
78 }
79 pv = nv;
80 x1 = ip + 1;
81 goto L120;
82 L150:
83 goto L131;
84 L130:
85 if (! (pv == 0)) {
86 goto L160;
87 }
88 x1 = xe + 1;
89 L160:
90 L131:
91 np = ip - x1 + 1;
92 nz = x1 - iz;
93 if (! (pv > 0)) {
94 goto L170;
95 }
96 dv = pv - hi;
97 if (! (dv != 0)) {
98 goto L180;
99 }
100 hi = pv;
101 if (! (abs(dv) > 4095)) {
102 goto L190;
103 }
104 lldst[op] = (short) ((pv & 4095) + 4096);
105 ++op;
106 lldst[op] = (short) (pv / 4096);
107 ++op;
108 goto L191;
109 L190:
110 if (! (dv < 0)) {
111 goto L200;
112 }
113 lldst[op] = (short) (-dv + 12288);
114 goto L201;
115 L200:
116 lldst[op] = (short) (dv + 8192);
117 L201:
118 ++op;
119 if (! (np == 1 && nz == 0)) {
120 goto L210;
121 }
122 v = lldst[op - 1];
123 lldst[op - 1] = (short) (v | 16384);
124 goto L91;
125 L210:
126 L191:
127 L180:
128 L170:
129 if (! (nz > 0)) {
130 goto L220;
131 }
132 L230:
133 if (! (nz > 0)) {
134 goto L232;
135 }
136 lldst[op] = (short) min(4095,nz);
137 ++op;
138 /* L231: */
139 nz += -4095;
140 goto L230;
141 L232:
142 if (! (np == 1 && pv > 0)) {
143 goto L240;
144 }
145 lldst[op - 1] = (short) (lldst[op - 1] + 20481);
146 goto L91;
147 L240:
148 L220:
149 L250:
150 if (! (np > 0)) {
151 goto L252;
152 }
153 lldst[op] = (short) (min(4095,np) + 16384);
154 ++op;
155 /* L251: */
156 np += -4095;
157 goto L250;
158 L252:
159 L91:
160 x1 = ip + 1;
161 iz = x1;
162 pv = nv;
163 L120:
164 ;
165 }
166 /* L121: */
167 lldst[4] = (short) ((op - 1) % 32768);
168 lldst[5] = (short) ((op - 1) / 32768);
169 ret_val = op - 1;
170 goto L100;
171 L100:
172 return ret_val;
173 } /* plp2li_ */
174
175 /*
176 * PL_L2PI -- Translate a PLIO line list into an integer pixel array.
177 * The number of pixels output (always npix) is returned as the function
178 * value.
179 *
180 * Translated from the SPP version using xc -f, f2c. 8Sep99 DCT.
181 */
182
pl_l2pi(short * ll_src,int xs,int * px_dst,int npix)183 int pl_l2pi (short *ll_src, int xs, int *px_dst, int npix)
184 /* short *ll_src; encoded line list */
185 /* int xs; starting index in ll_src */
186 /* int *px_dst; output pixel array */
187 /* int npix; number of pixels to convert */
188 {
189 /* System generated locals */
190 int ret_val, i__1, i__2;
191
192 /* Local variables */
193 int data, sw0001, otop, i__, lllen, i1, i2, x1, x2, ip, xe, np,
194 op, pv, opcode, llfirt;
195 int skipwd;
196
197 /* Parameter adjustments */
198 --px_dst;
199 --ll_src;
200
201 /* Function Body */
202 if (! (ll_src[3] > 0)) {
203 goto L110;
204 }
205 lllen = ll_src[3];
206 llfirt = 4;
207 goto L111;
208 L110:
209 lllen = (ll_src[5] << 15) + ll_src[4];
210 llfirt = ll_src[2] + 1;
211 L111:
212 if (! (npix <= 0 || lllen <= 0)) {
213 goto L120;
214 }
215 ret_val = 0;
216 goto L100;
217 L120:
218 xe = xs + npix - 1;
219 skipwd = 0;
220 op = 1;
221 x1 = 1;
222 pv = 1;
223 i__1 = lllen;
224 for (ip = llfirt; ip <= i__1; ++ip) {
225 if (! skipwd) {
226 goto L140;
227 }
228 skipwd = 0;
229 goto L130;
230 L140:
231 opcode = ll_src[ip] / 4096;
232 data = ll_src[ip] & 4095;
233 sw0001 = opcode;
234 goto L150;
235 L160:
236 x2 = x1 + data - 1;
237 i1 = max(x1,xs);
238 i2 = min(x2,xe);
239 np = i2 - i1 + 1;
240 if (! (np > 0)) {
241 goto L170;
242 }
243 otop = op + np - 1;
244 if (! (opcode == 4)) {
245 goto L180;
246 }
247 i__2 = otop;
248 for (i__ = op; i__ <= i__2; ++i__) {
249 px_dst[i__] = pv;
250 /* L190: */
251 }
252 /* L191: */
253 goto L181;
254 L180:
255 i__2 = otop;
256 for (i__ = op; i__ <= i__2; ++i__) {
257 px_dst[i__] = 0;
258 /* L200: */
259 }
260 /* L201: */
261 if (! (opcode == 5 && i2 == x2)) {
262 goto L210;
263 }
264 px_dst[otop] = pv;
265 L210:
266 L181:
267 op = otop + 1;
268 L170:
269 x1 = x2 + 1;
270 goto L151;
271 L220:
272 pv = (ll_src[ip + 1] << 12) + data;
273 skipwd = 1;
274 goto L151;
275 L230:
276 pv += data;
277 goto L151;
278 L240:
279 pv -= data;
280 goto L151;
281 L250:
282 pv += data;
283 goto L91;
284 L260:
285 pv -= data;
286 L91:
287 if (! (x1 >= xs && x1 <= xe)) {
288 goto L270;
289 }
290 px_dst[op] = pv;
291 ++op;
292 L270:
293 ++x1;
294 goto L151;
295 L150:
296 ++sw0001;
297 if (sw0001 < 1 || sw0001 > 8) {
298 goto L151;
299 }
300 switch ((int)sw0001) {
301 case 1: goto L160;
302 case 2: goto L220;
303 case 3: goto L230;
304 case 4: goto L240;
305 case 5: goto L160;
306 case 6: goto L160;
307 case 7: goto L250;
308 case 8: goto L260;
309 }
310 L151:
311 if (! (x1 > xe)) {
312 goto L280;
313 }
314 goto L131;
315 L280:
316 L130:
317 ;
318 }
319 L131:
320 i__1 = npix;
321 for (i__ = op; i__ <= i__1; ++i__) {
322 px_dst[i__] = 0;
323 /* L290: */
324 }
325 /* L291: */
326 ret_val = npix;
327 goto L100;
328 L100:
329 return ret_val;
330 } /* pll2pi_ */
331
332