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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <error.h>
include <gset.h>
include <config.h>
include <mach.h>
include <imhdr.h>
include <xwhen.h>
include <fset.h>
define DUMMY 6
define SAMPLE_SIZE 1000
define LEN_STDLINE 40
# HAFTON -- Draw a half tone plot of an image section. This is an
# interface to the NCAR HAFTON routine.
procedure t_hafton()
int sign
bool sub, pre
pointer im, subras, gp
int tcojmp[LEN_JUMPBUF]
char imsect[SZ_FNAME], mapping_function[SZ_FNAME]
char device[SZ_FNAME], title[SZ_LINE], system_id[SZ_LINE]
int ncols, nlines, epa, status, wkid, mode, old_onint
int nlevels, nprm, nopt, xres, yres, nfunction, nx, ny
real z1, z2, wx1, wx2, wy1, wy2, contrast
real xs, xe, ys, ye, vx1, vx2, vy1, vy2
real clgetr()
extern hf_tco_onint()
int clgeti(), strncmp()
pointer gopen(), plt_getdata(), immap()
bool clgetb(), fp_equalr(), streq()
common /tcocom/ tcojmp
begin
# Get image section string and output device.
call clgstr ("image", imsect, SZ_FNAME)
call clgstr ("device", device, SZ_FNAME)
# Map image.
im = immap (imsect, READ_ONLY, 0)
z1 = clgetr ("z1")
z2 = clgetr ("z2")
# Gaurantee that image min/max is up to date
if (IM_LIMTIME(im) < IM_MTIME(im))
call hf_minmax (im, IM_MIN(im), IM_MAX(im))
if (fp_equalr (z1, z2)) {
z1 = IM_MIN(im)
z2 = IM_MAX(im)
}
# User can specify the type of mapping function used, and whether
# the contrast is negative or positive.
nlevels = clgeti ("nlevels")
contrast = clgetr ("contrast")
call clgstr ("mapping_function", mapping_function, SZ_FNAME)
# Assign integer code to specified mapping function
if (strncmp (mapping_function, "linear", 2) == 0)
nfunction = 1
else if (strncmp (mapping_function, "exponential", 1) == 0)
nfunction = 2
else if (strncmp (mapping_function, "logarithmic", 2) == 0)
nfunction = 3
else if (strncmp (mapping_function, "sinusoidal", 1) == 0)
nfunction = 4
else if (strncmp (mapping_function, "arcsine", 1) == 0)
nfunction = 5
else if (strncmp (mapping_function, "crtpict", 1) == 0)
nfunction = 6
else
call error (0, "Hafton: unknown mapping function")
sign = 1.0
if (contrast < 0.0)
sign = -1.0
nopt = sign * nfunction
mode = NEW_FILE
if (clgetb ("append"))
mode = APPEND
# Read in subraster. Image resolution can be decreased by
# subsampling or block averaging.
xres = clgeti ("xres")
yres = clgeti ("yres")
sub = clgetb ("subsample")
pre = clgetb ("preserve")
# Retrieve values from image header that will be needed.
ncols = IM_LEN(im,1)
nlines = IM_LEN(im,2)
if (streq (title, "imtitle")) {
call strcpy (imsect, title, SZ_LINE)
call strcat (": ", title, SZ_LINE)
call strcat (IM_TITLE(im), title, SZ_LINE)
}
xs = 1.0
xe = real (ncols)
ys = 1.0
ye = real (nlines)
# Get data with proper resolution. Procedure plt_getdata returns
# a pointer to the data matrix to be contoured. The resolution
# is decreased by the specified mathod in this procedure. The
# dimensions of the data array are also returned. The image
# header pointer can be unmapped after plt_getdata is called.
nx = 0
ny = 0
subras = plt_getdata (im, sub, pre, xres, yres, nx, ny)
if (nfunction == 6) {
# User wants crtpict automatic algorithm - linear mapping
# between calculated z1, z2 using possible non-integer contrast.
# Get z1, z2 as if positive contrast. Set nopt later to negative
# if necessary.
call zscale (im, z1, z2, abs(contrast), SAMPLE_SIZE, LEN_STDLINE)
}
call eprintf ("Intensities from z1=%.2f to z2=%.2f mapped with a")
call pargr (z1)
call pargr (z2)
switch (nfunction) {
case (1):
call eprintf (" linear function\n")
case (2):
call eprintf ("n exponential function\n")
case (3):
call eprintf (" logarithmic function\n")
case (4):
call eprintf (" sinusodial function\n")
case (5):
call eprintf ("n arcsine function\n")
case (6):
call eprintf (" CRTPICT function\n")
if (nopt > 0) {
# Positive contrast. Set nopt to positive linear mapping.
nopt = 1
} else {
# Negative contrast. Set nopt to negative linear mapping.
nopt = -1
}
}
vx1 = clgetr ("vx1")
vx2 = clgetr ("vx2")
vy1 = clgetr ("vy1")
vy2 = clgetr ("vy2")
# Open device and make contour plot.
call gopks (STDERR)
wkid = 1
gp = gopen (device, mode, STDGRAPH)
call gopwk (wkid, DUMMY, gp)
call gacwk (wkid)
call pl_map_viewport (gp,
ncols, nlines, vx1, vx2, vy1, vy2, clgetb ("fill"), true)
nprm = -1
# Install interrupt exception handler.
call zlocpr (hf_tco_onint, epa)
call xwhen (X_INT, epa, old_onint)
# Make the hafton plot. If an interrupt occurs ZSVJMP is reentered
# with an error status.
call zsvjmp (tcojmp, status)
if (status == OK) {
call hafton (Memr[subras], nx, nx, ny, z1, z2,
nlevels, nopt, nprm, 0, 0.)
} else {
call gcancel (gp)
call fseti (STDOUT, F_CANCEL, OK)
}
# Should a fancy (crtpict like) perimeter be drawn around the plot?
if (clgetb ("perimeter")) {
call gswind (gp, xs, xe, ys, ye)
call draw_perimeter (gp)
} else
call perim (1, ncols - 1, nlines - 1, 1)
# Now find window and output text string title. The window is
# set to the full image coordinates for labelling.
call ggview (gp, wx1, wx2, wy1, wy2)
call gseti (gp, G_WCS, 0)
call gtext (gp, (wx1 + wx2) / 2.0, wy2 + .03, title, "h=c;v=b;f=b;s=.7")
# Add system id banner to plot.
call gseti (gp, G_CLIP, NO)
call sysid (system_id, SZ_LINE)
call gtext (gp, (wx1+wx2)/2.0, wy1-0.07, system_id, "h=c;v=b;s=.5")
call gdawk (wkid)
call gclwk (wkid)
call gclks ()
call imunmap (im)
# Free space used for scaled input routines.
call mfree (subras, TY_REAL)
end
# HF_TCO_ONINT -- Interrupt handler for the task hafton. Branches back to
# ZSVJMP in the main routine to permit shutdown without an error message.
procedure hf_tco_onint (vex, next_handler)
int vex # virtual exception
int next_handler # not used
int tcojmp[LEN_JUMPBUF]
common /tcocom/ tcojmp
begin
call xer_reset()
call zdojmp (tcojmp, vex)
end
# HF_MINMAX -- Compute the minimum and maximum pixel values of an image.
# Works for images of any dimensionality, size, or datatype, although
# the min and max values can currently only be stored in the image header
# as real values.
procedure hf_minmax (im, min_value, max_value)
pointer im # image descriptor
real min_value # minimum pixel value in image (out)
real max_value # maximum pixel value in image (out)
pointer buf
bool first_line
long v[IM_MAXDIM]
short minval_s, maxval_s
long minval_l, maxval_l
real minval_r, maxval_r
int imgnls(), imgnll(), imgnlr()
errchk amovkl, imgnls, imgnll, imgnlr, alims, aliml, alimr
begin
call amovkl (long(1), v, IM_MAXDIM) # start vector
first_line = true
min_value = INDEF
max_value = INDEF
switch (IM_PIXTYPE(im)) {
case TY_SHORT:
while (imgnls (im, buf, v) != EOF) {
call alims (Mems[buf], IM_LEN(im,1), minval_s, maxval_s)
if (first_line) {
min_value = minval_s
max_value = maxval_s
first_line = false
} else {
if (minval_s < min_value)
min_value = minval_s
if (maxval_s > max_value)
max_value = maxval_s
}
}
case TY_USHORT, TY_INT, TY_LONG:
while (imgnll (im, buf, v) != EOF) {
call aliml (Meml[buf], IM_LEN(im,1), minval_l, maxval_l)
if (first_line) {
min_value = minval_l
max_value = maxval_l
first_line = false
} else {
if (minval_l < min_value)
min_value = minval_l
if (maxval_l > max_value)
max_value = maxval_l
}
}
default:
while (imgnlr (im, buf, v) != EOF) {
call alimr (Memr[buf], IM_LEN(im,1), minval_r, maxval_r)
if (first_line) {
min_value = minval_r
max_value = maxval_r
first_line = false
} else {
if (minval_r < min_value)
min_value = minval_r
if (maxval_r > max_value)
max_value = maxval_r
}
}
}
end
|