aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/imutil/src/t_minmax.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /pkg/images/imutil/src/t_minmax.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'pkg/images/imutil/src/t_minmax.x')
-rw-r--r--pkg/images/imutil/src/t_minmax.x192
1 files changed, 192 insertions, 0 deletions
diff --git a/pkg/images/imutil/src/t_minmax.x b/pkg/images/imutil/src/t_minmax.x
new file mode 100644
index 00000000..03dff18c
--- /dev/null
+++ b/pkg/images/imutil/src/t_minmax.x
@@ -0,0 +1,192 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <error.h>
+include <imhdr.h>
+include <imset.h>
+
+# MINMAX -- Update the minimum and maximum pixel values of an image. This is
+# done only if the values are absent or invalid, unless the force flag is set.
+# The header values are not updated when computing the min/max of an image
+# section unless the force flag is set. The values are printed on the standard
+# output as they are computed, if the verbose option is selected.
+
+procedure t_minmax()
+
+pointer images # image name template
+bool force # force recomputation of values
+bool update # update values in image header
+bool verbose # print values as they are computed
+
+bool section
+int list, pixtype
+long vmin[IM_MAXDIM], vmax[IM_MAXDIM]
+pointer im, sp, pixmin, pixmax, imname, imsect
+double minval, maxval, iminval, imaxval
+
+bool clgetb()
+long clktime()
+int imtopen(), imtgetim()
+pointer immap()
+define tryagain_ 91
+
+begin
+ call smark (sp)
+ call salloc (images, SZ_LINE, TY_CHAR)
+ call salloc (imname, SZ_FNAME, TY_CHAR)
+ call salloc (imsect, SZ_FNAME, TY_CHAR)
+ call salloc (pixmin, SZ_FNAME, TY_CHAR)
+ call salloc (pixmax, SZ_FNAME, TY_CHAR)
+
+ # Get list of input images.
+
+ call clgstr ("images", Memc[images], SZ_LINE)
+ list = imtopen (Memc[images])
+
+ # Get switches.
+
+ force = clgetb ("force")
+ update = clgetb ("update")
+ verbose = clgetb ("verbose")
+
+ # Process each image in the list.
+
+ while (imtgetim (list, Memc[imname], SZ_FNAME) != EOF) {
+ call imgsection (Memc[imname], Memc[imsect], SZ_FNAME)
+ section = (Memc[imsect] != EOS)
+
+ call strcpy ("", Memc[pixmin], SZ_FNAME)
+ call strcpy ("", Memc[pixmax], SZ_FNAME)
+
+ if (update) {
+
+ iferr (im = immap (Memc[imname], READ_WRITE, 0))
+ goto tryagain_
+
+ pixtype = IM_PIXTYPE(im)
+ if (force || (IM_LIMTIME(im) < IM_MTIME(im))) {
+ if (IM_NDIM(im) > 0) {
+ call im_vminmax (im, minval, maxval, iminval, imaxval,
+ vmin, vmax)
+ call mkoutstr (vmin, IM_NDIM(im), Memc[pixmin],
+ SZ_FNAME)
+ call mkoutstr (vmax, IM_NDIM(im), Memc[pixmax],
+ SZ_FNAME)
+ } else {
+ minval = INDEFD
+ maxval = INDEFD
+ Memc[pixmin] = EOS
+ Memc[pixmax] = EOS
+ }
+ if (! section) {
+ if (IS_INDEFD(minval))
+ IM_MIN(im) = INDEFR
+ else
+ IM_MIN(im) = minval
+ if (IS_INDEFD(maxval))
+ IM_MAX(im) = INDEFR
+ else
+ IM_MAX(im) = maxval
+ IM_LIMTIME(im) = clktime (long(0))
+ call imseti (im, IM_WHEADER, YES)
+ }
+ } else {
+ minval = IM_MIN(im)
+ maxval = IM_MAX(im)
+ }
+
+ call imunmap (im)
+
+ } else {
+tryagain_ iferr (im = immap (Memc[imname], READ_ONLY, 0)) {
+ call erract (EA_WARN)
+ next
+ } else {
+ pixtype = IM_PIXTYPE(im)
+ if (force || IM_LIMTIME(im) < IM_MTIME(im)) {
+ if (IM_NDIM(im) > 0) {
+ call im_vminmax (im, minval, maxval, iminval,
+ imaxval, vmin, vmax)
+ call mkoutstr (vmin, IM_NDIM(im), Memc[pixmin],
+ SZ_FNAME)
+ call mkoutstr (vmax, IM_NDIM(im), Memc[pixmax],
+ SZ_FNAME)
+ } else {
+ minval = INDEFD
+ maxval = INDEFD
+ Memc[pixmin] = EOS
+ Memc[pixmax] = EOS
+ }
+ } else {
+ minval = IM_MIN(im)
+ maxval = IM_MAX(im)
+ }
+ call imunmap (im)
+ }
+ }
+
+ # Make the section strings.
+
+ if (verbose) {
+ if (pixtype == TY_COMPLEX) {
+ call printf (" %s %s %z %s %z\n")
+ call pargstr (Memc[imname])
+ call pargstr (Memc[pixmin])
+ call pargx (complex (minval, iminval))
+ call pargstr (Memc[pixmax])
+ call pargx (complex (maxval, imaxval))
+ call flush (STDOUT)
+ } else {
+ call printf (" %s %s %g %s %g\n")
+ call pargstr (Memc[imname])
+ call pargstr (Memc[pixmin])
+ call pargd (minval)
+ call pargstr (Memc[pixmax])
+ call pargd (maxval)
+ call flush (STDOUT)
+ }
+ }
+ }
+
+ # Return the computed values of the last image examined as CL
+ # parameters.
+
+ call clputd ("minval", minval)
+ call clputd ("maxval", maxval)
+ call clputd ("iminval", iminval)
+ call clputd ("imaxval", imaxval)
+ call clpstr ("minpix", Memc[pixmin])
+ call clpstr ("maxpix", Memc[pixmax])
+
+ call sfree (sp)
+end
+
+
+# MKOUTSTR -- Encode the output string.
+
+procedure mkoutstr (v, ndim, outstr, maxch)
+
+long v[ARB] # imio v vector
+int ndim # number of dimensions
+char outstr[ARB] # output string
+int maxch # maximum length of string
+
+int i, ip, nchars
+int ltoc()
+
+begin
+ # Encode opening brackett.
+ outstr[1] = '['
+
+ # Encode v vector values.
+ ip = 2
+ do i = 1, ndim {
+ nchars = ltoc (v[i], outstr[ip], maxch)
+ ip = ip + nchars
+ outstr[ip] = ','
+ ip = ip + 1
+ }
+
+ # Encode closing bracketts and EOS.
+ outstr[ip-1] = ']'
+ outstr[ip] = EOS
+end