Image i/o. Coded May 1983, D. Tody. This initial implementation of IMIO, described in the ".hlp" design file, provides most of the functionality of the IMIO interface, but is not fully optimized internally. Features include: (1) 7 disk datatypes (ushort, silrdx). (2) 6 in-core datatypes (the standard silrdx). (3) Images of up to 7 dimensions are supported internally, though only images of up to 3 dimensions are currently supported in the interface. (4) Fully automatic multidimensional buffer allocation, resizing, and deallocation. (5) Arbitrary number of input buffers, allocated in a round robin fashion, need not be the same size or dimension. (5) Fully automatic type conversion. (6) General image sections, coordinate flip, and subsampling. (7) Both "compressed" and "block aligned" storage modes are supported, with IMIO automatically selecting the optimal choice during image creation. The device blocksize is a runtime variable. Planned future improvements: (1) Boundary extension. (3) Optimization to the get/put line procedures to work directly out of the FIO buffers when possible. (3) Addition of the get/put pixel procedures. (4) The image header is currently a simple binary file (structure). Only one image header structure per header file is permitted. Will be modified to use database facilities, and to permit embedded image headers. (5) Support for the unsigned byte disk datatype. FV NOTES: I've made the following bug fixes: In imioff: The setting of IM_PHYSDIM was taken outside the loop called when IM_NDIM was zero. There is was no way to set IM_PHYSDIM in the programmer interface. In imhdr.h: The offset to the user area IMU was changed from 603 to 613. This was a typo? In impnln: The coerce statement is wrong since imgobf calls coerce to the appropriate data type. In impnln: There was a typo which did not set ve. ------------------------ Review image interface. Device namining convention, use of explicit pathnames. File read/write permissions required. Why didn't imdopen work. Remove imdmap.x from system library, put in libim.a. Nov 84 Optimized line at a time i/o. Added capability to reference directly into the FIO buffer. This greatly improved the efficiency of simple image operations (no section, type conversion, etc.), without reducing the generality of the interface. --------------------------------------------------------------------------- IMIO Modifications, April 1985 1. Boundary Extension types: constant, nearest, reflect, wrap parameters: nbndrypix, tybndry, bndrypixval 2. Database Access New fields may be added to an image with IMADD. The value of an existing field is set with one of the IMPUT procedures; automatic type conversion will be performed if necessary and permissible. The value of an existing field is fetched with an IMGET procedure. The image database interface is both forward and backward compatible, i.e., no changes are required to current programs and the same interface (ignoring minor semantic details) will be available when image headers are moved into DBIO. Functions get,g - get the value of a field put,p - set the value of a field add,a - add a new field to a database acc - determine if the named field exists del - delete a field gftype - get field datatype gfn - get field name (matching a template) Procedures value = imget[bcsilrdx] (im, "field") imgstr (im, "field", outstr, maxch) imput[bcsilrdx] (im, "field", value) impstr (im, "field", value) imadd[bcsilrdx] (im, "field", def_value) imastr (im, "field", def_value) imaddf (im, "field", "datatype") y/n = imaccf (im, "field") imdelf (im, "field") type = imgftype (im, "field") list = imofnl[us] (im, template) nchars/EOF = imgnfn (list, outstr, maxch) imcfnl (list) The database interface may be used to access any field of the image header, including the following standard fields. Note that the nomenclature has been changed slightly to make it more consistent with FITS. Additional standard fields will be defined in the future. keyword type description i_naxis i number of axes (dimensionality) i_naxis[1-7] l length of an axis ("i_naxis1", etc.) i_pixtype i pixel datatype (SPP integer code) i_minpixval r minimum pixel value i_maxpixval r maximum pixel value i_ctime l time of image creation i_mtime l time of last modify i_limtime l time when limits (minmax) were last updated i_title s title string The following additional field names are recognized, but may disappear in the future: i_history s history record (a string buffer at present) i_pixfile s pathname of the pixel storage file The names of the standard fields share an "i_" prefix to reduce the possibility of collisions with data dependent keywords, to identify the standard fields in sorted listings, to allow use of pattern matching to discriminate between the standard fields and user fields, and so on. The use of the "i_" prefix is made optional for the convenience of the interactive user, but the full name should always be used in compiled programs. 3. Subfile Management (not implemented) A subfile B of file A is a file which is logically subordinate to A but which is physically a separate file to the host operating system. A subfile need not reside in the same directory as the main file. FIO shall provide support for subfiles as an abstract datatype. For each ordinary file there shall optionally be zero or one subfile index files with the same root name as the main file but with the extension .zsf. The index file, if present, shall list the subfiles of the main file. The operations supported by FIO for subfiles shall include the following: add a subfile to index and return pathname delete a subfile from index and return pathname get the pathname of a subfile delete both index entry and physical file delete a file and all subfiles It is important that FIO maintain the mapping of a subfile name to a physical file name to permit moves, copies, renames, etc. of files and their subfiles. Having to open the index file to get the pathname of a subfile is however inefficient. To achieve both flexibility and efficiency the system packages IMIO and DBIO will cache the names of subfiles to eliminate most accesses to the index files. add a subfile: add subfile to the index cache pathname open subfile: repeat { open subfile using cached pathname if (file cannot be opened) { call fio to get the pathname of the subfile if (different from cached pathname) { update cached pathname next } else error: cannot open file } else { read file header and verify that this is our subfile if (not our subfile) { close file call fio to get the pathname of the subfile if (different from cached pathname) { update cached pathname next } else error: not our subfile } else break # success } }