diff options
Diffstat (limited to 'pkg/images/imutil/src/t_minmax.x')
-rw-r--r-- | pkg/images/imutil/src/t_minmax.x | 192 |
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 |