aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/tv/display/imdputwcs.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/images/tv/display/imdputwcs.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'pkg/images/tv/display/imdputwcs.x')
-rw-r--r--pkg/images/tv/display/imdputwcs.x139
1 files changed, 139 insertions, 0 deletions
diff --git a/pkg/images/tv/display/imdputwcs.x b/pkg/images/tv/display/imdputwcs.x
new file mode 100644
index 00000000..a7b55c8c
--- /dev/null
+++ b/pkg/images/tv/display/imdputwcs.x
@@ -0,0 +1,139 @@
+include <imhdr.h>
+include <error.h>
+include <imset.h>
+include <fset.h>
+include "display.h"
+include "iis.h"
+
+
+# IMD_PUTWCS -- Write WCS.
+
+procedure imd_putwcs (ds, frame, str1, str2, a, b, c, d, tx, ty, z1, z2, ztr)
+pointer ds #I IMIO descriptor for image display.
+int frame #I Frame number for which WCS is to be set.
+char str1[ARB] #I First title string (image name).
+char str2[ARB] #I Second title string (image title).
+real a, d #I x, y scale factors.
+real b, c #I cross terms (rotations).
+real tx, ty #I x, y offsets.
+real z1, z2 #I min and maximum grey scale values.
+int ztr #I greyscale transformation code.
+
+pointer sp, old_wcs, mapping, wcstext, dir, fname, ftemp, device
+int wcsfile, server, chan[MAXCHAN]
+int fstati(), imstati(), envfind(), open(), strncmp()
+
+include "iis.com"
+
+begin
+ call smark (sp)
+ call salloc (old_wcs, SZ_WCSTEXT, TY_CHAR)
+ call salloc (mapping, SZ_WCSTEXT, TY_CHAR)
+ call salloc (wcstext, SZ_WCSTEXT, TY_CHAR)
+
+ # Format the WCS text.
+ call sprintf (Memc[old_wcs], SZ_WCSTEXT,
+ "%s - %s\n%g %g %g %g %g %g %g %g %d\n")
+ call pargstr (str1)
+ call pargstr (str2)
+ call pargr (a)
+ call pargr (b)
+ call pargr (c)
+ call pargr (d)
+ call pargr (tx)
+ call pargr (ty)
+ call pargr (z1)
+ call pargr (z2)
+ call pargi (ztr)
+
+ # Add the mapping information if it's valid and we have a capable
+ # server.
+ if (iis_version > 0 && iis_valid == YES) {
+ call sprintf (Memc[mapping], SZ_WCSTEXT,
+ "%s %g %g %d %d %d %d %d %d\n%s\n")
+ call pargstr (iis_region)
+ call pargr (iis_sx)
+ call pargr (iis_sy)
+ call pargi (iis_snx)
+ call pargi (iis_sny)
+ call pargi (iis_dx)
+ call pargi (iis_dy)
+ call pargi (iis_dnx)
+ call pargi (iis_dny)
+ call pargstr (iis_objref)
+
+ call sprintf (Memc[wcstext], SZ_WCSTEXT, "%s%s")
+ call pargstr (Memc[old_wcs])
+ call pargstr (Memc[mapping])
+ } else
+ call strcpy (Memc[old_wcs], Memc[wcstext], SZ_OLD_WCSTEXT)
+
+
+ # If we are writing to a display server (device has the logical
+ # cursor capability), output the WCS text via the datastream,
+ # else use a text file. The datastream set-WCS is also used to
+ # pass the frame buffer configuration to server devices.
+
+ server = IM_LEN (ds, 4)
+
+ if (server == YES) {
+ chan[1] = fstati (imstati (ds, IM_PIXFD), F_CHANNEL)
+ chan[2] = MONO
+ call imd_setwcs (chan, Memc[wcstext])
+
+ # Invalidate the mapping once it's been sent.
+ iis_valid = NO
+
+ } else {
+ # Construct the WCS filename, "dir$device_frame.wcs".
+ call salloc (dir, SZ_PATHNAME, TY_CHAR)
+ call salloc (fname, SZ_PATHNAME, TY_CHAR)
+ call salloc (ftemp, SZ_PATHNAME, TY_CHAR)
+ call salloc (device, SZ_FNAME, TY_CHAR)
+
+ 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 a temporary file in the WCS directory.
+ call sprintf (Memc[ftemp], SZ_PATHNAME, "%swcs")
+ call pargstr (Memc[dir])
+ call mktemp (Memc[ftemp], Memc[ftemp], SZ_PATHNAME)
+
+ # Make the final 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)
+
+ # Update the WCS file.
+ iferr (wcsfile = open (Memc[ftemp], TEMP_FILE, TEXT_FILE))
+ call erract (EA_WARN)
+ else {
+ # Now delete the old file, if any, and write the new one.
+ # To avoid process race conditions, create the new file as an
+ # atomic operation, first writing a new file and then renaming
+ # it to create the WCS file.
+
+ iferr (call delete (Memc[fname]))
+ ;
+
+ # Output the file version.
+ call putline (wcsfile, Memc[wcstext])
+ call close (wcsfile)
+
+ # Install the new file.
+ iferr (call rename (Memc[ftemp], Memc[fname]))
+ call erract (EA_WARN)
+ }
+ }
+
+ call sfree (sp)
+end