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 /pkg/proto/vol/src/i2sun/cnvimage.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'pkg/proto/vol/src/i2sun/cnvimage.x')
-rw-r--r-- | pkg/proto/vol/src/i2sun/cnvimage.x | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/pkg/proto/vol/src/i2sun/cnvimage.x b/pkg/proto/vol/src/i2sun/cnvimage.x new file mode 100644 index 00000000..59bd4655 --- /dev/null +++ b/pkg/proto/vol/src/i2sun/cnvimage.x @@ -0,0 +1,142 @@ +include <imhdr.h> +include <mach.h> +include "i2sun.h" + + +# CNV_IMAGE -- Read each line of the input image, apply ztransform, convert +# to rasterfile form, and write to rasterfile. + +procedure cnv_image (im, slice, tr, uptr, rfd) +pointer im # input image +int slice # current slice if n>2 image +pointer tr # spatial & greyscale transform structure +pointer uptr # pointer to user-specified transfer lut +pointer rfd # output rasterfile + +real z1, z2, rz1, rz2 +int ztrans, row, xblk, yblk, ocols, olines +real px1, px2, py1, py2 # image coords in fractional image pixels +pointer sp, si, bufptr, out, rtemp, packed +short z1_s, z2_s, rz1_s, rz2_s +bool unitary_greyscale_transformation + +bool fp_equalr() +pointer siglns(), siglnr(), sigln_setup() +errchk siglns(), siglnr(), sigln_setup() + +begin + # Set up for scaled image input. + px1 = 1 + px2 = IM_LEN(im,COL) + py1 = 1 + py2 = IM_LEN(im,LINE) + ocols = TR_XE(tr) - TR_XS(tr) + 1 + olines = TR_YE(tr) - TR_YS(tr) + 1 + + # Round odd-numbered numbers of columns up due to restrictions on + # IRAF binary byte i/o (number of bytes of image data must match + # that specified in rasterfile header). + if (mod (ocols, 2) == 1) + ocols = ocols + 1 + + xblk = INDEFI + yblk = INDEFI + si = sigln_setup (im, px1,px2,ocols,xblk, py1,py2,olines,yblk, + TR_ORDER(tr)) + + # Type short pixels are treated as a special case to minimize vector + # operations for such images (which are common). If unity mapping is + # employed the data is simply copied, i.e., floor ceiling constraints + # are not applied. This is very fast and will produce a contoured + # image on the display which will be adequate for some applications. + + z1 = TR_Z1(tr) + z2 = TR_Z2(tr) + ztrans = TR_ZTRANS(tr) + rz1 = COLORSTART + rz2 = COLOREND + if (ztrans == Z_UNITARY) { + unitary_greyscale_transformation = true + } else if (ztrans == Z_LINEAR) { + unitary_greyscale_transformation = + ((fp_equalr(z1,rz1) && fp_equalr(z2,rz2)) || fp_equalr(z1,z2)) + } else + unitary_greyscale_transformation = false + + if (IM_PIXTYPE(im) == TY_SHORT && ztrans != Z_LOG) { + + call smark (sp) + call salloc (out, ocols, TY_SHORT) + call salloc (packed, ocols, TY_CHAR) + z1_s = z1; z2_s = z2 + + for (row=olines; row >= 1; row=row-1) { + bufptr = siglns (si, row, TR_SLICEAXIS(tr), slice) + + if (unitary_greyscale_transformation) { + call amovs (Mems[bufptr], Mems[out], ocols) + } else if (ztrans == Z_USER) { + rz1_s = U_Z1; rz2_s = U_Z2 + call amaps (Mems[bufptr], Mems[out], ocols, z1_s, z2_s, + rz1_s, rz2_s) + call aluts (Mems[out], Mems[out], ocols, Mems[uptr]) + } else { + rz1_s = rz1; rz2_s = rz2 + call amaps (Mems[bufptr], Mems[out], ocols, z1_s, z2_s, + rz1_s, rz2_s) + } + + # Pack to unsigned byte and write to file. + call achtsc (Mems[out], Memc[packed], ocols) + call chrpak (Memc[packed], 1, Memc[packed], 1, ocols) + call write (rfd, Memc[packed], ocols / SZB_CHAR) + } + call sfree (sp) + + } else if (ztrans == Z_USER) { + call smark (sp) + call salloc (rtemp, ocols, TY_REAL) + call salloc (out, ocols, TY_SHORT) + call salloc (packed, ocols, TY_CHAR) + + for (row=olines; row >= 1; row=row-1) { + bufptr = siglnr (si, row, TR_SLICEAXIS(tr), slice) + call amapr (Memr[bufptr], Memr[rtemp], ocols, z1, z2, + real(U_Z1), real(U_Z2)) + call achtrs (Memr[rtemp], Mems[out], ocols) + call aluts (Mems[out], Mems[out], ocols, Mems[uptr]) + call achtsc (Mems[out], Memc[packed], ocols) + call chrpak (Memc[packed], 1, Memc[packed], 1, ocols) + call write (rfd, Memc[packed], ocols / SZB_CHAR) + } + call sfree (sp) + + } else { + call smark (sp) + call salloc (rtemp, ocols, TY_REAL) + call salloc (packed, ocols, TY_CHAR) + + for (row=olines; row >= 1; row=row-1) { + bufptr = siglnr (si, row, TR_SLICEAXIS(tr), slice) + + if (unitary_greyscale_transformation) { + call amovr (Memr[bufptr], Memr[rtemp], ocols) + } else if (ztrans == Z_LOG) { + call amapr (Memr[bufptr], Memr[rtemp], ocols, + z1, z2, 1.0, 10.0 ** MAXLOG) + call alogr (Memr[rtemp], Memr[rtemp], ocols) + call amapr (Memr[rtemp], Memr[rtemp], ocols, + 1.0, real(MAXLOG), rz1, rz2) + } else + call amapr (Memr[bufptr], Memr[rtemp], ocols, z1, z2, + rz1, rz2) + call achtrc (Memr[rtemp], Memc[packed], ocols) + call chrpak (Memc[packed], 1, Memc[packed], 1, ocols) + call write (rfd, Memc[packed], ocols / SZB_CHAR) + } + call sfree (sp) + } + + call sigln_free (si) +end + |