aboutsummaryrefslogtreecommitdiff
path: root/pkg/dataio/export/bltins/expgm.x
blob: c8a7a1d7f75203f30057041524f94201ffbdf365 (plain) (blame)
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