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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <imhdr.h>
include <mach.h>
include <gset.h>
include <error.h>
include "wdes.h"
include "crtpict.h"
# CRT_MAP_IMAGE -- Output a scaled image window to the device viewport.
# Spatial scaling is handled by the "scaled input" package, SIGL2[SR]; it is
# possible to scale the image window to a block averaged device viewport.
# Image intensities are converted to greyscale values and the input NDC
# coordinates are "tweaked" to make sure they represent integer device pixels.
# This tweaking also insures an integer replication factor between image
# pixels and device pixels. Type short pixels are treated as a special
# case to minimize vector operations.
procedure crt_map_image (im, gp, px1,px2,py1,py2, ndc_xs,ndc_xe,ndc_ys,ndc_ye,
nx_output, ny_output, z1,z2,zt, cl)
pointer im # input image
pointer gp # graphics descriptor
real px1,px2,py1,py2 # input section
real ndc_xs,ndc_xe,ndc_ys,ndc_ye # NDC of output section
int nx_output, ny_output # Number of output pixels. Image pixels
# are scaled to these dimensions.
real z1,z2 # range of intensities to be mapped.
int zt # specified greyscale transform type
pointer cl # Pointer to crtpict structure
bool unitary_greyscale_transformation
pointer in, si, sline, rline, llut, sp
short sz1, sz2, sdz1, sdz2, lut1, lut2
real dz1, dz2, y1, y2, delta_y
int ndev_cols, ndev_rows, nline, ny_device
int xblk, yblk
bool ggetb(), fp_equalr()
int ggeti()
real ggetr()
pointer sigl2s(), sigl2r(), sigl2_setup()
errchk sigl2s, sigl2r, sigl2_setup, ndc_tweak_ndc, ggeti, malloc, ggetr
errchk ggetb, ggetr, gpcell, crt_ulut
begin
call smark (sp)
call salloc (sline, nx_output, TY_SHORT)
if (IM_PIXTYPE(im) != TY_SHORT)
call salloc (rline, nx_output, TY_REAL)
# Calculate and allocate heap space needed for an image row.
ndev_cols = ggeti (gp, "xr")
ndev_rows = ggeti (gp, "yr")
ny_device = ((ndc_ye * ndev_rows) - (ndc_ys * ndev_rows)) + 1
# This sets up for the scaled image input
xblk = INDEFI
yblk = INDEFI
si = sigl2_setup (im, px1,px2,nx_output,xblk, py1,py2,ny_output,yblk)
# If user has supplied look up table, it has to be dealt with at
# this point. Greyscale transform is coming up, and the transfer
# function will be plotted at a later step.
if (zt == W_USER) {
iferr (call crt_ulut (UFILE(cl), z1, z2, llut))
call erract (EA_FATAL)
LUT(cl) = llut
call alims (Mems[llut], SZ_BUF, lut1, lut2)
}
# If device can't output greyscale information, return at this point.
if (! ggetb (gp, "zr")) {
call eprintf ("Graphics device doesn't support greyscale output\n")
return
}
# Determine the device range for the greyscale transformation.
if (ggetb (gp, "z1") && ggetb (gp, "z2")) {
dz1 = ggetr (gp, "z1")
dz2 = ggetr (gp, "z2")
} else {
dz1 = 0.
dz2 = 255.
}
# And now a quick test to make sure user specified greyscale and
# intensity ranges are reasonable.
if (zt == W_USER) {
sdz1 = short (dz1)
sdz2 = short (dz2)
if (lut2 < sdz1 || lut1 > sdz2)
call eprintf ("User specified greyscales out of range\n")
if (z2 < IM_MIN(im) || z1 > IM_MAX(im))
call eprintf ("User specified intensities out of range\n")
}
if (zt == W_UNITARY)
unitary_greyscale_transformation = true
else
unitary_greyscale_transformation =
(fp_equalr (dz1,z1) && fp_equalr (dz2,z2)) || fp_equalr (z1,z2)
# Calculate the delta_y, that is, the change in ndc coordinate
# with each output row. It has been assurred by tweak_ndc that
# the ratio of device rows to output pixels is an integer.
delta_y = (real (ny_device) / ny_output) / real (ndev_rows)
# For TY_SHORT pixels, pixel intensities are converted to greyscale
# values, then output with gpcell.
if (IM_PIXTYPE(im) == TY_SHORT) {
for (nline=1; nline <= ny_output; nline=nline+1) {
in = sigl2s (si, nline)
if (unitary_greyscale_transformation)
call amovs (Mems[in], Mems[sline], nx_output)
else if (zt == W_LINEAR) {
sz1 = short (z1)
sz2 = short (z2)
sdz1 = short (dz1)
sdz2 = short (dz2)
call amaps (Mems[in], Mems[sline], nx_output, sz1, sz2,
sdz1, sdz2)
} else if (zt == W_USER) {
sz1 = short (z1)
sz2 = short (z2)
sdz1 = short (STARTPT)
sdz2 = short (ENDPT)
call amaps (Mems[in], Mems[sline], nx_output, sz1, sz2,
sdz1, sdz2)
call aluts (Mems[sline], Mems[sline], nx_output, Mems[llut])
}
# Now put line out to greyscale device
y1 = ndc_ys + (nline - 1) * delta_y
y2 = ndc_ys + (nline * delta_y)
call gpcell (gp, Mems[sline], nx_output, 1, ndc_xs, y1, ndc_xe,
y2)
}
} else {
# Pixels are treated as TY_REAL; intensities are converted to
# greyscale values, then converted to TY_SHORT for gpcell output.
for (nline=1; nline <= ny_output; nline=nline+1) {
in = sigl2r (si, nline)
if (unitary_greyscale_transformation) {
call amovr (Memr[in], Memr[rline], nx_output)
call achtrs (Memr[rline], Mems[sline], nx_output)
} else if (zt == W_LINEAR) {
call amapr (Memr[in], Memr[rline], nx_output, z1, z2, dz1,
dz2)
call achtrs (Memr[rline], Mems[sline], nx_output)
} else if (zt == W_USER) {
call amapr (Memr[in], Memr[rline], nx_output, z1, z2,
STARTPT, ENDPT)
call achtrs (Memr[rline], Mems[sline], nx_output)
call aluts (Mems[sline], Mems[sline], nx_output, Mems[llut])
}
# Output line to greyscale device
y1 = ndc_ys + (nline - 1) * delta_y
y2 = ndc_ys + (nline * delta_y)
call gpcell (gp, Mems[sline], nx_output, 1, ndc_xs, y1,
ndc_xe, y2)
}
}
# Free allocate memory
call sigl2_free (si)
call sfree (sp)
end
|