diff options
Diffstat (limited to 'noao/mtlocal/r2df/r2dfrpix.x')
-rw-r--r-- | noao/mtlocal/r2df/r2dfrpix.x | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/noao/mtlocal/r2df/r2dfrpix.x b/noao/mtlocal/r2df/r2dfrpix.x new file mode 100644 index 00000000..946c253b --- /dev/null +++ b/noao/mtlocal/r2df/r2dfrpix.x @@ -0,0 +1,126 @@ +include <mii.h> +include <mach.h> +include <fset.h> + +# R2DFIN_PIXEL and RPIXEL -- Read pixel data with record buffering +# and data type conversion. The input data must meet the MII standard +# except for possibly having the least significant byte first. +# +# Read data in records of len_record and convert to the specified IRAF +# data type. Successive calls of <r2dfrpix> returns the next npix pixels. +# Read_pixels returns EOF or the number of pixels converted. +# <r2dfin_pixel> must be called before <r2dfrpix>. +# +# Error conditions are: +# 1. A short input record +# 2. Error in converting the pixels by miiup. +# +# This routine is based on the MII unpack routine which is machine dependent. +# The bitpix must correspond to an MII type. If the lsbf (least significant +# byte first) flag is YES then the pixels do not satisfy the MII standard. +# In this case the bytes are first swapped into most significant byte first +# before the MII unpack routine is called. +# +# This version has been modified for the 2D-FRUTTI format in that byte data +# is also swapped if lsbf = YES and a new record is read if only a +# partial line of data is in the buffer. + +int procedure r2dfin_pixel (npix_record, bitpix, spp_type) + +long npix_record # Number of pixels per input record +int bitpix # Bits per pixel (must correspond to an MII type) +int spp_type # SPP data type to be returned + +# entry r2dfrpix (fd, buffer, npix) + +int r2dfrpix +int fd # Input file descriptor +char buffer[1] # Output buffer +int npix # Number of pixels to read + +int ty_mii, ty_spp +int npix_rec, nch_rec, sz_rec, nchars, len_mii +int i, n, ip, op +int swap +pointer mii, spp + +int read(), sizeof(), miilen() +errchk miilen, mfree, malloc, read, miiup +data mii/NULL/, spp/NULL/ +include "r2df.com" + +begin + swap = lsbf + ty_mii = bitpix + ty_spp = spp_type + npix_rec = npix_record + nch_rec = npix_rec * sizeof (ty_spp) + + len_mii = miilen (npix_rec, ty_mii) + sz_rec = len_mii * SZ_INT + + if (mii != NULL) + call mfree (mii, TY_INT) + call malloc (mii, len_mii, TY_INT) + + if (spp != NULL) + call mfree (spp, TY_CHAR) + call malloc (spp, nch_rec, TY_CHAR) + + ip = nch_rec + return (OK) + +entry r2dfrpix (fd, buffer, npix) + + nchars = npix * sizeof (ty_spp) + op = 0 + + repeat { + # If data is exhausted read the next record. + + if (ip + nchars > nch_rec) { # Modified for 2D-FRUTTI data + + # flush the tape buffers, only needed to handle + # camera tapes created with 7-to-9 conversions + + if (tape == YES) + call fseti (fd, F_CANCEL, YES) + + # Read a data record. + i = read (fd, Memi[mii], sz_rec) + if (i == EOF) + return (EOF) + else if ( i < sz_rec - SZ_INT + 1) + call error (0, "Short record encountered") + + # Convert from MII format to SPP format + if (swap == YES) + switch (ty_mii) { + + # Modified for 2D-FRUTTI data # + case MII_BYTE: # + call bswap2 (Memi[mii], 1, Memi[mii], 1, # + sz_rec * SZB_CHAR) # + + case MII_SHORT: + call bswap2 (Memi[mii], 1, Memi[mii], 1, + sz_rec * SZB_CHAR) + case MII_LONG: + call bswap4 (Memi[mii], 1, Memi[mii], 1, + sz_rec * SZB_CHAR) + } + + call miiupk (Memi[mii], Memc[spp], npix_rec, ty_mii, ty_spp) + + ip = 0 + } + + n = min (nch_rec - ip, nchars - op) + call amovc (Memc[spp + ip], buffer[1 + op], n) + ip = ip + n + op = op + n + + } until (op == nchars) + + return (npix) +end |