diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /pkg/images/tv/tvmark/t_tvmark.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'pkg/images/tv/tvmark/t_tvmark.x')
-rw-r--r-- | pkg/images/tv/tvmark/t_tvmark.x | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/pkg/images/tv/tvmark/t_tvmark.x b/pkg/images/tv/tvmark/t_tvmark.x new file mode 100644 index 00000000..d1485ae1 --- /dev/null +++ b/pkg/images/tv/tvmark/t_tvmark.x @@ -0,0 +1,267 @@ +include <fset.h> +include <gset.h> +include <imhdr.h> +include <imset.h> +include "tvmark.h" + +define TV_NLINES 128 + +# T_TVMARK -- Mark dots circles and squares on the image in the image display +# with optional numbering. + +procedure t_tvmark () + +pointer image # pointer to name of the image +pointer outimage # pointer to output image +pointer coords # pointer to coordinate file +pointer deletions # the name of the deletions file +pointer logfile # pointer to the log file +pointer font # pointer to the font +int autolog # automatically log commands +int interactive # interactive mode + +pointer sp, mk, im, iw, outim, cfilename, tmpname +int cl, dl, log, ft, frame, ltid, wcs_status, ndelete, bufsize + +bool clgetb() +int access(), btoi(), clgeti(), imstati(), mk_mark() +int imd_wcsver() +pointer immap(), open(), imd_mapframe(), iw_open() + +begin + # Set standard output to flush on newline. + call fseti (STDOUT, F_FLUSHNL, YES) + + # Allocate working space. + call smark (sp) + call salloc (image, SZ_FNAME, TY_CHAR) + call salloc (coords, SZ_FNAME, TY_CHAR) + call salloc (outimage, SZ_FNAME, TY_CHAR) + call salloc (deletions, SZ_FNAME, TY_CHAR) + call salloc (logfile, SZ_FNAME, TY_CHAR) + call salloc (font, SZ_FNAME, TY_CHAR) + call salloc (cfilename, SZ_FNAME, TY_CHAR) + call salloc (tmpname, SZ_FNAME, TY_CHAR) + + # Query server to get the WCS version, this also tells us whether + # we can use the all 16 supported frames. + if (imd_wcsver() == 0) + call clputi ("tvmark.frame.p_max", 4) + else + call clputi ("tvmark.frame.p_max", 16) + + frame = clgeti ("frame") + call clgstr ("coords", Memc[coords], SZ_FNAME) + call clgstr ("outimage", Memc[outimage], SZ_FNAME) + call clgstr ("deletions", Memc[deletions], SZ_FNAME) + call clgstr ("logfile", Memc[logfile], SZ_FNAME) + call clgstr ("font", Memc[font], SZ_FNAME) + call clgstr ("commands.p_filename", Memc[cfilename], SZ_FNAME) + autolog = btoi (clgetb ("autolog")) + interactive = btoi (clgetb ("interactive")) + + # Fetch the marking parameters. + call mk_gpars (mk) + + # Open the frame as an image. + im = imd_mapframe (frame, READ_WRITE, YES) + bufsize = max (imstati (im, IM_BUFSIZE), TV_NLINES * + int (IM_LEN(im,1)) * SZ_SHORT) + call imseti (im, IM_BUFSIZE, bufsize) + iw = iw_open (im, frame, Memc[image], SZ_FNAME, wcs_status) + call mk_sets (mk, IMAGE, Memc[image]) + call mk_seti (mk, FRAME, frame) + + # Open the coordinate file. + if (Memc[coords] != EOS) { + if ((interactive == NO) && (Memc[cfilename] == EOS)) { + cl = open (Memc[coords], READ_ONLY, TEXT_FILE) + dl = NULL + } else { + if (access (Memc[coords], READ_WRITE, TEXT_FILE) == YES) + cl = open (Memc[coords], READ_WRITE, TEXT_FILE) + else if (access (Memc[coords], READ_ONLY, TEXT_FILE) == YES) { + cl = open (Memc[coords], READ_ONLY, TEXT_FILE) + call printf ("Warning: File %s is read only.\n") + call pargstr (Memc[coords]) + } else { + cl = open (Memc[coords], NEW_FILE, TEXT_FILE) + call close (cl) + cl = open (Memc[coords], READ_WRITE, TEXT_FILE) + } + call sprintf (Memc[tmpname], SZ_FNAME, "%s.%s") + call pargstr (Memc[coords]) + if (Memc[deletions] == EOS) + call pargstr ("del") + else + call pargstr (Memc[deletions]) + dl = open (Memc[tmpname], NEW_FILE, TEXT_FILE) + call close (dl) + dl = open (Memc[tmpname], READ_WRITE, TEXT_FILE) + } + } else { + cl = NULL + dl = NULL + } + call mk_sets (mk, COORDS, Memc[coords]) + call mk_sets (mk, DELETIONS, Memc[deletions]) + + # Save the output mage name + call mk_sets (mk, OUTIMAGE, Memc[outimage]) + + # Open the font file. + #if (Memc[font] != EOS) + #ft = open (Memc[font], READ_ONLY, TEXT_FILE) + #else + ft = NULL + call mk_sets (mk, FONT, Memc[font]) + + # Mark the image frame. + if (interactive == NO) { + if (Memc[cfilename] != EOS) + ndelete = mk_mark (mk, im, iw, cl, dl, NULL, ft, autolog, NO) + + else { + + # Open the output image. + if (Memc[outimage] != EOS) + outim = immap (Memc[outimage], NEW_COPY, im) + else + outim = NULL + + # Do the marking. + ltid = 0 + if (cl != NULL) + call mk_bmark (mk, im, iw, cl, ltid, ft) + + # Copy / close image. + if (outim != NULL) { + call mk_imcopy (im, outim) + call imunmap (outim) + } + + ndelete = 0 + } + + } else { + + # Open the log file. + if (Memc[logfile] != EOS) + log = open (Memc[logfile], NEW_FILE, TEXT_FILE) + else + log = NULL + call mk_sets (mk, LOGFILE, Memc[logfile]) + call mk_seti (mk, AUTOLOG, autolog) + + ndelete = mk_mark (mk, im, iw, cl, dl, log, ft, autolog, YES) + + if (log != NULL) + call close (log) + } + + # Close up the file lists and free memory. + call iw_close (iw) + call imunmap (im) + if (ft != NULL) + call close (ft) + if (ndelete > 0) { + call mk_remove (Memc[coords], Memc[tmpname], cl, dl, ndelete) + if (Memc[deletions] == EOS) + call delete (Memc[tmpname]) + } else { + if (dl != NULL) { + call close (dl) + call delete (Memc[tmpname]) + } + if (cl != NULL) + call close (cl) + } + + # Free immark structure. + call mkfree (mk) + + call sfree (sp) +end + + +# MK_IMCOPY -- Make a snap of the frame buffer. + +procedure mk_imcopy (in, out) + +pointer in # pointer to the input image +pointer out # pointe to the output image + +int i, ncols, nlines +pointer sp, vin, vout, inbuf, outbuf +pointer imgnls(), impnls() +errchk imgnls(), impnls() + +begin + call smark (sp) + call salloc (vin, IM_MAXDIM, TY_LONG) + call salloc (vout, IM_MAXDIM, TY_LONG) + + ncols = IM_LEN(in, 1) + nlines = IM_LEN(in, 2) + call amovkl (long(1), Meml[vin], IM_MAXDIM) + call amovkl (long(1), Meml[vout], IM_MAXDIM) + + do i = 1, nlines { + if (impnls (out, outbuf, Meml[vout]) == EOF) + call error (0, "Error writing output image.\n") + if (imgnls (in, inbuf, Meml[vin]) == EOF) + call error (0, "Error reading frame buffer.\n") + call amovs (Mems[inbuf], Mems[outbuf], ncols) + } + + call imflush (out) + call sfree (sp) +end + + +# MK_IMSECTION -- Restore a section of an image to an image of the same +# size. + +procedure mk_imsection (mk, in, out, x1, x2, y1, y2) + +pointer mk # pointer to the mark structure +pointer in # input image +pointer out # output image +int x1, x2 # column limits +int y1, y2 # line limits + +short value +int i, ix1, ix2, iy1, iy2, ncols, nlines, mk_stati() +pointer ibuf, obuf +pointer imps2s(), imgs2s() + +begin + ncols = IM_LEN(out,1) + nlines = IM_LEN(out,2) + + ix1 = min (x1, x2) + ix2 = max (x1, x2) + ix1 = max (1, min (ncols, ix1)) + ix2 = min (ncols, max (1, ix2)) + + iy1 = min (y1, y2) + iy2 = max (y1, y2) + iy1 = max (1, min (ncols, iy1)) + iy2 = min (ncols, max (1, iy2)) + + if (in == NULL) { + value = mk_stati (mk, GRAYLEVEL) + do i = iy1, iy2 { + obuf = imps2s (out, ix1, ix2, i, i) + call amovks (value, Mems[obuf], ix2 - ix1 + 1) + } + } else { + do i = iy1, iy2 { + obuf = imps2s (out, ix1, ix2, i, i) + ibuf = imgs2s (in, ix1, ix2, i, i) + call amovs (Mems[ibuf], Mems[obuf], ix2 - ix1 + 1) + } + } + + call imflush (out) +end |