aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/tv/imexamine/iegimage.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/images/tv/imexamine/iegimage.x')
-rw-r--r--pkg/images/tv/imexamine/iegimage.x261
1 files changed, 261 insertions, 0 deletions
diff --git a/pkg/images/tv/imexamine/iegimage.x b/pkg/images/tv/imexamine/iegimage.x
new file mode 100644
index 00000000..b0fda919
--- /dev/null
+++ b/pkg/images/tv/imexamine/iegimage.x
@@ -0,0 +1,261 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <error.h>
+include <imhdr.h>
+include "imexam.h"
+
+# IE_GIMAGE -- Get input image name and return IMIO pointer.
+# If examining a list of images access the indexed image, displaying it if
+# not already displayed. Otherwise the image loaded into the current display
+# frame is displayed, if it can be accessed, or the image frame buffer itself
+# is examined. If there is neither a list of images nor display access the
+# user is queried for the name of the image to be examined.
+# This procedure uses a prototype display interface (IMD/IW).
+
+pointer procedure ie_gimage (ie, select)
+
+pointer ie #I IMEXAM pointer
+int select #I select frame?
+
+char errstr[SZ_FNAME]
+int frame, i, j, k
+pointer sp, image, dimage, imname, im
+
+int imtrgetim(), fnldir(), errget()
+bool strne(), streq()
+pointer imd_mapframe(), immap()
+errchk imd_mapframe, immap, ie_display, ie_mwinit
+
+
+begin
+ call smark (sp)
+ call salloc (image, SZ_FNAME, TY_CHAR)
+ call salloc (imname, SZ_FNAME, TY_CHAR)
+ call salloc (dimage, SZ_FNAME, TY_CHAR)
+
+ # Get image name, and display image if using display. If we are
+ # examining a list of images, the list and the current index into
+ # the list determine the image to be examined. If there is no list
+ # we examine the currently displayed images, if any, else the
+ # contents of the image display frame buffers are examined as images.
+
+ if (IE_LIST(ie) != NULL) {
+ # Get image name.
+ IE_INDEX(ie) = max(1, min(IE_LISTLEN(ie), IE_INDEX(ie)))
+ if (imtrgetim (IE_LIST(ie), IE_INDEX(ie), Memc[image],
+ SZ_FNAME) == EOF)
+ call error (1, "Reference outside of image list")
+
+ # Display image.
+ if (IE_USEDISPLAY(ie) == YES) {
+ # Is named image currently loaded into the image display?
+ frame = 0
+ if (streq (Memc[image], IE_IMAGE(ie)))
+ frame = IE_MAPFRAME(ie)
+ else {
+ if (IE_DS(ie) == NULL)
+ IE_DS(ie) = imd_mapframe (max (1, IE_NEWFRAME(ie)/100),
+ READ_WRITE, NO)
+
+ do i = 1, IE_NFRAMES(ie) {
+ if (i == IE_MAPFRAME(ie)/100)
+ next
+ do j = 1, 99 {
+ k = i * 100 + j
+ iferr (call ie_imname (IE_DS(ie), k,
+ Memc[dimage], SZ_FNAME))
+ break
+ if (streq (Memc[image], Memc[dimage])) {
+ frame = k
+ break
+ }
+ }
+ if (frame != 0)
+ break
+ }
+ }
+
+ # Load image into display frame if not already loaded.
+ # If the allframes option is specified cycle through the
+ # available display frames, otherwise resuse the same frame.
+
+ if (frame == 0) {
+ if (IE_DS(ie) != NULL) {
+ if (IE_IM(ie) == IE_DS(ie))
+ IE_IM(ie) = NULL
+ call imunmap (IE_DS(ie))
+ }
+
+ frame = 100 * max (1, IE_DFRAME(ie) / 100) + 1
+ call ie_display (ie, Memc[image], frame/100)
+
+ IE_MAPFRAME(ie) = 0
+ if (IE_ALLFRAMES(ie) == YES) {
+ IE_DFRAME(ie) = frame + 100
+ if (IE_DFRAME(ie)/100 > IE_NFRAMES(ie))
+ IE_DFRAME(ie) = 101
+ }
+ }
+
+ # Map and display-select the frame.
+ if (frame != IE_MAPFRAME(ie) || frame != IE_NEWFRAME(ie)) {
+ if (IE_DS(ie) != NULL) {
+ if (IE_IM(ie) == IE_DS(ie))
+ IE_IM(ie) = NULL
+ call imunmap (IE_DS(ie))
+ }
+ IE_DS(ie) = imd_mapframe (frame/100, READ_WRITE, select)
+ IE_MAPFRAME(ie) = frame
+ IE_NEWFRAME(ie) = frame
+ }
+ }
+
+ } else if (IE_USEDISPLAY(ie) == YES) {
+ # Map the new display frame.
+ if (IE_NEWFRAME(ie) != IE_MAPFRAME(ie)) {
+ if (IE_NEWFRAME(ie)/100 != IE_MAPFRAME(ie)/100) {
+ if (IE_DS(ie) != NULL) {
+ if (IE_IM(ie) == IE_DS(ie))
+ IE_IM(ie) = NULL
+ call imunmap (IE_DS(ie))
+ }
+ IE_DS(ie) = imd_mapframe (IE_NEWFRAME(ie)/100, READ_WRITE,
+ select)
+ }
+ IE_MAPFRAME(ie) = IE_NEWFRAME(ie)
+ }
+
+ # Get the image name.
+ call ie_imname (IE_DS(ie), IE_MAPFRAME(ie), Memc[image], SZ_FNAME)
+
+ } else
+ call clgstr ("image", Memc[image], SZ_FNAME)
+
+ # Check if the image has not been mapped and if so map it.
+ # Possibly log any change of image. Always map the physical image,
+ # not a section, since we do everything in image coordinates.
+
+ if (IE_IM(ie) == NULL || strne (Memc[image], IE_IMAGE(ie))) {
+
+ # Strip the path.
+ call imgcluster (Memc[image], Memc[imname], SZ_FNAME)
+ i = fnldir (Memc[imname], Memc[imname], SZ_FNAME)
+ call strcpy (Memc[image+i], IE_IMNAME(ie), IE_SZFNAME)
+
+ # Map the image.
+ iferr (im = immap (Memc[image], READ_ONLY, 0)) {
+ # Warn user once.
+ i = errget (Memc[imname], SZ_FNAME)
+ if (strne (Memc[imname], errstr)) {
+ call erract (EA_WARN)
+ call strcpy (Memc[imname], errstr, SZ_FNAME)
+ }
+
+ # Access the display frame buffer as the data image.
+ if (IE_USEDISPLAY(ie) == YES && IE_LIST(ie) == NULL) {
+ if (IE_IM(ie) != NULL && IE_IM(ie) != IE_DS(ie))
+ iferr (call imunmap (IE_IM(ie)))
+ ;
+ IE_IM(ie) = IE_DS(ie)
+ call sprintf (IE_IMAGE(ie), IE_SZFNAME, "Frame.%d(%s)")
+ call pargi (IE_MAPFRAME(ie))
+ call pargstr (IE_IMNAME(ie))
+ call strcpy ("Contents of raw image frame buffer\n",
+ IM_TITLE(IE_IM(ie)), SZ_IMTITLE)
+ } else
+ call erract (EA_WARN)
+
+ } else {
+ # Adjust image sections.
+ call ie_gimage1 (im, Memc[image], Memc[imname], SZ_FNAME)
+ if (strne (Memc[image], Memc[imname])) {
+ call imunmap (im)
+ im = immap (Memc[imname], READ_ONLY, 0)
+ }
+
+ # Make the new image the current one.
+ errstr[1] = EOS
+ call strcpy (Memc[image], IE_IMAGE(ie), IE_SZFNAME)
+ if (IE_IM(ie) != NULL && IE_IM(ie) != IE_DS(ie))
+ iferr (call imunmap (IE_IM(ie)))
+ ;
+ if (IE_MW(ie) != NULL)
+ call mw_close (IE_MW(ie))
+ IE_IM(ie) = im
+ if (IE_LOGFD(ie) != NULL) {
+ call fprintf (IE_LOGFD(ie), "# [%d] %s - %s\n")
+ call pargi (IE_INDEX(ie))
+ call pargstr (IE_IMNAME(ie))
+ call pargstr (IM_TITLE(IE_IM(ie)))
+ }
+ }
+ }
+
+ call ie_mwinit (ie)
+
+ call sfree (sp)
+ return (IE_IM(ie))
+end
+
+
+# IE_GIMAGE1 -- Convert input image section name to a 2D physical image section.
+
+procedure ie_gimage1 (im, input, output, maxchar)
+
+pointer im #I IMIO pointer
+char input[ARB] #I Input image name
+char output[maxchar] #O Output image name
+int maxchar #I Maximum characters in output name.
+
+int i, fd
+pointer sp, section, lv, pv1, pv2
+
+int stropen(), strlen()
+bool streq()
+
+begin
+ call smark (sp)
+ call salloc (section, SZ_FNAME, TY_CHAR)
+ call salloc (lv, IM_MAXDIM, TY_LONG)
+ call salloc (pv1, IM_MAXDIM, TY_LONG)
+ call salloc (pv2, IM_MAXDIM, TY_LONG)
+
+ # Get endpoint coordinates in original image.
+ call amovkl (long(1), Meml[lv], IM_MAXDIM)
+ call aclrl (Meml[pv1], IM_MAXDIM)
+ call imaplv (im, Meml[lv], Meml[pv1], 2)
+ call amovl (IM_LEN(im,1), Meml[lv], IM_NDIM(im))
+ call aclrl (Meml[pv2], IM_MAXDIM)
+ call imaplv (im, Meml[lv], Meml[pv2], 2)
+
+ # Set image section.
+ fd = stropen (Memc[section], SZ_FNAME, NEW_FILE)
+ call fprintf (fd, "[")
+ do i = 1, IM_MAXDIM {
+ if (Meml[pv1+i-1] != Meml[pv2+i-1])
+ call fprintf (fd, "*")
+ else if (Meml[pv1+i-1] != 0) {
+ call fprintf (fd, "%d")
+ call pargi (Meml[pv1+i-1])
+ } else
+ break
+ call fprintf (fd, ",")
+ }
+ call close (fd)
+ i = strlen (Memc[section])
+ Memc[section+i-1] = ']'
+
+ if (streq ("[*,*]", Memc[section]))
+ Memc[section] = EOS
+
+ # Strip existing image section and add new section.
+ call imgimage (input, output, maxchar)
+ call strcat (Memc[section], output, maxchar)
+
+# if (Memc[section] == EOS)
+# call imgimage (input, output, maxchar)
+# else
+# call strcpy (input, output, maxchar)
+
+ call sfree (sp)
+end