aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/tv/display/imdgetwcs.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/images/tv/display/imdgetwcs.x')
-rw-r--r--pkg/images/tv/display/imdgetwcs.x188
1 files changed, 188 insertions, 0 deletions
diff --git a/pkg/images/tv/display/imdgetwcs.x b/pkg/images/tv/display/imdgetwcs.x
new file mode 100644
index 00000000..57f432bc
--- /dev/null
+++ b/pkg/images/tv/display/imdgetwcs.x
@@ -0,0 +1,188 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <ctype.h>
+include "zdisplay.h"
+include "iis.h"
+
+# IMD_GETWCS -- Get the saved WCS for the given frame of the given display
+# device. (No great attempt at generality here).
+# [INTERNAL ROUTINE - RESTRICTED USE].
+#
+# Example:
+#
+# dev$pix - m51 B 600s
+# 1. 0. 0. -1. 1. 512. 36. 320.0713 1
+#
+# The file format is the image title, followed by a line specifying the
+# coordinate transformation matrix (6 numbers: a b c d tx ty) and the
+# greyscale transformation (z1 z2 zt).
+#
+# The procedure returns OK if the WCS for the frame is sucessfully accessed,
+# or ERR if the WCS cannot be read. In the latter case the output WCS will
+# be the default unitary WCS.
+
+int procedure imd_getwcs (frame, server, image, sz_image, title, sz_title,
+ a, b, c, d, tx, ty)
+
+int frame #I frame (wcs) number of current device
+int server #I device is a display server
+char image[ARB] #O image name
+int sz_image #I max image name length
+char title[ARB] #O image title string
+int sz_title #I max image title length
+real a, d #O x, y scale factors
+real b, c #O cross terms (rotations)
+real tx, ty #O x, y offsets
+
+char ch
+int fd, chan, status, wcs_status, zt
+real z1, z2
+pointer sp, dir, device, fname, wcstext
+int envfind(), strncmp(), open(), fscan(), nscan(), stropen(), iisflu()
+
+include "iis.com"
+
+begin
+ call smark (sp)
+ call salloc (dir, SZ_PATHNAME, TY_CHAR)
+ call salloc (fname, SZ_PATHNAME, TY_CHAR)
+ call salloc (device, SZ_FNAME, TY_CHAR)
+ call salloc (wcstext, SZ_WCSTEXT, TY_CHAR)
+
+ wcs_status = OK
+
+ # Retrieve the WCS text and open a file descriptor on it.
+
+ if (server == YES) {
+ # Retrieve the WCS information from a display server.
+ chan = iisflu(FRTOCHAN(frame))
+
+ # Cannot use iisio here as the data is byte packed and cannot be
+ # swapped (while the header still has to be swapped).
+
+ if (iis_version > 0) {
+ iis_valid = NO
+ call iishdr (IREAD+PACKED, SZ_WCSTEXT, WCS, 1, 0, chan, 0)
+ call iisio (Memc[wcstext], SZ_WCSTEXT, status)
+ if (status > 0)
+ call strupk (Memc[wcstext], Memc[wcstext], SZ_WCSTEXT)
+
+ iferr (fd = stropen (Memc[wcstext], SZ_WCSTEXT, READ_ONLY))
+ fd = NULL
+
+ } else {
+ call iishdr (IREAD+PACKED, SZ_OLD_WCSTEXT, WCS, 0, 0, chan, 0)
+ call iisio (Memc[wcstext], SZ_OLD_WCSTEXT, status)
+ if (status > 0)
+ call strupk (Memc[wcstext], Memc[wcstext], SZ_OLD_WCSTEXT)
+
+ iferr (fd = stropen (Memc[wcstext], SZ_OLD_WCSTEXT, READ_ONLY))
+ fd = NULL
+ }
+
+ } else {
+ # Construct the WCS filename, "dir$device_frame.wcs". (Copied from
+ # the make-WCS code in t_display.x).
+
+ if (envfind ("wcsdir", Memc[dir], SZ_PATHNAME) <= 0)
+ if (envfind ("WCSDIR", Memc[dir], SZ_PATHNAME) <= 0)
+ if (envfind ("uparm", Memc[dir], SZ_PATHNAME) <= 0)
+ call strcpy ("tmp$", Memc[dir], SZ_PATHNAME)
+
+ if (envfind ("stdimage", Memc[device], SZ_FNAME) <= 0)
+ call strcpy ("display", Memc[device], SZ_FNAME)
+
+ # Get the WCS file filename.
+ call sprintf (Memc[fname], SZ_PATHNAME, "%s%s_%d.wcs")
+ call pargstr (Memc[dir])
+ if (strncmp (Memc[device], "imt", 3) == 0)
+ call pargstr ("imtool")
+ else
+ call pargstr (Memc[device])
+ call pargi (frame)
+
+ if (sz_image > 0)
+ image[1] = EOS
+ if (sz_title > 0)
+ title[1] = EOS
+
+ # Get the saved WCS.
+ iferr (fd = open (Memc[fname], READ_ONLY, TEXT_FILE))
+ fd = NULL
+ }
+
+ # Decode the WCS from the WCS text.
+ if (fd != NULL) {
+ image[1] = EOS
+ title[1] = EOS
+
+ if (fscan (fd) != EOF) {
+ # Decode "image - title".
+ if (sz_image > 0)
+ call gargwrd (image, sz_image)
+ if (sz_title > 0) {
+ call gargwrd (title, sz_title)
+ repeat {
+ call gargc (ch)
+ } until (!IS_WHITE(ch))
+ title[1] = ch
+ call gargstr (title[2], sz_title - 1)
+ }
+
+ # Decode the WCS information.
+ if (fscan (fd) != EOF) {
+ call gargr (a)
+ call gargr (b)
+ call gargr (c)
+ call gargr (d)
+ call gargr (tx)
+ call gargr (ty)
+ call gargr (z1)
+ call gargr (z2)
+ call gargi (zt)
+ if (nscan() == 9)
+ wcs_status = OK
+
+ if (iis_version > 0) {
+ if (fscan (fd) != EOF) {
+ call gargstr (iis_region, SZ_FNAME)
+ call gargr (iis_sx)
+ call gargr (iis_sy)
+ call gargi (iis_snx)
+ call gargi (iis_sny)
+ call gargi (iis_dx)
+ call gargi (iis_dy)
+ call gargi (iis_dnx)
+ call gargi (iis_dny)
+ }
+ if (nscan() == 9) {
+ if (fscan (fd) != EOF)
+ call gargstr (iis_objref, SZ_FNAME)
+ if (nscan() == 1)
+ iis_valid = YES
+ } else
+ iis_valid = NO
+ } else {
+ if (nscan() != 9) {
+ # Set up the unitary transformation if we
+ # cannot retrieve the real one.
+ a = 1.0
+ b = 0.0
+ c = 0.0
+ d = 1.0
+ tx = 1.0
+ ty = 1.0
+ wcs_status = ERR
+ }
+ }
+ }
+ }
+ }
+
+
+ if (fd != NULL)
+ call close (fd)
+ call sfree (sp)
+
+ return (wcs_status)
+end