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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <error.h>
include <imhdr.h>
# IC_IMSTACK -- Stack images into a single image of higher dimension.
procedure ic_imstack (list, output)
int list #I List of images
char output #I Name of output image
int i, j, npix
long line_in[IM_MAXDIM], line_out[IM_MAXDIM]
pointer sp, input, key, in, out, buf_in, buf_out, ptr
int imtgetim(), imtlen()
int imgnls(), imgnli(), imgnll(), imgnlr(), imgnld(), imgnlx()
int impnls(), impnli(), impnll(), impnlr(), impnld(), impnlx()
pointer immap()
errchk immap
begin
call smark (sp)
call salloc (input, SZ_FNAME, TY_CHAR)
call salloc (key, SZ_FNAME, TY_CHAR)
iferr {
# Add each input image to the output image.
out = NULL
i = 0
while (imtgetim (list, Memc[input], SZ_FNAME) != EOF) {
i = i + 1
in = NULL
ptr = immap (Memc[input], READ_ONLY, 0)
in = ptr
# For the first input image map the output image as a copy
# and increment the dimension. Set the output line counter.
if (i == 1) {
ptr = immap (output, NEW_COPY, in)
out = ptr
IM_NDIM(out) = IM_NDIM(out) + 1
IM_LEN(out, IM_NDIM(out)) = imtlen (list)
npix = IM_LEN(out, 1)
call amovkl (long(1), line_out, IM_MAXDIM)
}
# Check next input image for consistency with the output image.
if (IM_NDIM(in) != IM_NDIM(out) - 1)
call error (0, "Input images not consistent")
do j = 1, IM_NDIM(in) {
if (IM_LEN(in, j) != IM_LEN(out, j))
call error (0, "Input images not consistent")
}
call sprintf (Memc[key], SZ_FNAME, "stck%04d")
call pargi (i)
call imastr (out, Memc[key], Memc[input])
# Copy the input lines from the image to the next lines of
# the output image. Switch on the output data type to optimize
# IMIO.
call amovkl (long(1), line_in, IM_MAXDIM)
switch (IM_PIXTYPE (out)) {
case TY_SHORT:
while (imgnls (in, buf_in, line_in) != EOF) {
if (impnls (out, buf_out, line_out) == EOF)
call error (0, "Error writing output image")
call amovs (Mems[buf_in], Mems[buf_out], npix)
}
case TY_INT:
while (imgnli (in, buf_in, line_in) != EOF) {
if (impnli (out, buf_out, line_out) == EOF)
call error (0, "Error writing output image")
call amovi (Memi[buf_in], Memi[buf_out], npix)
}
case TY_USHORT, TY_LONG:
while (imgnll (in, buf_in, line_in) != EOF) {
if (impnll (out, buf_out, line_out) == EOF)
call error (0, "Error writing output image")
call amovl (Meml[buf_in], Meml[buf_out], npix)
}
case TY_REAL:
while (imgnlr (in, buf_in, line_in) != EOF) {
if (impnlr (out, buf_out, line_out) == EOF)
call error (0, "Error writing output image")
call amovr (Memr[buf_in], Memr[buf_out], npix)
}
case TY_DOUBLE:
while (imgnld (in, buf_in, line_in) != EOF) {
if (impnld (out, buf_out, line_out) == EOF)
call error (0, "Error writing output image")
call amovd (Memd[buf_in], Memd[buf_out], npix)
}
case TY_COMPLEX:
while (imgnlx (in, buf_in, line_in) != EOF) {
if (impnlx (out, buf_out, line_out) == EOF)
call error (0, "Error writing output image")
call amovx (Memx[buf_in], Memx[buf_out], npix)
}
default:
while (imgnlr (in, buf_in, line_in) != EOF) {
if (impnlr (out, buf_out, line_out) == EOF)
call error (0, "Error writing output image")
call amovr (Memr[buf_in], Memr[buf_out], npix)
}
}
call imunmap (in)
}
} then {
if (out != NULL) {
call imunmap (out)
call imdelete (out)
}
if (in != NULL)
call imunmap (in)
call sfree (sp)
call erract (EA_ERROR)
}
# Finish up.
call imunmap (out)
call sfree (sp)
end
|