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
|
include <mach.h>
include "../export.h"
# EX_MIFF - Write the evaluated expressions as an ImageMagick MIFF format file.
procedure ex_miff (ex)
pointer ex #i task struct pointer
pointer sp, hdr, cmap
int i, j, flags
char ncols[6]
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 && EX_NEXPR(ex) != 1)
call error (7, "Invalid number of expressions for MIFF file.")
if (bitset(flags, OF_LINE) || bitset (flags, LINE_STORAGE))
call error (7, "Line storage illegal for MIFF file.")
# Write the header to the file.
call smark (sp)
call salloc (hdr, SZ_COMMAND, TY_CHAR)
call aclrc (Memc[hdr], SZ_COMMAND)
call sprintf (ncols, 6, "%d")
call pargi (EX_NCOLORS(ex))
call sprintf (Memc[hdr], SZ_COMMAND,
"{\nCreated by IRAF EXPORT Task\n}\nid=ImageMagick\nclass=%s %s%s\ncolumns=%-5d rows=%-5d\n\f\n:\n")
if (EX_NEXPR(ex) == 3) {
call pargstr ("DirectClass")
call pargstr ("")
call pargstr ("")
} else {
call pargstr ("PseudoClass")
if (bitset (flags,OF_CMAP)) {
call pargstr ("colors=")
call pargstr (ncols)
} else {
call pargstr ("")
call pargstr ("")
}
}
call pargi (EX_OCOLS(ex))
call pargi (EX_OROWS(ex))
if (mod(strlen(Memc[hdr]),2) == 1)
call strcat ("\n", Memc[hdr], SZ_COMMAND)
call strpak (Memc[hdr], Memc[hdr], SZ_COMMAND)
call write (EX_FD(ex), Memc[hdr], strlen(Memc[hdr])/SZB_CHAR)
# Finally, evaluate the expressions and write the image.
call ex_do_outtype (ex, "b1")
EX_OUTFLAGS(ex) = or (EX_OUTFLAGS(ex), OF_FLIPY)
if (bitset (flags,OF_CMAP)) {
# Write out the colormap.
call salloc (cmap, 3*CMAP_SIZE, TY_CHAR)
j = 1
do i = 0, (3*CMAP_SIZE-1), 3 {
Memc[cmap+i+0] = CMAP(EX_CMAP(ex), EX_RED, j)
Memc[cmap+i+1] = CMAP(EX_CMAP(ex), EX_GREEN, j)
Memc[cmap+i+2] = CMAP(EX_CMAP(ex), EX_BLUE, j)
j = j + 1
}
call achtcb (Memc[cmap], Memc[cmap], (3 * CMAP_SIZE))
call write (EX_FD(ex), Memc[cmap], ((3 * CMAP_SIZE) / SZB_CHAR))
call ex_no_interleave (ex) # write the pixels
} else
call ex_px_interleave (ex)
call sfree (sp)
end
|