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
|
include <mach.h>
include "../export.h"
define SZ_VICHDR 1024
# EX_VICAR - Write the evaluated expressions as a VICAR2 format file.
procedure ex_vicar (ex)
pointer ex #i task struct pointer
pointer sp, hdr, user, date, arch
int i, flags
char space
int envfind(), strncmp(), strlen()
long clktime()
begin
# Check to see that we have the correct number of expressions to
# write this format.
flags = EX_OUTFLAGS(ex)
if (EX_NEXPR(ex) != 1 && !bitset(flags, OF_BAND))
call error (7, "Invalid number of expressions for VICAR file.")
if (bitset(flags, OF_LINE) || bitset (flags, LINE_STORAGE))
call error (7, "Line storage illegal for VICAR file.")
# Write the header to the file.
call smark (sp)
call salloc (hdr, SZ_VICHDR, TY_CHAR)
call salloc (user, SZ_FNAME, TY_CHAR)
call salloc (date, SZ_FNAME, TY_CHAR)
call salloc (arch, SZ_FNAME, TY_CHAR)
space = ' '
call amovkc (space, Memc[hdr], SZ_VICHDR)
call aclrc (Memc[user], SZ_FNAME)
call aclrc (Memc[date], SZ_FNAME)
call aclrc (Memc[arch], SZ_FNAME)
# Header keywords:
call getuid (Memc[user], SZ_FNAME)
call cnvtime (clktime(long(0)), Memc[date], SZ_FNAME)
call sprintf (Memc[hdr], SZ_VICHDR,
"LBLSIZE=%d FORMAT='%s' TYPE='IMAGE' BUFSIZ=20480 DIM=3 EOL=0 RECSIZE=%d ORG='%s' NL=%d NS=%d NB=%d N1=%d N2=%d N3=%d N4=0 NBB=0 NLB=0 INTFMT='%s' REALFMT='%s' TASK='EXPORT' USER='%s' DAT_TIM='%s' ")
call pargi (SZ_VICHDR) # LBLSIZE
switch (EX_OUTTYPE(ex)) { # FORMAT
case TY_UBYTE: call pargstr ("BYTE")
case TY_SHORT: call pargstr ("HALF")
case TY_INT: call pargstr ("FULL")
case TY_LONG: call pargstr ("FULL")
case TY_REAL: call pargstr ("REAL")
case TY_DOUBLE: call pargstr ("DOUB")
}
call pargi (EX_OCOLS(ex)) # RECSIZE
if (bitset(flags, OF_LINE) || bitset (flags, LINE_STORAGE))
call pargstr ("BIL") # ORG
else
call pargstr ("BSQ")
call pargi (EX_OROWS(ex)) # NL
call pargi (EX_OCOLS(ex)) # NS
call pargi (EX_NEXPR(ex)) # NB
call pargi (EX_OCOLS(ex)) # N1
call pargi (EX_OROWS(ex)) # N2
call pargi (EX_NEXPR(ex)) # N3
if (BYTE_SWAP2 == NO)
call pargstr ("HIGH") # INTFMT
else
call pargstr ("LOW")
if (IEEE_USED == YES) { # REALFMT
if (envfind ("arch", Memc[arch], SZ_FNAME) != ERR) {
# If this is a DECstation we have a different IEEE.
if (strncmp(Memc[arch], ".d", 2) == 0)
call pargstr ("RIEEE")
else
call pargstr ("IEEE")
}
} else {
# Assume it's a VAX.
call pargstr ("VAX")
}
call pargstr (Memc[user]) # USER
call pargstr (Memc[date]) # DAT_TIM
i = SZ_VICHDR
while (Memc[hdr+i-1] != EOS && i > 0)
i = i - 1
Memc[hdr+i-1] = ' '
call strpak (Memc[hdr], Memc[hdr], SZ_VICHDR)
call write (EX_FD(ex), Memc[hdr], strlen(Memc[hdr])/SZB_CHAR)
call sfree (sp)
# Fix the output pixel type to single bytes.
switch (EX_OUTTYPE(ex)) {
case TY_UBYTE: call ex_do_outtype (ex, "b1")
case TY_SHORT: call ex_do_outtype (ex, "i2")
case TY_INT: call ex_do_outtype (ex, "i4")
case TY_LONG: call ex_do_outtype (ex, "i4")
case TY_REAL: call ex_do_outtype (ex, "n4")
case TY_DOUBLE: call ex_do_outtype (ex, "n8")
}
EX_OUTFLAGS(ex) = or (EX_OUTFLAGS(ex), OF_FLIPY)
# Finally, evaluate the expressions and write the image.
if (EX_NEXPR(ex) == 1 || bitset (flags, OF_BAND))
call ex_no_interleave (ex)
end
|