diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/pmio/pmrio.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'sys/pmio/pmrio.x')
-rw-r--r-- | sys/pmio/pmrio.x | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/sys/pmio/pmrio.x b/sys/pmio/pmrio.x new file mode 100644 index 00000000..278c7f30 --- /dev/null +++ b/sys/pmio/pmrio.x @@ -0,0 +1,128 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <pmset.h> +include <plio.h> + +.help PMRIO +.nf --------------------------------------------------------------------------- +PMRIO -- A small package used to provide a means for efficient random +sampling (at the pixel level) of large PMIO masks. In other words, if we have +a large mask and want to determine the values of successive mask pixels at +random locations in the mask, this package provides a more efficient means +for doing so than calling a routine such as PM_GLPI. The mask must already +exist; means are not provided within this package for creating or editing +masks, only for reading them. + + pmr = pmr_open (pm, plane, buflimit) + pmr_setrect (pmr, x1,y1, x2,y2) + mval = pmr_getpix (pmr, x, y) + pmr_close (pmr) + +PMR_OPEN opens the indicated 2 dimensional plane of the N dimensional mask PM. +Buffer space used to provide an efficient means of randomly sampling the mask +will be kept to within approximately BUFLIMIT integer units of storage (the +internal table used to sample the mask is type integer, so BUFLIMIT is the +approximate number of entries in the table). Random sampling of the mask is +provided by the integer function PMR_GETPIX, which returns the mask value at +the point [i,j] within the specified plane. PMR_SETRECT may be called before +calling PMR_GETPIX to set the clipping rectangle, which defaults to the +boundaries of the mask. If a PMR_GETPIX call references outside the clipping +region, ERR will be returned as the mask value (normal mask values are >= 0). +Use of a clipping region other than the boundaries of the full mask can avoid +the need for redundant clipping operations in the client. PMR_CLOSE should +be called to free the PMRIO table space (which can be extensive) when no longer +needed. + +This package is a front end to the PLRIO package in PLIO, which does all the +real work. +.endhelp ---------------------------------------------------------------------- + +# The following definitions must agree with those in plio$plrio.x. +define PMR_PL Memi[$1] # backpointer to PLIO descriptor +define PMR_PLANE Memi[$1+10+($2)-1] # defines 2D plane in ND mask + + +# PMR_OPEN -- Open a PMIO mask for random pixel access. Provides efficient +# random pixel level access to any size mask. This is a 2-dimensional +# operator, but can be used to sample any 2-dim plane of an N-dim mask. + +pointer procedure pmr_open (pl, plane, buflimit) + +pointer pl #I PMIO/PLIO descriptor +int plane[ARB] #I 2-dim plane to be accessed +int buflimit #I approximate table size, or 0 if don't care + +pointer plr_open() +include "pmio.com" + +begin + if (PM_MAPXY(pl) == YES) { + call imaplv (PM_REFIM(pl), plane, v1, PM_MAXDIM) + return (plr_open (pl, v1, buflimit)) + } else + return (plr_open (pl, plane, buflimit)) +end + + +# PMR_GETPIX -- Return the value of the given mask pixel, identified by the +# 2-dim coordinates of the pixel relative to the plane of the N-dim mask +# specified at open time. + +int procedure pmr_getpix (pmr, i, j) + +pointer pmr #I PMR descriptor +int i, j #I plane-relative coordinates of pixel + +pointer pl +int plr_getpix() +include "pmio.com" + +begin + pl = PMR_PL(pmr) + if (PM_MAPXY(pl) == YES) { + PMR_PLANE(pmr,1) = i + PMR_PLANE(pmr,2) = j + call imaplv (PM_REFIM(pl), PMR_PLANE(pmr,1), v1, PM_MAXDIM) + return (plr_getpix (pmr, v1[1], v1[2])) + } else + return (plr_getpix (pmr, i, j)) +end + + +# PMR_SETRECT -- Set the clipping region for PMR_GETPIX. + +procedure pmr_setrect (pmr, x1,y1, x2,y2) + +pointer pmr #I PMR descriptor +int x1,y1 #I lower left corner of region +int x2,y2 #I upper right corner of region + +pointer pl +include "pmio.com" + +begin + pl = PMR_PL(pmr) + if (PM_MAPXY(pl) == YES) { + call amovi (PMR_PLANE(pmr,1), v1, PM_MAXDIM) + v1[1] = x1; v1[2] = y1 + call imaplv (PM_REFIM(pl), v1, v2, PM_MAXDIM) + + call amovi (PMR_PLANE(pmr,1), v3, PM_MAXDIM) + v3[1] = x2; v3[2] = y2 + call imaplv (PM_REFIM(pl), v3, v4, PM_MAXDIM) + + call plr_setrect (pmr, v2[1],v2[2], v4[1],v4[2]) + } else + call plr_setrect (pmr, x1,y1, x2,y2) +end + + +# PMR_CLOSE -- Free a PMRIO descriptor. + +procedure pmr_close (pmr) + +pointer pmr #I PMR descriptor + +begin + call plr_close (pmr) +end |