aboutsummaryrefslogtreecommitdiff
path: root/sys/imio/impmopen.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 /sys/imio/impmopen.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/imio/impmopen.x')
-rw-r--r--sys/imio/impmopen.x99
1 files changed, 99 insertions, 0 deletions
diff --git a/sys/imio/impmopen.x b/sys/imio/impmopen.x
new file mode 100644
index 00000000..bd8a564b
--- /dev/null
+++ b/sys/imio/impmopen.x
@@ -0,0 +1,99 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <syserr.h>
+include <error.h>
+include <pmset.h>
+include <imhdr.h>
+include <imio.h>
+
+# IM_PMOPEN -- Open an image mask. If the mask name is given is "BPM" (upper
+# case) the bad pixel list for the reference image is opened, if the mask name
+# is "EMPTY" an empty mask is opened, otherwise the mask name is taken to be
+# the name of the file in which the mask is stored. If there is no bad pixel
+# list for the image an empty mask is opened. If a more specialized mask is
+# needed it should be opened or generated via explicit calls to the PMIO
+# package.
+
+pointer procedure im_pmopen (mask, mode, title, maxch, ref_im)
+
+char mask[ARB] #I mask file name or "BPM"
+int mode #I mode and flag bits
+char title[maxch] #O mask title
+int maxch #I max chars out
+pointer ref_im #I reference image
+
+pointer sp, fname, pl, b_pl
+long axlen[PL_MAXDIM], v[PL_MAXDIM]
+int acmode, flags, naxes, depth
+
+bool streq()
+pointer pl_open(), pl_create()
+errchk syserr, pl_open, pl_create, pl_loadf, pl_loadim
+
+string s_empty "EMPTY" # the empty mask
+string s_bpl "BPM" # the reference image bad pixel list
+
+begin
+ call smark (sp)
+ call salloc (fname, SZ_FNAME, TY_CHAR)
+
+ acmode = PL_ACMODE(mode)
+ flags = PL_FLAGS(mode)
+
+ # Get mask name for the BPM for the given reference image.
+ if (streq (mask, s_bpl)) {
+ if (ref_im == NULL)
+ call syserr (SYS_IMPLNORI)
+ iferr (call imgstr (ref_im, s_bpl, Memc[fname], SZ_FNAME))
+ call strcpy (s_empty, Memc[fname], SZ_FNAME)
+ } else
+ call strcpy (mask, Memc[fname], SZ_FNAME)
+
+ pl = pl_open (NULL)
+
+ # Open the named mask.
+ if (acmode != NEW_IMAGE && acmode != NEW_COPY) {
+ if (streq (Memc[fname], s_empty)) {
+ if (ref_im == NULL) {
+ call pl_close (pl)
+ call syserr (SYS_IMPLNORI)
+ }
+ call pl_ssize (pl, IM_NPHYSDIM(ref_im), IM_SVLEN(ref_im,1), 1)
+ } else {
+ iferr (call pl_loadf (pl, Memc[fname], title, maxch)) {
+ call pl_close (pl)
+ pl = pl_open (NULL)
+ iferr (call pl_loadim (pl, Memc[fname], title, maxch)) {
+ call pl_close (pl)
+ call erract (EA_ERROR)
+ }
+ }
+ }
+
+ # Modify the mask according to the given flags, if any.
+ if (flags != 0) {
+ call pl_gsize (pl, naxes, axlen, depth)
+ call amovkl (1, v, PL_MAXDIM)
+
+ if (and (flags, BOOLEAN_MASK) != 0 && depth > 1) {
+ b_pl = pl_create (naxes, axlen, 1)
+
+ if (and (flags, INVERT_MASK) != 0) {
+ call pl_rop (pl, v, b_pl, v, axlen, PIX_SRC)
+ call amovkl (1, v, PL_MAXDIM)
+ call pl_rop (b_pl, v, b_pl, v, axlen, PIX_NOT(PIX_SRC))
+ } else {
+ call pl_rop (pl, v, b_pl, v, axlen, PIX_SRC)
+ }
+
+ call pl_close (pl)
+ pl = b_pl
+
+ } else if (and (flags, INVERT_MASK) != 0)
+ call pl_rop (pl, v, pl, v, axlen, PIX_NOT(PIX_SRC))
+ }
+ }
+
+ call sfree (sp)
+ return (pl)
+end