aboutsummaryrefslogtreecommitdiff
path: root/pkg/dataio/export/bltins/exppm.x
blob: 4dab472774895e98a27254830190b101d70ea1d6 (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
48
49
include <mach.h>
include "../export.h"


# EX_PPM - Write the evaluated expressions as a PPM format file.

procedure ex_ppm (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) != 3)
	    call error (7, "Invalid number of expressions for PPM file.")
	if (bitset(flags, OF_LINE) || bitset (flags, LINE_STORAGE))
	    call error (7, "Line storage illegal for PPM file.")

        # Write the header to the file.
        call smark (sp)
        call salloc (hdr, SZ_LINE, TY_CHAR)
        call aclrc (Memc[hdr], SZ_LINE)

	# If we have an odd number of pixels we can't correctly write the
	# last column to the file, so truncate the column in the output image.
        if (mod (EX_NCOLS(ex),2) == 1)
            EX_OCOLS(ex) = EX_OCOLS(ex) - 1

        call sprintf (Memc[hdr], SZ_LINE, "P6\n%-6d  %-6d\n255\n")
            call pargi (EX_OCOLS(ex))
            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.
	call ex_px_interleave (ex)
end