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
|
include <mach.h>
include "../export.h"
# EX_PGM - Write the evaluated expressions as a PGM format file.
procedure ex_pgm (ex)
pointer ex #i task struct pointer
pointer sp, hdr
int len, flags
int strlen()
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 PGM file.")
if (bitset(flags, OF_LINE) || bitset (flags, LINE_STORAGE))
call error (7, "Line storage illegal for PGM file.")
# Write the header to the file.
call smark (sp)
call salloc (hdr, SZ_LINE, TY_CHAR)
call aclrc (Memc[hdr], SZ_LINE)
call sprintf (Memc[hdr], SZ_LINE, "P5\n%-6d %-6d\n255\n")
call pargi (EX_OCOLS(ex) - mod (EX_OCOLS(ex),2))
call pargi (EX_OROWS(ex))
len = strlen (Memc[hdr])
call strpak (Memc[hdr], Memc[hdr], SZ_LINE)
call write (EX_FD(ex), Memc[hdr], len/SZB_CHAR)
call sfree (sp)
# Fix the output pixel type to single bytes.
call ex_do_outtype (ex, "b1")
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)
else
call error (7, "Shouldn't be here.")
end
|