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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <imhdr.h>
.help imdwcs
.nf -------------------------------------------------------------------------
IMDWCS -- Simple interim WCS package for the display interface. This is a
restricted use interface which will be obsoleted by a future interface.
iw = iw_open (ds, frame, imname, sz_imname, status)
iw_fb2im (iw, fb_x,fb_y, im_x,im_y)
iw_im2fb (iw, im_x,im_y, fb_x,fb_y)
iw_close (iw)
This facility uses the WCSDIR file mechanism to retrieve the WCS information
for a display frame. The display name is given by the current value of the
'stdimage' environment variable. Although the WCSDIR info supports a full
2D rotation matrix we recognize only scale and shift terms here.
NOTE -- The frame buffer coordinates used here are defined in the coordinate
system of the DISPLAY program, IMD_MAPFRAME, etc., i.e., the origin is at the
lower left corner of the frame, and the system is one-indexed. The WCS file,
on the other hand, stores device frame buffer coordinates, which are zero
indexed with the origin at the upper left.
.endhelp --------------------------------------------------------------------
define LEN_IWDES 6
define IW_A Memr[P2R($1)] # x scale
define IW_B Memr[P2R($1+1)] # cross term (not used)
define IW_C Memr[P2R($1+2)] # cross term (not used)
define IW_D Memr[P2R($1+3)] # y scale
define IW_TX Memr[P2R($1+4)] # x shift
define IW_TY Memr[P2R($1+5)] # y shift
# IW_OPEN -- Retrieve the WCS information for the given frame of the stdimage
# display device. If the WCS for the frame cannot be accessed for any reason
# a unitary transformation is returned and wcs_status is set to ERR. Note that
# this is not a hard error, i.e., a valid descriptor is still returned.
pointer procedure iw_open (ds, frame, imname, sz_imname, wcs_status)
pointer ds #I display image descriptor
int frame #I frame number for which WCS is desired
char imname[ARB] #O receives name of image loaded into frame (if any)
int sz_imname #I max chars out to imname[].
int wcs_status #O ERR if WCS cannot be accessed, OK otherwise
pointer iw
int server
char junk[1]
int imd_getwcs()
errchk calloc
begin
call calloc (iw, LEN_IWDES, TY_STRUCT)
# Get the WCS.
server = IM_LEN(ds,4)
wcs_status = imd_getwcs (frame, server, imname, sz_imname, junk,0,
IW_A(iw), IW_B(iw), IW_C(iw), IW_D(iw), IW_TX(iw), IW_TY(iw))
# Avoid divide by zero problems if invalid WCS.
if (abs(IW_A(iw)) < .0001 || abs(IW_D(iw)) < .0001) {
IW_A(iw) = 1.0; IW_D(iw) = 1.0
IW_TX(iw) = 0.0; IW_TY(iw) = 0.0
wcs_status = ERR
} else {
# Convert hardware FB to display FB coordinates.
IW_TY(iw) = IW_TY(iw) + (IW_D(iw) * (IM_LEN(ds,2)-1))
IW_D(iw) = -IW_D(iw)
}
return (iw)
end
# IW_FB2IM -- Convert frame buffer coordinates to image pixel coordinates.
procedure iw_fb2im (iw, fb_x,fb_y, im_x,im_y)
pointer iw #I imd wcs descriptor
real fb_x,fb_y #I frame buffer X,Y coordinates
real im_x,im_y #O image pixel X,Y coordinates
begin
im_x = (fb_x - 1) * IW_A(iw) + IW_TX(iw)
im_y = (fb_y - 1) * IW_D(iw) + IW_TY(iw)
end
# IW_IM2FB -- Convert image pixel coordinates to frame buffer coordinates.
procedure iw_im2fb (iw, im_x,im_y, fb_x,fb_y)
pointer iw #I imd wcs descriptor
real im_x,im_y #I image pixel X,Y coordinates
real fb_x,fb_y #O frame buffer X,Y coordinates
begin
fb_x = (im_x - IW_TX(iw)) / IW_A(iw) + 1
fb_y = (im_y - IW_TY(iw)) / IW_D(iw) + 1
end
# IW_CLOSE -- Close the IW descriptor.
procedure iw_close (iw)
pointer iw #I imd wcs descriptor
begin
call mfree (iw, TY_STRUCT)
end
|